创建异步模型时,单个SQS队列与多个SQS队列

问题描述 投票:0回答:1

我必须开发一个Apis本质上是异步的组件。为了开发这个异步模型,我将使用Aws SQS队列来发布消息,客户端将从队列中读取并将响应发送回队列。现在有10个API(目前)我必须公开。目前,我可以考虑为所有API提供单个请求和单个响应队列(我将轮询),并且可以通过某些操作来定义API的有效负载。另一种方法是为每个API使用单独的队列。我可以看到多个队列的优点是每个API可以具有不同的流量,并且具有多个队列可以帮助队列的客户端有效地扩展。这两种方法的其他优点或缺点是什么?

amazon-web-services amazon-sqs
1个回答
2
投票

将您的用例分成两个不同的问题:

问题1:工作者的API,一个队列还是多个?

如果您的员工从事不同类型的工作,那么拥有一个队列将要求他们检查然后丢弃他们不关心的消息。如果是这种情况,那么每种消息类型应该有一个队列。这样,工作人员从队列接收的任何消息都应该能够处理。

如果你开始忽略消息,那么可能闲置的其他工作人员可能会等待一段时间来处理它关心的消息。

问题2:为“结果”使用返回队列。如果您的客户端将轮询结果,那么在每次轮询时,您的API将需要轮询队列。同样,它将“搜索”正确的响应,丢弃它不关心的那些,使其他客户挨饿。

建议:

使用多个队列,每个“工人类型”一个。工作人员应该能够处理从队列中收到的任何消息。

然后使用SQS以外的其他内容来存储结果。一种选择是使用S3来存储结果:

  1. 当您的API“创建”任务时,在S3中创建一个对象,并在SQS队列上放置对该S3对象的引用。
  2. 您的工作人员将完成工作,然后将结果放在告知的位置。
  3. 当您的客户端轮询您的API以获得结果时,您的API将检查S3并返回状态/结果。

如果合适,可以使用其他数据存储而不是S3:RDS,DynamoDB等。

© www.soinside.com 2019 - 2024. All rights reserved.