【问题标题】:Push Data onto Queue vs Pull Data by Workers将数据推送到队列与工作人员提取数据
【发布时间】:2015-02-07 21:57:30
【问题描述】:

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

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

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

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

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

基于推送(即收集上游数据):

基于拉的(即工作人员收集数据):

我想到的一些事情:

  1. 在基于推送的情况下,我可能会在收集所需数据时进行阻塞,因此在收集数据并入队之前不会响应客户端的 HTTP 请求。从 UI 的角度来看,请求将处于待处理状态,直到响应返回。
  2. 在基于拉的场景中,只有工作人员需要知道工作需要哪些数据。这意味着我可以让多种类型的客户端与各种后端进行通信。如果数据需要更改,我只更新工作线程,而不是每个上游服务。

还有什么我在这里遗漏的吗?

【问题讨论】:

    标签: message-queue soa microservices


    【解决方案1】:

    基于拉的方法的另一个好处是您不必担心队列中的数据会变得陈旧。

    【讨论】:

      【解决方案2】:

      我想你已经解释了第二种(基于拉的)方法更好。

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

      【讨论】:

      • 我想我的问题是基于推送的方法有什么优势吗?
      • 根据您对案例的高级描述,我不确定我是否真的看到了基于推送的方法的任何优势。
      【解决方案3】:

      我会推荐 Cadence Workflow 而不是队列,因为它支持长时间运行的操作和开箱即用的状态管理。

      与使用队列进行任务处理相比,Cadence 提供了许多其他优势。

      • 内置指数重试,无限期间隔
      • 故障处理。例如,如果在配置的时间间隔内两次更新都无法成功,它允许执行通知另一个服务的任务。
      • 支持长时间运行的心跳操作
      • 能够实现复杂的任务依赖。例如,在发生不可恢复的故障时实现调用链或补偿逻辑 (SAGA)
      • 提供对当前更新状态的完整可见性。例如,当使用队列时,您都知道队列中是否有一些消息,并且您需要额外的数据库来跟踪整体进度。使用 Cadence 记录每个事件。
      • 能够取消正在进行的更新。

      请参阅 the presentation,了解 Cadence 编程模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-12
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多