2017-01-24 10 views
0

私はAzure Service Bus Topicsをプロダクションアプリケーションで使用しています。私の理解では、システムは、発行されたときにサブスクリプション終了時に少なくとも1つのメッセージのコピーを保証します。Azureサービスバスのトピック:メッセージの重複が発生するのはなぜですか?

実際には、一般に1つのメッセージが公開に対応しています。いくつかの縮退したケースでは、私は倍数を見ます。たとえば、関連するサブスクリプションの〜20個のメッセージに対応する1個のパブリッシュ。現在、このサブスクリプションを使用しているものは何もありません。これがパブリッシングロジックだと私は信じています。

どのような状況でメッセージが広がっているのですか?ネットワーキングの妨げが原因かもしれないと思います。ほかに何か?

デフォルトの重複処理ロジックではこれを処理できないことに注意してください。あなたは、同じ身体と別個のメッセージIDを持つ複数のメッセージを持っています。私が理解しているのは、メッセージ「アイデンティティ」を確立するために使用されます。

EDIT: 私の出版ロジックはかなり単純で、次のようになります。

public void PublishSomeId(Guid someId, int eventDelayInMinutes, string componentName) 
     { 
      var topicClient = ServiceBusManager.GetTopicClient(); 

      var message = new BrokeredMessage(someId); 
      message.To = componentName; 
      message.ScheduledEnqueueTimeUtc = DateTime.UtcNow.AddMinutes(eventDelayInMinutes); 
      topicClient.Send(message); 
     } 
+0

詳細については、この質問に回答する必要があります。あなたの出版ロジックは何ですか?別のIDで同じペイロードを20回公開すると、そのイベントの20個の「コピー」が作成されます。あなたのトポロジはどのように見えますか?この情報がなければ、これは非常に推測です。 –

+0

実際の実装とよく似たコードサンプルを追加する質問を編集しました。逸話的に私はbody 'someId'で約20のメッセージを見る。ログの助けを借りて、私はこのメソッドが 'someId'で一度だけ呼び出されたことを知っています。 –

+0

確かに、何も幻想的ではありません。トピックの設定とそのトピックの下に潜んでいるものは何ですか? –

答えて

1

つの提案:

  1. あなたのパブリッシャがメッセージを複製していないことを確認します。 someIdの値を確認するには、PublishSomeIdにログステートメントを追加してください。私はこのメソッドが複数回呼び出される可能性があると考えています。それに加えて、重複ログが記録されていない場合は、重複検出を有効にすることができます。そのためには、someIdを仲介メッセージMessageIdに割り当てる必要があります。重複が生成されている期間は何かを確認できませんが、試してみることができます。

  2. #1が役に立たない場合は、トポロジ設定(エンティティ)が可能です。同じトピックに戻るファンのファンキーなことは何もないことを確認してください。

+0

私はこの問題を追跡するために次のステップを踏むことができるので、この回答を受け入れたとマークしました。どのような理由で重複が発生するのかを説明する追加の回答は高く評価されます。 –

+0

@ArxoClay複製のソースは見つかりましたか? –

+0

重複の原因が見つかりました。私はもっ​​とそこにいるかもしれないと思う。私たちが見つけた1つの情報源は次のようなものです:サブスクリプションでメッセージを処理している間にサブスクリプションを更新している場合、そのサブスクリプションから現在処理中のメッセージのロックに影響するようです。私たちはサブスクリプション(ポーリングシナリオ)にメッセージを「戻す」というこのパターンを持っているので、元のケースは「完了」できず、複製によってサブスクリプションにコードが置かれます。 –

関連する問題