9

自動スケーリング グループの一部である ec2 インスタンスで boto ライブラリを使用する python スクリプトがあります。スクリプトは SQS キューからのメッセージを処理します。

import boto
from boto.sqs.message import Message

conn = boto.connect_sqs()
q = conn.create_queue('queue-name')

while (qin.count() > 0):
    m = q.get_messages()
    #do something with the message

while ステートメントを使用する意味はありますか? count() は次のようにリアルタイムで更新されますか?

  1. 他のインスタンスはメッセージをキューから取り出します (または、2 倍にするつもりですか)。
  2. 新しいメッセージがキューに追加されます (または、見逃してしまいますか?)

キューが空であっても、このスクリプトがキューへの新しい追加を常にリッスンするようにするにはどうすればよいですか?

この質問Processing items in SQS queue with a php scriptでは、「sqs ruby​​ クライアント ライブラリには、キューを継続的にポーリングし、キューでメッセージを受信するとそれをブロックに渡すメソッド「poll」がある」と述べられています。Pythonに同等のものはありますか?

SNS を使用してスクリプトにメッセージ キューのステータスを通知することも提案されていますが、メトリクス アラームが十分に細かく設定されていないため、SNS を使用して応答システムを構成する方法がわかりません。

4

3 に答える 3

7

キューのカウントはおおよそのカウントを提供することのみを目的としており、正確であるとは保証されていないため、キューのカウントに依存しないでください。

ポーリングを永遠に続けたい場合は、次のようにします。

while 1:
    messages = q.get_messages()
    # do something with messages
    time.sleep(N)

ループに遅延を導入するために、time.sleep への呼び出しを追加しました。N の値は少なくとも 1 秒である必要があり、新しいメッセージがキューに表示される速度に応じて、かなり長くなる可能性があります。ループになんらかの遅延を入れないと、おそらくサービスによって抑制され始めるでしょう。

メッセージが何度も読まれないようにするには、キューの可視性タイムアウトをメッセージの処理にかかる時間よりも大きな値になるように調整し、処理が完了したらメッセージを削除するようにしてください。

于 2012-06-21T13:06:57.350 に答える
3
  1. SQS からメッセージをプルすると、メッセージは非表示になり、他のキュー クエリから到達できなくなります (編集 - 非表示は 0 から 12 時間の間で設定できます)。
  2. 新しいメッセージが追加されるたびにキューを再度取得する必要がありますが、これは問題にはなりません。これが、そもそもキュー サービスが存在する理由です。

キューを常にポーリングしたい場合は、ロング ポーリングと呼ばれるものを試してください。最大 20 秒間、キューが読み込まれたときに返される連続ポーリングを行うことができます。

それ以外の場合は、 boto sqs documentationを調べてください。

于 2012-11-14T18:38:35.203 に答える