设计您的应用程序以处理Amazon SQS中的FIFO

9

来自Amazon SQS FAQ页面:

由于Amazon SQS的分布式特性,Amazon SQS不能保证按先进先出的顺序访问Amazon SQS队列中的消息。如果您需要特定的消息排序,请设计您的应用程序来处理它。

我的问题是 - 如何设计这种应用程序?

4个回答

3

在发送消息时,您可以设置消息序列计数器。在接收端,如果序列正确,您可以继续处理消息。如果出现序列错误的消息,则等待正确的消息到来(在此期间将按序号排序的消息存储在列表中),然后处理正确的序列消息以及在其之间到达的其他消息。


2
这就是它的要点。需要按特定顺序到达的消息可能不适合使用SQS,或者可能是概念上的缺陷的迹象。 - Michael - sqlbot
可以,那可能行得通。但是代码会变得非常混乱。有更简单的方法吗? - Gaurav Gupta
1
如果是通过 API 调用同步消息,你如何知道在编写队列消息时要使用的下一个序列号呢?我没理解那部分。拜托了。- @pankajbatra - jitendra
2
@pankajbatra - 另外,如果有多个作业正在监听一个特定的队列(这在实际中是常见情况),如何处理这种情况?我猜这只适用于单线程队列监听器作业? - jitendra

1

Amazon SQS刚刚获得了FIFO队列,具有精确一次性处理和去重功能:

今天,我们通过支持FIFO(先进先出)队列,使SQS更加强大和灵活。 我们现在正在两个地区推出这种新类型的队列,并计划在2017年初在许多其他地区提供。

这些队列旨在保证消息按发送顺序精确处理,而且不会有重复。[...]

[我强调]

正如强调的那样,这些新的FIFO SQS队列将使针对特定用例的任何特殊应用程序设计变得不必要,但并非在所有SQS区域中都可用[最初仅在美国东部(俄亥俄州)和美国西部(俄勒冈州)可用]。


1
需要按特定顺序到达的消息可能不适合使用标准的SQS队列。但是,您可以在发送消息时设置消息序列计数器,并处理消息,前提是序列正确。如果在接收端没有接收到正确的连续消息,则需要等待正确的消息才能处理它。enter image description here 在2016年11月17日,FIFO队列已在某些地区引入(美国东部(俄亥俄州)和美国西部(俄勒冈州)),这补充了标准队列。消息发送和接收的顺序严格保留,一条消息只会被传递一次并保持可用状态,直到消费者处理并删除它;队列中不会引入重复项。FIFO队列使用与标准队列相同的API操作,并且接收和删除消息以及更改可见性超时的机制也相同。但是,在发送消息时,您必须指定消息组ID。enter image description here

enter image description here


0

不完全是FIFO,但您可以按以下方式操作:

  • 创建N个队列(称为q1、q2、...、qN)
  • 每个队列有一个上限(每个队列最多允许M个消息)

将项目插入队列:

  • SQS中的所有作业都从q1开始写入
  • 如果q1已经达到了M个消息的上限,则继续往后走,直到qN,然后回到q1

从队列中获取项目:

  • SQS中的所有读取作业将从q1开始提取项目
  • 如果q1为空,则继续往后走,直到qN,然后回到q1

您需要确保,排空一个队列(读取M个消息)所需的时间应该比填满所有队列(推送NxM消息)的时间要短得多。这将确保M个消息批次优先于在队列中插入的其他消息。(先进先出)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接