2012-01-23 8 views
1

私はキューを監視している作業者の役割があります。私はそれが大騒ぎになりたいと思うほど、そのキューは空になるでしょう。私は2分ごとにキュー内に新しいアイテムを取得します。 、私の労働者の役割で睡眠時間が必要ですか?

public override void Run() 
{ 
    while (true) 
    { 
     //Check the queue for new messages 
     //if there's a new message, do some stuff 
    } 
} 

私の質問があり、私はのThread.sleep(x)は、キュー内の項目が存在しない場合に何をする必要があります:

私が持っていますか?それとも何度も何度も何度もチェックし続けてもいいですか?私が眠る必要がある場合、どれくらい長く寝るべきですか? (ミリ秒/秒?)

私の主な関心事はAzureです。

答えて

7

トランザクションの負担を最小限に抑えるための良いアプローチは、バックオフポーリングアプローチを採用することです。キューメッセージが見つからないたびにスリープ時間をゆっくりと長くすることを意味します。スリープ時間がいくらかの最大値に達するまで行う。メッセージが見つかると、メッセージのためにより速くポーリングを開始します。

もう1つの方法は、一度に1つずつ取得するのではなく、キューから複数のメッセージを一度に取得することです。それは取引費用にも役立ちます。

+1

マイクのコメントは完璧です。実際の時間価値に関しては、ストレージ価格をチェックすることをお勧めします.10kトランザクションごとに$ 0.01を支払うことになります。実際のチェック頻度は、支払う予定のトランザクション数と作業負荷の処理開始の速さとのバランスでなければなりません。 – Igorek

+0

ありがとうございます。キューに項目がない場合は、1秒待つだけです。それで、最悪の場合、私は一日に87セントを支払うでしょう。商品を処理するのに約2秒かかり、1日に約500個の商品を手に入れているので、それは少し少なくする必要があります。 ユーザーは、アップロード後にファイルをすばやく処理することを期待しているため、これは本当にうまく機能します。 – Nate

+0

1日あたり10:0.01/10,000 * 60 * 60 * 24 = 0.087または8.7cの係数で間違っているかもしれないと考えてください。 – Ryan

1

また、メッセージのDequeueCountをチェックして、中毒メッセージの不要な処理や課金を避けることをお勧めします。 たとえば、デキュー・セット数を超えるメッセージのロギングと削除は、メッセージ・ループの途中で回転するよりも遅くなります。

+0

ありがとう、それは大きなものです。私は昨晩地元のテストを行っていて、毒のメッセージを発見し、コンピュータは一晩中処理しようとしました。この戦略はそれを回避するのに役立ちます。 – Nate