2017-07-11 3 views
0

メッセージがAzureサービスバスキューに入力されるたびにトリガーされるAzure関数(古い.csx関数ではなく新しいC#関数に基づいています)があります。機能がトリガーされると、サービスバスメッセージの処理が開始されます。それは、メッセージをデコードし、データベースの束を読み、他人の束などを更新します。これは時々30分以上かかることがあります。同じサービスバスキューメッセージに対して複数回実行するAzure関数

これは時間に敏感なプロセスではないため、30分または60分でも問題にはなりません。問題は、一方、Azure関数は再び蹴り込み、同じメッセージを何度も繰り返しピックアップして再解析するように見えるということです。これは問題であり、ビジネスロジックに問題を引き起こします。

Azure関数を強制的にシングルトンモードで実行することはできますか?それができない場合は、どのようにポーリング間隔を変更するのですか?

+0

機能サービスはAppサービスプランまたは消費計画の下で作成されましたか? App Service Planの下で、AlwaysOnがオンになっていることを確認します。消費計画の下では、機能アプリは5分後に終了します(10分まで延長可能、https://github.com/Azure/azure-webjobs-sdk-script/wiki/hostの「functionTimeout」の値を参照してください)。json)、これはあなたが見ている行動を説明するかもしれません。 –

+0

私はApp Service Planを持っています。私の機能は終了していません。実際、その逆が起こっています。複数の機能がメッセージを処理しています。 – Yasir

答えて

2

問題は何が起こっている...

を設定Service Busに関連しては、メッセージがキューに追加され、メッセージはその関数に渡されて、そのようロックがそのメッセージの上に置かれていることですあなたがロックしている間は他の消費者がそのメッセージを見たり処理したりすることはできません。

サービス期間中に、ファイルを処理したことをサービスバスに伝えない場合、またはロックを延長すると、メッセージからロックが削除され、そのメッセージを処理する他のサービスこれはあなたが見ているものです。

幸い、Azure関数は自動的にロックを更新します。 host.jsonファイルには、Azure関数でロックを更新する期間を指定するautoRenewTimeout設定があります。

https://github.com/Azure/azure-webjobs-sdk-script/wiki/host.json

"serviceBus": { 
    // the maximum duration within which the message lock will be renewed automatically. 
    "autoRenewTimeout": "00:05:00" 
}, 
3

AutoRenewTimeout示唆したほど大きくありません。それはあなたが知っておく必要がある欠点があります。それはnot a guaranteed operationです。クライアント側の操作であるため、、時にはとなり、現在の状態と同じ状態になります。

これを解決するには、デザインを確認する必要があります。長い実行プロセスがある場合は、メッセージを処理し、処理をMaxLockDurationより長く実行できるものに引き渡します。あなたの機能が長引いているという事実は、長い実行プロセスがあることを示しています。メッセージングは​​そのために設計されていません。

潜在的な解決策の1つは、ストレージテーブルに処理のインテントを登録することです。別のストレージテーブルを起動して、X分かかる可能性があるキックオフ処理を実行します。それをシングルトンとしてマークしてください。これにより、メッセージを並行して処理し、「長時間処理の要求」をストレージテーブルに書き込んで、Service Busメッセージングを完了し、再処理をトリガーしません。長時間実行されている処理では、障害ケースの処理方法を決定できます。

希望に役立ちます。

+0

あなたが「シングルトンとしてマークする」と言うとき、それはあなたが何を指しているのですか?そして、それをシングルトンとしてどのようにマークするのですか? – Yasir

+0

もう1つのストレージテーブルが機能をトリガしました。私は、NServiceBusとService Busで多少似たプロセスを実装しました。ここにコードと図があります:https://docs.particular.net/samples/azure/azure-service-bus-long-running/関数が近づくにつれて、長時間実行されている関数(プロセッサ)にはポーリングすると、トリガーされます。 –

+1

私はhttps://github.com/Azure/azure-functions-durable-extensionを使用することをお勧めします。これは、必要な長時間実行/オーケストレーション機能を提供します。 –

関連する問題