创建异步模型时单个 SQS 队列与多个 SQS 队列
Single SQS Queue vs Multiple SQS Queue while creating a Async Model
我必须开发一个 Apis 本质上是异步的组件。为了开发这个异步模型,我将使用 Aws SQS 队列来发布消息,客户端将从队列中读取并将响应发送回队列。现在我必须公开 10 APIs(当前)。
目前,我可以想到对所有 API 有一个请求和一个响应队列(我将轮询),并且 API 的有效负载可以由一些操作定义。
另一种方法是为每个 API 使用单独的队列。我可以看到多个队列的优点是每个 API 可以有不同的流量,并且拥有多个队列可以帮助队列的客户端有效地扩展。
这两种方法的其他优点或缺点是什么?
将您的 use-case 分成 2 个不同的问题:
问题 1:APIs 到 Workers,一个队列还是多个?
如果您的工作人员从事不同类型的工作,那么拥有一个队列将要求他们检查然后丢弃他们不关心的消息。如果是这种情况,那么每种消息类型应该有一个队列。这样,工作人员从队列中收到的任何消息都应该能够处理。
如果您开始忽略消息,那么可能空闲的其他工作人员可能正在等待它关心的消息一段时间。
问题 2: 为 "results" 使用 return 队列。如果您的客户将轮询结果,那么在每次轮询时,您的 API 都需要轮询队列。同样,正确的响应将是 "searching",丢弃它不关心的那些,让其他客户挨饿。
建议:
使用多个队列,每个"worker type"一个。工作人员应该能够处理它从队列接收到的任何消息。
然后使用 SQS 以外的东西来存储结果。一种选择是使用 S3 存储结果:
- 当您的 API "creates" 任务时,在 S3 中创建一个对象并将对该 S3 对象的引用放在您的 SQS 队列中。
- 您的工作人员将完成工作,然后将结果放在指定位置。
- 当您的客户端轮询您的 API 结果时,您的 API 将检查 S3 和 return status/results。
如果合适,可以使用其他数据存储而不是 S3:RDS、DynamoDB 等
我必须开发一个 Apis 本质上是异步的组件。为了开发这个异步模型,我将使用 Aws SQS 队列来发布消息,客户端将从队列中读取并将响应发送回队列。现在我必须公开 10 APIs(当前)。 目前,我可以想到对所有 API 有一个请求和一个响应队列(我将轮询),并且 API 的有效负载可以由一些操作定义。 另一种方法是为每个 API 使用单独的队列。我可以看到多个队列的优点是每个 API 可以有不同的流量,并且拥有多个队列可以帮助队列的客户端有效地扩展。 这两种方法的其他优点或缺点是什么?
将您的 use-case 分成 2 个不同的问题:
问题 1:APIs 到 Workers,一个队列还是多个?
如果您的工作人员从事不同类型的工作,那么拥有一个队列将要求他们检查然后丢弃他们不关心的消息。如果是这种情况,那么每种消息类型应该有一个队列。这样,工作人员从队列中收到的任何消息都应该能够处理。
如果您开始忽略消息,那么可能空闲的其他工作人员可能正在等待它关心的消息一段时间。
问题 2: 为 "results" 使用 return 队列。如果您的客户将轮询结果,那么在每次轮询时,您的 API 都需要轮询队列。同样,正确的响应将是 "searching",丢弃它不关心的那些,让其他客户挨饿。
建议:
使用多个队列,每个"worker type"一个。工作人员应该能够处理它从队列接收到的任何消息。
然后使用 SQS 以外的东西来存储结果。一种选择是使用 S3 存储结果:
- 当您的 API "creates" 任务时,在 S3 中创建一个对象并将对该 S3 对象的引用放在您的 SQS 队列中。
- 您的工作人员将完成工作,然后将结果放在指定位置。
- 当您的客户端轮询您的 API 结果时,您的 API 将检查 S3 和 return status/results。
如果合适,可以使用其他数据存储而不是 S3:RDS、DynamoDB 等