使用带有消息组ID的FIFO AWS SQS连接多个生产者和多个消费者

时间:2020-06-30 21:37:39

标签: amazon-sqs

假设我们有一个AWS FIFO SQS队列以及两个消息生产者A和B。每条消息的发送组ID均等于生产者的名称。换句话说,生产者A向每个消息添加组ID“ A”,生产者B向每个消息添加组ID“ B”。我们也有3个使用者X,Y和Z消耗了具有可见性超时的消息。假设队列中有5条消息-生产者A发送了3条消息,生产者B发送了2条消息。See the following image

考虑到给定条件,我们将具有以下工作流程:

其中一个使用者(例如X)从队列中接收到具有组ID B的消息1,这使该消息和所有其他具有组B的消息不可见,直到消息1被处理并从队列中删除为止。

然后,另一个使用者(例如Y)接收到具有组ID A的消息2,该消息使消息2和具有组A的所有其他消息不可见,直到消息2被处理并从队列中删除为止。

现在,由于组A被处理的消息2阻塞,而组B被处理的消息1阻塞,我们使使用者Z无法使用任何消息。

在给定情况下,是否有一种技术可以让使用者Z消耗队列中的下一条消息?

更新1 :为什么我使用FIFO队列和组ID?

让我们假设生产者A和B代表两个用户,并且使用简单队列代替FIFO。邮件中也没有附加组ID。

请考虑以下情形:生产者A向队列发送一百条消息,而紧随其后,生产者B也仅向队列发送一条消息。生产者B的这一条消息必须等到A的所有消息都被处理完为止,这是不好的。尽管A拥有一百条消息,而B仅拥有一条消息,我们仍然需要在A和B的消息之间实现负载平衡。

为此,我们尝试添加组ID,并且由于仅FIFO队列支持它们,因此我们必须将FIFO替换为简单队列。现在解决了上述问题。当任何生产者的A消息运行时,即使该消息位于队列的后面,消费者中的一个也将接收到生产者B的消息。现在,我们在A和B之间进行负载平衡。

但是,当所有组都有正在运行的消息时会出现问题(在这种情况下,队列看起来是空的),但是目前我们有更多可用的消费者无法工作,这也不是很好。

更新2 :建议的解决方案。

每个生产者的多个组ID

假设我们有10个使用者,只有一个生产者A。让我们将1到10的数字添加到每个消息组ID,再加上一些代表10个消息的批处理的唯一ID,因此我们将得到组ID “ A1- batch1” “ A2-batch1” “ A3-batch1” 等,直到“ A10-batch1” 。如果生产者A有更多消息,我们将增加批号,并为另外十个然后为另外十个生成组ID。现在,每个消费者都可以保证收到一条消息,这真是太好了。但是,如果生产者B现在发送一条消息,则在最坏的情况下,生产者A与生产者B之间的余额比率将为10:1,这并不好。而且,消费者可以水平扩展,因此生产者必须知道当前的大约消费者数量。

每个生产者单独的队列

生产者是当前使用该服务的用户。用户连接到服务时,我们将必须创建一个简单队列,并将添加的队列通知消费者。消费者将不得不连续拉出每个当前存在的队列,并且即使有正在运行的消息也应该能够接收新消息。在这种情况下,负载平衡就可以了。该解决方案增加了体系结构的复杂性,但是应该可以使用。除非我错过了一些技术限制。

1 个答案:

答案 0 :(得分:0)

队列将按照您的描述进行操作,这是有意的操作。

只有两个不同的组ID。如果两个组ID都在运行中,则无法检索到其他消息。

如果这给您造成了问题,那么您很可能使用了错误的组ID。

组ID基本上说“请按顺序处理这组消息” 。因此,如果仍在处理一条消息,则SQS FIFO队列将阻止检索和处理来自同一组ID的另一条消息。您想获取具有相同组ID的另一封邮件这一事实向我表明,您希望该组邮件按顺序处理,因此您应该使用其他组ID

通过使用链接到生产者的组ID,并且只有两个生产者,您将永远只有两个消费者处理队列。

相关问题