【问题标题】:How Amazon SQS works in this scenario?Amazon SQS 在这种情况下如何工作?
【发布时间】:2017-06-21 12:18:38
【问题描述】:

消费者正在侦听队列(FIFO 或标准队列),生产者在队列中生成消息。

  1. Amazon SQS 队列是否会在收到消费者确认后自动从队列中删除消息?有没有办法/配置让队列保留消息而不是删除它并确保它不会再次传递。

  2. 生产者在队列中生成消息。由于网络问题,消费者离线。一段时间后,他/她又回到了网上。将队列传递消息 当他上网时给消费者?我认为是的,因为队列没有收到消费者的 ACK。

【问题讨论】:

    标签: java message-queue amazon-sqs


    【解决方案1】:

    我相信你是从 rabbitmq 的角度来问的。有一些区别。 sqs中没有ack。消息不会自动删除,即使在消费者接受后它们也会留在队列中。消费者处理完消息后,需要明确删除消息。

    Sqs 不关心消费者的在线离线状态。消费者定期轮询 sqs 以获取新项目。如果消息可用,则将其分发。消费者完成后,它会调用 sqs 来删除该消息。然后再次轮询新消息。

    在您的场景中,一旦消费者处理完一条消息,它可以发出两个请求:一个将消息排入不同的队列,第二个将消息从原始队列中删除。

    如果您有多个消费者列在同一个队列上,那么消息不可见期的概念就会发挥作用。如果您有这样的设置,请在 cmets 中询问,我会更新更多信息。

    希望对你有帮助。

    【讨论】:

    • 你说The consumer periodically polls SQS for new items 有没有办法让消费者可以监听队列,然后队列可以将它推送到客户端而不是消费者拉它?因为拉模型不适用于高度可扩展的应用程序。
    • @user3198603 在此评论和您的原始问题之间,听起来您根本没有真正阅读过文档。消息通过长轮询 HTTP/S 连接推送给消费者...如 SQS FAQ 中所述。
    • @user3198603,如果没有合适的基础,可伸缩性受拉影响的想法是错误的。只有当许多工作人员在很短的时间内访问一台服务器时,它才会受到影响。使用 sqs,通过这种方式消除了这两个因素 (1) 不是一台服务器,而是一组服务器。命中分布 (2) 您不会高频命中。通过长轮询机制降低频率。
    • 拉和推各有利弊。没有一个是普遍的坏或好。 Push (rabbitmq) 提供了惊人的速度,但牺牲了服务器容量。服务器必须保持空闲的 tcp 连接。这降低了可扩展性。另一方面,Pull (sqs) 通过牺牲速度来提供巨大的可扩展性。仅当工人要求时才传递消息
    • 任何面向可扩展性的解决方案都会牺牲全局状态并诉诸最终的一致性。服务器需要时间来就发生的事情和尚待完成的事情达成共识。当消息重新传递时,您会在 sqs 中看到此问题。 Rabbitmq 没有这个问题,但是水平缩放很可怕。
    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2018-06-16
    • 2018-01-19
    • 1970-01-01
    • 2021-12-06
    • 2020-12-27
    • 2021-08-31
    相关资源
    最近更新 更多