【问题标题】:Process messages from AWS SQS using multiple hosts使用多个主机处理来自 AWS SQS 的消息
【发布时间】:2016-09-01 09:37:37
【问题描述】:

我有一个涉及AWS SNSSQS 的应用程序,需要在多个主机上运行。确切的问题描述是:

每当发生事件时,都会将包含ID 的消息发布到订阅了 SQS 队列的 SNS 主题。现在我在队列中收到消息。现在,我希望多个主机从队列中读取消息(没有两个主机应该读取相同的消息)并将消息写入 Amazon S3 中的一个公共文件。应该考虑诸如“如果主机读取消息失败怎么办”和“不在同一主机或不同主机中读取同一消息两次”等问题。

任何人都可以提出一些方法或一些参考资料,我可以通过这些方法或参考资料来完成这项任务吗?

【问题讨论】:

  • 您所要求的正是 SQS 所做的。您需要更具体地说明您遇到的问题。

标签: amazon-web-services amazon-sqs event-driven-design


【解决方案1】:

听起来您想要的很大程度上是 SQS 默认的行为方式。当您的一个主机读取消息时,访问队列的其他人将无法看到该消息,直至消息可见性超时。您可以进行 api 调用以延长该超时时间(即一种心跳)。

您还可以配置死信队列。这样,在消息被接收一定次数后,它就会被移动到一个单独的队列中,以进行检查或以其他方式进行处理。

这是记录在here

【讨论】:

  • 您能否提供一些参考。我正在查看 AWS 文档,但没有找到!!!
【解决方案2】:

溶液四处散落。 您可以通读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 只访问文字字符串,而不是字典。但是,正如文档指出的那样,您需要将“字典之类”的值放在那里并将其格式化为字符串。您可以使用 str(dict()) 将 dict 转换为 string ,我使用 python 三引号引号来阅读清晰。

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2021-10-03
    • 2014-11-27
    • 1970-01-01
    • 2020-10-10
    • 2015-12-04
    • 1970-01-01
    • 2018-10-25
    相关资源
    最近更新 更多