2016-05-11 3 views
0

私は、条件(DevliverCount = 1)を使用してメッセージを1回だけ処理するWebジョブを持っています。なぜなら、ロックタイムが最初のwebjobによって期限切れになったら、他のインスタンスで処理する必要はないからです。他のwebjobは、ロックタイムが切れた後にメッセージを処理しようとするので、条件(DevliverCount = 1)は満たされず、キューからメッセージを自動的に削除するメソッドから出てきます。 ここでの問題は、メッセージ状態がに達していない場合です。成功以外)メッセージを処理することはありません。この状況をどのように処理するのですか?メッセージを処理しているときに、自分のWebjobでステータスが完了していない

答えて

0

私は問題の一部は、あなたが同時メッセージ処理を防ぐためにMaxDeliveryCountプロパティを使用しようとしているということだと思う:

MaxDeliveryCount

最大配信回数の設定を処理することから、複数の消費者を防ぐために使用されていませんメッセージは同時に、「消費者が処理を成功させるのを妨げているメッセージを処理しようとする「有害メッセージ」」を防止するために使用されるため、メッセージは永遠に処理されます。

達成しようとしていることを正確に判断することをおすすめします。あなたが競合する消費者と一緒にMaxDeliveryCountを使用することができます

good description of competing consumers

competing consumers with Service Bus queues

:あなたは複数のwebjobsは、単一のキューからメッセージを消費し、単純な競争消費者のシナリオをしたい場合は、それを達成するための標準的な方法があります...毒のメッセージを防ぐには、MaxDeliveryCountを1より大きい値に設定して、他のコンシューマーにロックの有効期限が切れているメッセージを処理する機会を与えます。

Azure Service Busは、最大配信数を超える毒メッセージのデッドレターをサポートしているため、オフラインでそのようなメッセージを調べることができます。

また、有効期限前にロックを更新するためにWebjobsにコードを追加する必要があるかもしれません。そうでなければ、サービスバスは「処理に長時間を要する有効なメッセージ」と、処理されません。ロックの更新がなければ、長時間有効な有効なメッセージは毒のメッセージと同じように死んでしまいます。これはほぼ確実にあなたが望むものではありません。

幸運を祈る!

+0

DeliveryCountは、複数のwebジョブによって処理されているときに増加するBrokeredMessageオブジェクトプロパティです。 –

+0

はい、なぜあなたは1を超えないDeliveryCountを主張しますか?その制限を指定する目標は何ですか? – JoshL

+0

webjobで処理されるメッセージは、メッセージごとに10〜15分以上かかる場合があります。メッセージの最大ロック時間はわずか5分です。その後、期限が切れ、他のwebjobインスタンスがメッセージを読んで再処理を試みることができます。だから私は基本的に同じWebjobの異なるインスタンスによって同じメッセージが複数回処理されないように制限しています。 –

関連する問題