RabbitMQ临时队列用于异步REST中的状态更新

时间:2014-02-10 19:36:02

标签: rest asynchronous rabbitmq message-queue

我正在设计一个REST API,它根据详细的here异步设计工作。我正在使用RabbitMQ将初始请求排入队列 - 因此客户端进行调用,收到202 Accepted响应,并且该作业由服务器排队。为了使客户端可以获得任务的状态更新('完成百分比'),我们有一个辅助队列资源,就像在链接文章中一样。

鉴于每个任务都有自己的队列资源,我们似乎每个任务需要一个临时的RabbitMQ队列。我想知道这是否是一个明智的设计选择,即使我真的看不到任何其他选择。它似乎不太可能非常高效,我对这样创建大量临时队列的可能性感到不安,特别是因为我看不到保证它们都被清理的方法(尽管RabbitMQ的自动删除工具) 。在RabbitMQ之前,我正在使用SQS,并且对这方面可能发生的事情感到痛苦。

我注意到那些在RPC风格中使用RabbitMQ的人已经熟悉了a similar type of queue management。是否有可能的替代方案?

1 个答案:

答案 0 :(得分:4)

首先,每个队列都使用apr。 20k内存,所以有很多内存取决于你和你的硬件。但总的来说,它闻起来。真。

对于状态更新,我发现使用某些键值数据库没有错,比如redis甚至memcache和更新百分比。因此,状态检查(以及更新)将是快速,简单和轻量级的。

<强>更新

我可以建议进一步的架构:

  1. 客户端POST任务有效负载到某个端点,例如/tasks
  2. 应用程序生成唯一的任务ID(uuid又名guid是你的朋友),发布该任务,将其id发送到RabbitMQ队列,然后将id返回给客户端。
  3. 工作人员(一个或多个)从RabbitMQ消耗任务并依赖于处理步骤更新Redis密钥,其具有具有某个值的任务ID(步骤,完成百分比,估计接收结果的时间)。所以,它可能看起来像SET task:{id} "<some valye>"。当工作人员完成任务时,可以用任务结果更新Redis密钥或将其存储在其他地方,然后设置Redis密钥表示任务完成。
  4. 客户可以不时GET /tasks/{id}接收任务状态或结果。
  5. 当应用程序收到GET /tasks/{id}时,它会返回由Redis密钥(GET task:{id})表示的任务状态。如果未设置密钥(nil),则工作人员尚未执行任务。
  6. P.S。

    RPC与您提出的内容有所不同,但我建议您阅读this question了解一些细节。