Azureサービスバスのキューで長時間実行されているメッセージを処理しているときに、奇妙な動作が見られます。私たちはかなり大きなデータセットを処理するので、ロックを更新しています。このメッセージには通常、完了に約1時間かかります。このプロセスはうまく動作し、完了まで実行されます。 がUTCの深夜に実行されている場合を除きます。真夜中UTCにAzureサービスバスのキューメッセージのロックがUTCの深夜0時に有効になる
バンは、私たちのプロセスは例外をスロー:
Microsoft.ServiceBus.Messaging.MessageLockLostException:供給ロックが無効です。ロックの有効期限が切れているか、メッセージがすでにキューから削除されています。
私たちはこの夜の夜を再現することができ、深夜にプロセスを実行しないと、決して起こらない。
メッセージロック "ExpiresAtUtc"タイムスタンプの計算では、ある日から別の日に非常に上手く行き来することはできませんか?
---- UPDATE ----
助けるかもしれないいくつかのより多くの情報:
長時間実行されるプロセスはRenewLock
を呼び出すことによって、キューに再び見えるようになるからメッセージを保持します。この処理が深夜0時を過ぎると、メッセージがキューに表示され、処理が再開されます。メッセージはドロップされず、デッドレターキューには移動しません。ロックは単に期限切れとなり、メッセージは再びキューに表示され、プロセッサによってピックアップされ、プロセスが再開されます。プロセスがUTCの深夜の境界を越えない限り、正常に完了します。キューに
接続:
private QueueClient GetQueue<TMessage>() => QueueClient.CreateFromConnectionString(this.configSection.Value.ConnectionString, typeof(TMessage).Name, ReceiveMode.PeekLock);
エンキューメッセージ:
using (var brokeredMessage = new BrokeredMessage(message) {ContentType = "application/json"})
{
await GetQueue<TMessage>().SendAsync(brokeredMessage).ConfigureAwait(false);
}
デキューメッセージを
は、ここでは、コードのスニペットは、我々は、キューから/エンキュー/デキューを接続するために使用しているされています:
GetQueue<TMessage>().OnMessageAsync(
async msg =>
{
TMessage body = null;
try
{
body = msg.GetBody<TMessage>();
await handler.HandleMessageAsync(body, msg.RenewLockAsync).ConfigureAwait(false);
await msg.CompleteAsync().ConfigureAwait(false);
}
catch (Exception ex)
{
await msg.AbandonAsync().ConfigureAwait(false);
}
},
new OnMessageOptions
{
AutoComplete = false
}
);
以下は、Azureサービスバスのメトリクス - 成功したリクエストのスクリーンショットです。UTCの深夜(私はUTC + 1のタイムゾーンにありますので、私はどこにいるのですか)に、深夜の何かを示す方法を示します。は、 :
は、私たちの内部ログのスクリーンショットでは、処理がちょうど停止し、後に再び起動するだけ分を超える - ロックが期限切れになったとのメッセージが選択されますので、再びキューに表示されたときにプロセッサーによるアップ:
_メッセージロック "ExpiresAtUtc"タイムスタンプの計算では、ある日から別の日に渡って非常に上手く行き渡ることはありませんか?_そうは思わないでください。シンプルなレプロを分かち合うことができればいいですね。 –
こんにちは@SeanFeldman - 私はもう少し情報を追加しました。これは役に立ちますか? – codefrenzy
興味深い。チャートを見ると、2分間の切断があるようです。ロックの更新はクライアント操作であるため、クライアントがサーバーに接続できない場合はロックが失われ、メッセージは他のインスタンスで使用できるようになります。ロック期間が最大5分に設定されている場合、ロック更新はそれより早く実行されます。キューに設定されているロック期間は何ですか?また、ASBクライアントのどのバージョンを使用していますか? –