1

最初の私の具体的な質問

トピックに 3 人のサブスクライバーがいるとしますが、特定のサブスクライバーのみをターゲットにしたいとします。これはできますか?

私が達成しようとしていること

トピックをリッスンしているサブスクライバーはメッセージを処理します。これには、データベースへのアクセスが含まれる場合があります (データベースが一時的にダウンする場合があります)。問題が発生した場合は、後で再処理できるようにしたいと考えています。

後で処理するために Defer() を使用できることはわかっていますが、メッセージ ID を保存する必要があります。明らかに、データベースがダウンしている場合、そこに保存することはできません。そのため、永続化したい場合は、別のデータストアに保存する必要があります。

その「他のデータストア」がサービス バスの場合、サブスクライバーごとにトピックを作成する必要があり、管理が少し難しいようです。私の計画は、失敗したリクエストをトピックの配信不能キューに送信することです。スケジュールされたタスクが定期的に来て、各トピックの DLQ からメッセージを取得し、処理を試みます。再度失敗した場合は、メッセージを再送信して、メッセージ自体の一部である「AttemptedTries」カウンターを増やしたいと思います。関連するサブスクライバーのみをターゲットにして、問題のないトピックのサブスクライバーを処理する必要がないようにできればと思います (この機能を使用して同様のことを実行できない場合は、おそらくフィルターなどを追加できます)。

試行回数 >= maxattempts の後、プログラマーがメッセージをどう処理するかを決定できる普遍的な「墓場」(トピック固有ではない) にメッセージを送信します。

これはそれを処理する良い方法ですか?ASB にはこの機能が組み込まれていますか?

4

3 に答える 3

2

特定のサブスクライバーにメッセージを送信することはできませんが、特定のサブスクライバーがフィルター処理するヘッダー/値をメッセージにスタンプすることで、一種の「ターゲットにする」ことができます。

今あなたのシナリオに -メッセージングをストレージとして使用しないことを強くお勧めします. 空のキューはハッピー キューです。また、その目的で DLQ を使用しないことも間違いありません。指定された役割があり、そのために使用する必要があります。

メッセージの延期を検討することをお勧めします。アトミック操作 (ASB トランザクション) を使用すると、新しいメッセージを生成し、メッセージのシーケンス番号を処理したくない場合は、将来の処理のためにキューに入れることができます。これにより、追加のスケジュールされたタスクの必要性や、DLQ を処理する際の不要な複雑さも解消されます。

于 2017-01-10T18:32:26.293 に答える
1

ミックスに追加するには、私が発見したものを追加します。BrokeredMessage の「To」プロパティを介して、特定のサブスクライバーにアドレス指定できます。

サブスクライバーにはフィルターが必要です (これが自動化されない理由は不明です)。たとえば、CorrelationFilter を使用できます。

var filter = new CorrelationFilter {To="mySubscriber"};

または、私の場合、「私に直接宛てられたすべてのメッセージを送信するか、すべてのサブスクライバーに送信してください。SqlFilterを介してこれを達成しました。

 new SqlFilter($"sys.To IS NULL OR sys.To = '{_subscriptionName}'")

「To」は BrokeredMessage のプロパティであるため、「sys」の使用に注意してください。

于 2017-01-10T21:24:39.927 に答える