0

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

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

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

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

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

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

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

4

1 回答 1

1

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

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

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

于 2012-07-19T15:07:48.887 回答