NServicebus - 停止长时间运行的进程?

时间:2012-07-17 17:07:14

标签: nservicebus

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

  • 我有一个需要由服务处理的1000个文件。到目前为止,我想我有一个端点,客户端,找到所有这些文件并将它们发送到总线上进行处理
  • 我的另一个端点,执行处理的服务器,会监听这些客户端消息,当有人处理该文件时,会返回结果。
  • 客户端获取结果,将文件标记为已处理,并等待处理下一个999文件。客户端不关心返回的消息的顺序,只要它们在某个时刻都得到处理。 (实际上,客户端会在处理后无法通过服务器对数据执行更多操作,因此我不能只是触发并忘记处理请求。)
  • 由于处理单个邮件可能需要一个多小时,因此我会扩展应用程序,使多台服务器都试图通过需要处理的1000个文件进行处理。

从概念上讲,它就像在家庭服务中构建个人SETI一样,可以在我的所有服务器上运行。

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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