0

Windows Azureワーカーの役割で「緊急」メッセージを処理するための最良の方法は何ですか?

私には、開始し、無限のwhile(true)ループを実行し、このループでワーカーロールがあります。

  1. キューにメッセージがあるかどうかを確認するために読み取ります
  2. それらを処理して削除します
  3. メッセージがこれ以上ない場合は、最初はThread.Sleep(interval)を使用してスリープ状態になり、スリープ間隔を最大2分まで徐々に増やします。
  4. メッセージがキューに表示されると、スリープ間隔が0にリセットされ、ステップ1に戻ります。

問題は、ワーカーが2分間スリープしていて、キューにメッセージが表示された場合、残りの時間を待たずにワーカーをウェイクアップしたいということです。

ワーカーロールのインスタンスを取得して、ウェイクアップするように指示する方法はありますか?データベースに何かを書くことを考えましたが、同じ問題があります。これを行う役割があったとしても、すでにスリープしている他のワーカーの役割をどのように起こせばよいでしょうか。

4

2 に答える 2

3

これは、WindowsAzureストレージキューを使用することの欠点の1つです。コストとレイテンシのどちらかを選択する必要があります。コストを最適化する場合は、(行ったように)バックオフポリシーを実装しますが、これは、メッセージが処理されるタイミングに影響を与えることを意味します(遅延の増加)。

あなたの場合、Windows Azureサービスバスキューを評価することは興味深いかもしれません(違いについてはこちらをご覧ください)。Service Bus Queuesを使用する利点は、ロングポーリングをサポートすることです。つまり、メッセージが到着するまで(またはタイムアウトが経過するまで)サーバーへの接続を維持します。

これがあなたが通常書くであろういくつかのサンプルコードです(あなたはまだ例外などを管理する必要があります...):

QueueClient queueClient = factory.CreateQueueClient("myqueue");
while (true)
{
    BrokeredMessage msg = queueClient.Receive(TimeSpan.FromSeconds(45));
    if (msg != null)
    {
        var request = msg.GetBody<CreateOrderMessage>();
        // Do something
        msg.Complete();
    }
}

ここにあなたが始めるのに役立ついくつかの良いリソースがあります:

于 2012-07-29T11:18:20.647 に答える
2

ただ寝る時間は短くなります。なぜあなたはたった1秒ではなく2分間寝ているのですか?1つのインスタンスから1秒に1回キューをポーリングすると、トランザクションで1か月あたり約0.25ドルの費用がかかります。

于 2012-07-29T15:58:52.650 に答える