我正在设计一个REST API,它根据详细的here异步设计工作。我正在使用RabbitMQ将初始请求排入队列 - 因此客户端进行调用,收到202 Accepted
响应,并且该作业由服务器排队。为了使客户端可以获得任务的状态更新('完成百分比'),我们有一个辅助队列资源,就像在链接文章中一样。
鉴于每个任务都有自己的队列资源,我们似乎每个任务需要一个临时的RabbitMQ队列。我想知道这是否是一个明智的设计选择,即使我真的看不到任何其他选择。它似乎不太可能非常高效,我对这样创建大量临时队列的可能性感到不安,特别是因为我看不到保证它们都被清理的方法(尽管RabbitMQ的自动删除工具) 。在RabbitMQ之前,我正在使用SQS,并且对这方面可能发生的事情感到痛苦。
我注意到那些在RPC风格中使用RabbitMQ的人已经熟悉了a similar type of queue management。是否有可能的替代方案?
答案 0 :(得分:4)
首先,每个队列都使用apr。 20k内存,所以有很多内存取决于你和你的硬件。但总的来说,它闻起来。真。
对于状态更新,我发现使用某些键值数据库没有错,比如redis甚至memcache和更新百分比。因此,状态检查(以及更新)将是快速,简单和轻量级的。
<强>更新强>
我可以建议进一步的架构:
POST
任务有效负载到某个端点,例如/tasks
。SET task:{id} "<some valye>"
。当工作人员完成任务时,可以用任务结果更新Redis密钥或将其存储在其他地方,然后设置Redis密钥表示任务完成。GET
/tasks/{id}
接收任务状态或结果。GET
/tasks/{id}
时,它会返回由Redis密钥(GET task:{id}
)表示的任务状态。如果未设置密钥(nil
),则工作人员尚未执行任务。P.S。
RPC与您提出的内容有所不同,但我建议您阅读this question了解一些细节。