私は、サービスバスのキューとトピックのロック期間と更新メカニズムを調べてきました。ただし、トピックサブスクリプションのロック期間が正確に何を意味するのかは明確ではありません。
例えば:
トピックGameScoreUpdateがあり、複数のサブスクライバーがある場合。
したがって、このトピックへのメッセージはすべてのサブスクライバーに配信されます。
1つのサブスクリプション「Subscription1」で、ロック期間が30秒の場合。しかし、メッセージ処理は完了していません。その後、ロックは期限切れになりますか?
この後どうなりますか?他のサブスクライバーには、このメッセージが既に配信されています。現在のサブスクライバーがメッセージを処理しています。
この場合のロック期間の重要性は何ですか?
各サブスクリプションを「受信ボックス」と考えてください。各サブスクライバーは1つを取得します。メッセージはすべてのサブスクライバーに送信されますが、実際には、一致基準があると仮定して、すべての「受信ボックス」に配置されるメッセージのクローンです。
特定のサブスクライバーがPeekLock
モードを使用して「受信ボックス」からのメッセージを処理しようとすると、メッセージは非表示としてマークされます。 LockDuration
時間以内にメッセージの処理に失敗した場合、メッセージは「受信トレイ」に再表示され、処理が再試行されます。 MaxDeliveryCount
の試行が尽きるまで。その場合、メッセージはデッドレターになります。
これは、競合する消費者にとって本当に必要です。つまりサブスクライバー(特定のサブスクリプション/「受信ボックス」を調べるプロセス)が、より多くのメッセージを処理するためにスケールアウトされたとき。
この場合のロック期間の重要性は何ですか?
LockDuration
は、現在の処理ノードがLockDuration
で定義された時間枠でメッセージを処理できるように、競合するコンシューマーからメッセージを見えないようにするようにキューに指示します(サブスクリプションは結局のところキューです)。ロックの更新メカニズムにより、現在処理中のメッセージのロックが拡張され、必要に応じてLockDuration
より長い処理時間が許可されます。覚えておくべき重要なことは、ロックの更新はnot成功することが保証されているということです。