3

この質問は、saga データが Azure Table Storage に永続化されている場合の、saga データへの同時アクセスに関するものです。また、Particular のドキュメントにある情報も参照しています: http://docs.particular.net/nservicebus/nservicebus-sagas-and-concurrency

ハンドラーを同時に実行している 1 つのサガ内で、サガ データへの変更は、"azure テーブル ストレージに変更をポストする最後の変更が優先される" シナリオで動作しているように見えることに気付きました。NSB を Azure Table Storage と組み合わせて Saga データの永続化レイヤーとして使用する場合、これは意図された動作ですか?

例:

  1. Saga Data の整数プロパティ、現在 = 5 と仮定
  2. このサガでは、5 つのコマンドが同じハンドラーの 5 つのインスタンスによって処理されます
  3. 各コマンド ハンドラーは、サガ データの整数プロパティをデクリメントします。
  4. サガ データの整数プロパティの最終値は、これらの 5 つのメッセージを処理した後、実際には 4 になる可能性があります。各メッセージがサガの新しいインスタンスによって処理された場合、異なるサーバー上にある可能性があり、それぞれが整数プロパティが 5 であることを示すサガ データのコピーを持っています。 、それを 4 にデクリメントし、ポスト バックアップします。今説明したのは非常に同時実行の例ですが、5 つのメッセージのいずれかが同時に処理された場合、整数が 0 より大きくなる可能性があります。サガ データの整数プロパティが 0 に達するのは、5 つのコマンドがたまたま実行されたときだけです。連続して。

また、Azure Table Storage は Optimistic Concurrency をサポートしているため、Raven を永続化テクノロジとして使用する場合に RavenDB で有効にするのと同じように、Table Storage でこの機能を使用できるようにすることは可能ですか?

これが不可能な場合、これを処理するための推奨されるアプローチは何ですか? 現在、複数のメッセージを同時に処理する可能性のある saga 内のハンドラーは、saga データを変更できないというパラダイムにサブスクライブしています。つまり、saga メッセージの調整は、saga データを使用するのではなく、saga の外部の手段を介して行われます。当初の意図どおりです。

4

2 に答える 2

1

特定のサポートで作業した後、上記の症状は NServiceBus.Azure の欠陥でした。この問題は、NServiceBus.Azure 5.3.11 および 6.2+ の Particular によってパッチが適用されています。5.3.11 に更新することで問題が解決したことを個人的に確認できます。

参考までに、この問題の明らかな兆候は、次の例外がスローされ、処理されないことです。

メッセージ Microsoft.WindowsAzure.Storage.StorageException の処理に失敗しました: 操作の予期しない応答コード: 0

例外の詳細は、「UpdateConditionNotSatisfied」を示します - オプティミスティック コンカレンシー チェックを参照します。

この問題を診断して解決してくれた Particular の Yves Goeleven と Sean Feldman に感謝します。

于 2015-02-25T16:15:07.600 に答える
0

azure saga ストレージ パーシスタは楽観的同時実行性を使用します。複数のメッセージが同時に到着した場合、最後に更新されたメッセージが例外をスローし、再試行してデータを再び正しくする必要があります。

これはバグのように聞こえますが、使用しているバージョンを共有できますか?

PS: 昨年、このhttps://github.com/Particular/NServiceBus.Azure/issues/124に非常によく似た問題を解決しました。これは NServiceBus.Azure 5.2 以降で解決されています。

于 2015-02-13T13:12:32.657 に答える