2016-05-06 9 views
0

AWS SNSSQSというアプリケーションがあり、複数のホストで実行する必要があります。正確な問題の説明は次のとおりです。複数のホストを使用するAWS SQSからのメッセージを処理する

イベントが発生すると、IDを含むメッセージがSQトピックキューに登録され、SQトピックキューにサブスクライブされます。今すぐキューにメッセージが届きました。今では、複数のホストがキューからメッセージを読み込み(2つのホストが同じメッセージを読み込む必要はありません)、メッセージをAmazon S3の共通ファイルに書き込むようにします。 「ホストがメッセージを読むのに失敗した場合」と「同じホストまたは異なるホストで同じメッセージを2回読み取らない」場合のような問題を考慮する必要があります。

誰もがこのタスクを達成するためのいくつかの方法や参考資料を提案できますか?

+0

あなたが求めているのは、まさにSQSのことです。あなたはあなたが持っている問題についてより具体的にする必要があります。 –

答えて

2

SQSがどのようにデフォルトで動作するかは、あなたが望むように思えます。あなたのホストの1人がメッセージを読むと、キューにアクセスしている他の人がメッセージの可視性のタイムアウトまで目に見えなくなります。そのタイムアウト(つまり、一種のハートビート)を延長するためにAPI呼び出しを行うことができます。

デッドレターキューを構成することもできます。これにより、ある回数のメッセージが受信された後、別のキューに検査または処理のために移動されます。

これは、溶液が周囲に散乱されるhere

+0

参考にしてください。私はAWSのドキュメントを見ていましたが、見つけられませんでした! – rightCoder

0

を文書化されています。 SQS Dead Letter queue setupを読み、私の例を参照することができます。コーディングなしでAWS SQSコンソールを使用して、まったく同じことを行うことができます。

import boto3 
sqs = boto3.client("sqs") 
# I want to "lock" my queue for 5 minutes to allow my process have time to 
# complete the task and delete the message afterwards. 
response = sqs.create_queue(
    QueueName="foo", 
    Attributes= { 
     "VisibilityTimeout" : "300" 
    } 
) 
# create a queue to store the "dead letter message" 
dlq_response = sqs.create_queue(
    QueueName="dlq-foo", 
    Attributes= { 
     "VisibilityTimeout" : "300" 
    } 
) 
queue_url = response["QueueUrl"] 

# Attach RedrivePolicy to drive message to dead letter queue 
# I want to make sure the message only read 1 time. Assume the program crash 
# if it is not deleted. 
# deadLetterTargetArn : You must specify the queue exact region name, 
# exact Account name(replace 1234567890) and your dead letter queue name dlq-foo 
sqs.set_queue_attributes(
    QueueUrl = queue_url, 
    Attributes = { 
     "RedrivePolicy" : """{ 
       "maxReceiveCount" : "1" , 
       "deadLetterTargetArn" : "arn:aws:sqs:<region-name>:1234567890:dlq-foo" 
      }""" 
     } 
    ) 

注:RedrivePolicyは、リテラル文字列(NOT辞書)にのみアクセスします。しかし、doucumentationが指摘しているように、あなたはそこに "辞書のような"値を入れ、それを文字列としてフォーマットする必要があります。あなたはdictを文字列に変換するためにstr(dict())を使うことができます。私はPythonの三重引用符を使って分かりやすくしています。

関連する問題