Cro*_*ool 4 amazon-sqs amazon-web-services
我必须开发一个组件,其中 API 本质上是异步的。为了开发这个异步模型,我将使用 Aws SQS 队列来发布消息,客户端将从队列中读取并将响应发送回队列。现在我必须公开 10 个 API(当前)。目前,我可以考虑为所有 API 设置一个请求和一个响应队列(我将轮询),并且 API 的有效负载可以由某些操作定义。另一种方法是为每个 API 使用单独的队列。我可以看到多个队列的优点是每个 API 可以有不同的流量,拥有多个队列可以帮助队列的客户端有效地扩展。这两种方法的其他优缺点是什么?
将您的用例分成 2 个不同的问题:
问题 1: Worker 的 API,一个队列还是多个?
如果您的工作人员执行不同类型的工作,那么拥有一个队列将要求他们检查然后丢弃他们不关心的消息。如果是这种情况,那么每种消息类型应该有一个队列。这样,工作人员从队列接收的任何消息都应该能够处理。
如果您开始忽略消息,那么其他可能空闲的工作人员可能会等待一段时间以获取它关心的消息。
问题 2:为“结果”使用返回队列。如果您的客户端将轮询结果,那么在每次轮询时,您的 API 都需要轮询队列。同样,它将“搜索”正确的响应,丢弃那些它不关心的响应,让其他客户端挨饿。
推荐:
使用多个队列,每个“工人类型”一个。工作人员应该能够处理它从队列接收到的任何消息。
然后使用 SQS 以外的其他东西来存储结果。一种选择是使用 S3 来存储结果:
如果合适,可以使用其他数据存储代替 S3:RDS、DynamoDB 等。