NServiceBus批处理长期运行的工作

时间:2017-03-03 10:18:51

标签: c# .net batch-processing nservicebus jobs

我正在开发一个使用NSB的项目,非常喜欢它,但它是我的第一个NSB解决方案,所以有点像菜鸟。我们有一份工作需要每天运行来处理成员 - 由于工作很简单,预计不会花费很长时间,但是可能会影响成千上万的成员,将来可能会成千上万或几十万。

让一切都在单个处理程序中发生,感觉不对,但让处理程序发现受影响的成员,然后为每个成员发出单独的事件,在相反的方向听起来有点太多。我可以想到其他一些方法,但是想知道在NSB中是否有一种惯用的处理方式?

编辑以澄清:我正在使用Schedule在凌晨3点发送命令,该处理程序将查询SQL数据库以查找需要处理的成员列表。处理将涉及每个成员更新/插入一行或两行。我的问题是如何处理NSB内潜在的大量成员名单。

编辑第2部分:工作现在需要每月运行,而不是每天运行。

4 个答案:

答案 0 :(得分:1)

你提到了一个正在运行的过程,这听起来像是Saga的工作(见https://docs.particular.net/nservicebus/sagas/)。您可以在不同的存储介质(SQL,Mongo等)中使用saga数据和持久检查点。但是,有一些长期运行然后从Saga向个人处理程序发送消息绝对是我也会做的事情。

要考虑的其他事情是消息延期(Timeout Managers)。例如,假设您处理x个用户但又希望再次运行此用户。 NServiceBus允许您在定义的时间段内推迟消息,消息将位于等待分派的队列中。

再一次信息只是喊叫,我可以更新我的答案。

答案 1 :(得分:1)

我不会为此使用传奇。 Sagas应该是轻量级的,专为编排而不是工作而设计。它们是由消息启动而不是按计划启动的。

您可以使用内置的scheduler来达到目的。我没用过,但看起来很简单。

您可以执行以下操作:

  1. 配置每天0300发送的命令消息(例如StartJob)。
  2. 然后,StartJob处理程序将查询数据库以获得工作。
  3. 然后,根据您的要求:

    • 如果您需要一次完成所有工作,请创建一个包含其中所有工作的命令,并将其发送到另一个端点进行处理。如果您使用事务性MSMQ,那么这将作为一个单元成功或失败。
    • 如果您不关心某些工作是否成功,则每个工作单元创建一个命令,然后分派到端点进行处理。这样做的好处是,如果需要,您可以使用distributor进行扩展。
      

    我正在开发一个使用NSB的项目......我们有一份需要的工作   每天都跑...

    虽然你可以使用NSB进行这类工作,但这并不是我真正想做的事情。您可以使用许多其他方法。 SQL作业或cron作业将是显而易见的(并且开发速度更快,性能更高,更简单)。

    尽管它确实支持这样的用例,但NServiceBus并不是真正设计用于预定的批处理。我会严肃质疑你是否应该使用NSB来完成这项任务。

答案 2 :(得分:1)

真正的 NSB解决方案是摆脱在一次运行中处理所有这些记录的“批处理”作业,并找出导致每个记录需要处理的操作毕竟。

执行此类操作时,您应该发布一个NSB事件并将批处理作业重构为一个订阅这些事件的NSB处理程序,以便它可以在执行操作时执行处理,并与其余部分并行运行PROCES。

这样就不再需要凌晨3点的预定“开始”消息了,因为所有的工作都已经完成了。

答案 3 :(得分:0)

以下是我如何使用NServiceBus以惯用方式对此进行建模:可能存在一个名为PointsExpirationPolicy的传奇,它将在任何点被授予用户时启动。传奇将存储用户ID和获得的点数,并且还计算点数应该到期的日期/时间。然后它会请求在这些点到期的日期/时间发送超时回调消息。当该回调到来时,该传奇发送命令以使该用户帐户中的该点数到期。这也可以为您提供一些关于精确何时和如何到期的逻辑的灵活性,并将消除整个批处理过程。