将数据推入队列与工人拉数据

时间:2015-02-07 21:57:31

标签: message-queue soa microservices

我正在构建一个网站后端,涉及客户提交执行某些昂贵(及时)操作的请求。昂贵的操作还涉及收集一些信息以便完成。

uuid可以完整描述客户提交的工作。我希望使用面向服务的架构(SOA)(即多个微服务)。

客户端使用HTTP上的RESTful通信与后端进行通信。我计划使用一个队列,执行昂贵操作的工作人员可以轮询工作。该队列具有持久性并提供了可靠的可靠性语义。

一个考虑因素是我是否收集了上游昂贵操作所需的所有数据,然后将所有数据排入队列,或者我是否只是将uuid入队并让工作人员获取数据。

以下是正在考虑的两种架构的图表:

基于推送(即上游收集数据): Push-based (i.e. gather data upstream)

基于拉取(即工作人员收集数据): Pull-based (i.e. worker gathers the data)

我想到的一些事情:

  1. 在基于推送的情况下,当我收集所需数据时,我可能会阻塞,因此在收集数据然后排队之前,不会响应客户端的HTTP请求。从UI的角度来看,请求将处于待处理状态,直到响应回来。
  2. 在基于拉取的方案中,只有工作人员需要知道工作所需的数据。这意味着我可以让多种类型的客户端与各种后端进行通信。如果数据需要更改,我只更新工作者而不是每个上游服务。
  3. 我在这里缺少的任何其他东西?

3 个答案:

答案 0 :(得分:0)

我认为你已经解释过第二种(基于拉动的)方法更好。

  1. 如果无论如何要异步处理用户的请求,为什么要等待收集数据然后返回响应。您只需要排队工作项并返回HTTP响应。
  2. 通过队列传递数据不是一个好选择。如果您获取上游数据,则必须以某种方式将其传递给工作人员(通常是BLOB存储)。这是您的情况下并不真正需要的额外工作。

答案 1 :(得分:0)

基于拉取的方法的另一个好处是,您不必担心数据在队列中过时。

答案 2 :(得分:0)

我建议使用Cadence Workflow而不是队列,因为它支持长期运行的操作和状态管理。

与使用队列进行任务处理相比,Cadence具有许多其他优点。

  • 构建具有无限到期间隔的指数重试
  • 故障处理。例如,它允许执行一个任务,如果在配置的时间间隔内两次更新均未成功,则该任务会通知另一服务。
  • 支持长时间运行的心跳操作
  • 能够实现复杂的任务依赖性。例如,在无法恢复的故障(SAGA)的情况下实现呼叫链或补偿逻辑的链接
  • 完全了解更新的当前状态。例如,当使用队列时,您就会知道队列中是否有某些消息,并且需要其他数据库来跟踪总体进度。使用Cadence可以记录每个事件。
  • 能够取消正在进行的更新。

请参见介绍Cadence编程模型的the presentation