複数のインスタンスというWebロールがあります。毎朝午前7時に統計情報をメールでお客様にお送りします。 私の問題は次のとおりです。Cronジョブを使用すると、仕事のメールはに複数回送信されます。AzureのWebロールとインスタンス
カスタマーごとに1つのメールのみを送信するためにインスタンスを設定するにはどうすればよいですか?
複数のインスタンスというWebロールがあります。毎朝午前7時に統計情報をメールでお客様にお送りします。 私の問題は次のとおりです。Cronジョブを使用すると、仕事のメールはに複数回送信されます。AzureのWebロールとインスタンス
カスタマーごとに1つのメールのみを送信するためにインスタンスを設定するにはどうすればよいですか?
私の経験上、一意のインスタンスIDを使用して、cronジョブとしてメール送信するインスタンスが1つ存在することを確認できます。
ここには簡単なコードがあります。
参考として、以下の機能RoleInstance.getId
の説明を参照してください。
このインスタンスのIDを返します。
戻されたIDは、ロールのインスタンスのアプリケーション・ドメインに固有です。インスタンスが終了し、自動的に再起動するように設定されている場合、再起動されたインスタンスは、と同じIDとなります。
上記のAzure SDK for Javaのクラスの詳細については、下記のクラスリストを参照してください。
それがお役に立てば幸いです。
通常、Multi-instance Cloud Services
でこの問題を解決する方法は、Master Election
パターンを使用することです。あなたがすることは、午前7時(またはあなたのCRONの仕事が起きるたびに)です。あなたのすべてのインスタンスは、BLOBのリースを取得しようとします。ただし、1つのインスタンスだけがリース取得に成功し、他のインスタンスはPreConditionFailed (419)
エラーで失敗します(この例外が発生することを確認してください)。リースを取得するインスタンスは基本的にMaster
であり、そのインスタンスは電子メールを送信します。
明らかに、このアプローチの問題は、このMaster
インスタンスがメッセージの配信に失敗した場合です。しかし、私はそれがもう一つの疑問だと思う。