【问题标题】:AWS SQS FIFO - How to get more than 10 messages at a time?AWS SQS FIFO - 如何一次获取超过 10 条消息?
【发布时间】:2018-08-02 20:39:31
【问题描述】:

目前我们想拉下一个整个FIFO队列,并处理内容,如果有问题,将消息释放回队列中。

问题是,目前 AWS 只给我们 10 条消息,并且不会再给我们 10 条(这是您在 SQS 中获取批量消息的方式,最多 10 条消息请求),直到我们删除或释放前 10 条.

不过,我们需要获得超过 10 个。这不可能吗?我们知道我们可以将 group_id 设置为随机字符串,这样可以处理更多,但是顺序不能保证,这违背了 FIFO 的目的。

【问题讨论】:

    标签: amazon-web-services amazon-sqs fifo


    【解决方案1】:

    我设法重现了您的结果 - 我可以检索 10 条消息,但再次运行相同的命令不会返回另一组消息。

    相关文档似乎是:

    虽然带有特定 MessageGroupId 的消息不可见,但在可见性超时到期之前,不会返回更多属于同一 MessageGroupId 的消息。只要另一个MessageGroupId 也可见,您仍然可以接收消息。

    我怀疑(只是一个理论!)这是为了保持消息的顺序......如果客户要求一组消息并且它们仍在处理中,则消息可能会返回到队列。因此,在原始消息被删除或超过其可见性超时之前,不会提供更多消息。

    这只是 FIFO 队列的一种行为。

    您似乎需要接收并删除所有邮件才能访问所有邮件。我建议:

    • 接收一条(或多条)消息。
    • 处理它。如果一切正常,请删除该消息。
    • 如果有问题,请将消息推送到新队列
    • 一旦队列为空,您需要从新队列中读取数据并将它们发送回原始队列(应保留顺序)。

    如果您经常需要 Amazon SQS 提供的更多功能,您可以考虑使用Amazon MQ – Managed message broker service for ActiveMQ。它具有更多功能(但相应地不那么“简单”)。

    【讨论】:

    • 只是一个理论! 不是只是一个理论......这正是它的本质。 SQS 使用 HTTPS,因此它没有“连接”或消费者身份的概念,因此这种行为是设计使然。其他任何东西都不能保证按订单交付,因为 SQS 不知道谁要求下一批。
    【解决方案2】:

    如果你设置另一个MessageGroupId,你可以得到另外10条消息,即使你不释放或删除之前的消息。 https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html

    【讨论】:

    • 问题是,如果每条消息(或最多 10 条)具有不同的消息组 ID,则内容会乱序返回。这确实允许下拉超过 10 个,只是不在 FIFO 中(这在使用 FIFO 队列时是反直觉的)
    • 如果我们真的不关心订单被保留怎么办,这应该没问题?
    • 没关系,根据 aws 文档:“为了避免在具有多个生产者和消费者的系统中处理重复消息,其中吞吐量和延迟比排序更重要,生产者应该为每条消息。”
    猜你喜欢
    • 1970-01-01
    • 2022-11-10
    • 2019-11-07
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多