【问题标题】:NServicebus - Stopping a long running process?NServicebus - 停止长时间运行的进程?
【发布时间】:2012-07-17 17:07:14
【问题描述】:

这是我尝试使用 NServiceBus 组合在一起的应用程序:

  • 我有 1000 个文件需要由服务处理。到目前为止,我认为我应该有一个端点,即客户端,找到所有这些文件并将它们发送到总线上进行处理
  • 我的另一个端点,即执行处理的服务器,将监听这些客户端消息,当一个进入处理文件时,并返回结果。
  • 客户端获取结果,将文件标记为已处理,并等待下一个 999 个文件被处理。客户端不关心返回的消息的顺序,只要它们在某个时候都得到处理即可。 (实际上,客户端会在处理完数据后对数据做更多服务器无法完成的事情,所以我不能只是触发并忘记处理请求。)
  • 由于处理一条消息可能需要一个多小时,我将扩展应用程序以让多台服务器都尝试吃掉需要处理的 1000 个文件。

从概念上讲,这就像在我的所有服务器上构建个人 SETI 在家服务一样。

我遇到的问题是,如何在处理 1000 个文件的过程中停止?

  • 我想让我的所有服务器尽可能多地处理我的数据,所以当客户端启动时,它是否会发布 1000 个命令来处理 1000 个文件,然后坐下来等待?如果它这样做并决定停止,它如何清除总线上的所有这些命令来处理文件?
  • 如果我的客户一次只在总线上推送一两条消息,如果我决定停止在客户端上,我可以很容易地停止发送消息,但是我还有另外两个问题

    1. 服务器可能未得到充分利用,我最终会得到闲置的服务器。
    2. 如何停止加载并处理数据的服务器?向他们发送不同消息格式的第二条命令?

想法,想法?我是否使用正确的工具/正确的方法来解决这个问题?

【问题讨论】:

    标签: nservicebus


    【解决方案1】:

    您可能需要考虑的一件事是您将如何关联消息处理。我会为此使用 saga,并让客户端生成某种批处理 id,该批处理 id 附加到所有要处理的文件中。这允许您的客户端能够向 saga 发送 CancelProcessing 消息,然后处理程序可以停止向文件处理端点处理/发送消息并执行任何清理操作,例如完成 saga 并从中删除数据数据库。

    因此,您将拥有客户端端点、saga 端点和一个或多个文件处理端点(位于分发器后面)。您的客户将负责启动/发送文件到 saga。 saga 管理文件关联和处理活动,而您的处理端点专注于完成工作。

    请记住,处理端点不一定是物理端点。如果您愿意,您可以在一台服务器上拥有许多这样的节点,并使用监控工具来确定您是否需要添加或删除节点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-12
      • 2014-02-11
      • 2018-06-03
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多