【问题标题】:Amazon Message Queue Service (SQS) sending and confirmationAmazon Message Queue Service (SQS) 发送和确认
【发布时间】:2014-08-10 06:57:18
【问题描述】:

场景:

弹性 beanstalk 环境有一些网络服务器,它们向另一个工作环境发送请求以供用户注册等。

问题:

当其中一台工作机器完成任务后,我还希望它向 Web 服务器发送确认消息。

SQS 好像没有“确认”信息。

当我们卸载发送电子邮件的工作时,但我也想让 Web 服务器知道发送电子邮件成功。

我可以做的一个解决方案是实现 Web 服务器轮询的另一个队列,但是,许多服务器可以在同一个队列上轮询,服务器 1 的确认可以由 接收服务器 2,我们需要等待消息的 超时,但随后 服务器 3 可能会拦截该消息。 服务器 1 可能需要等待一段时间才能得到确认。

【问题讨论】:

    标签: amazon-web-services amazon-sqs


    【解决方案1】:

    您的工作机器“确认”他们处理消息的方式是将其从队列中删除。队列消息的生命周期是:

    1. Web 服务器发送带有请求的消息。
    2. Worker 收到消息。
    3. Worker 成功处理消息。
    4. Worker 删除消息。

    被删除的消息是对它已成功处理的确认。

    如果worker没有在第4步删除消息,那么消息会在指定的超时时间后重新出现在队列中,下一个检查消息的worker会得到它并处理它。

    如果您担心某条消息可能无法处理并永远重新出现在队列中,您可以设置一个“死信”队列。在消息被接收到指定次数但从未被删除后,该消息将被转移到死信队列,在那里您可以有一个处理这些异常情况的过程。

    Amazon 的 Simple Queue Service Developer Guide 对这个生命周期以及如何确保每条消息都得到处理或移动到死信队列进行特殊处理有很好、清晰的解释。

    【讨论】:

    • 感谢您的详细回复。是不是说web服务器也需要轮询看看消息是否还在?如果它消失了,那么是否确认任务已经成功了?这种增加的等待时间是否证明了分离系统的价值?因为如果网络服务器完成所有的电子邮件发送等操作会更容易。
    • 如果消息消失,则确认它已成功处理。至于Web服务器是否需要轮询,那要看用例了。为什么 Web 服务器需要知道这一点?发现成功或失败后会做什么?根据我对您的描述的理解,网络服务器只需要发送一封电子邮件,那为什么还要麻烦确认呢?将消息放入队列后,您可以确信它会在可能的情况下发送电子邮件。如果不可能,消息最终将进入死信队列以进行手动处理。
    • 如果您希望 Web 服务器在响应 Web 请求之前等待电子邮件发送完毕,那么没有理由使用消息队列。只需从 Web 服务器发送电子邮件作为响应请求的一部分。消息队列的好处是您可以请求异步操作并立即进行下一件事情而无需等待。
    • 如果网络服务器知道消息已发送,那么如果可能,它也可以在同一页面上通知用户。我用 Java 编写了我的后端,但我决定使用 Python 作为我的前端。使用 SQS 进行通信似乎更容易。
    • 如果希望发送电子邮件的进程想要等待结果,它不应该使用消息队列。它应该自己发送电子邮件,或者使用诸如网络服务之类的东西来代替它。消息队列适用于您想要完成某件事但又不想等待它完成的时候。
    猜你喜欢
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2023-03-23
    • 2016-11-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多