我正在开发一个使用NSB的项目,非常喜欢它,但它是我的第一个NSB解决方案,所以有点像菜鸟。我们有一份工作需要每天运行来处理成员 - 由于工作很简单,预计不会花费很长时间,但是可能会影响成千上万的成员,将来可能会成千上万或几十万。
让一切都在单个处理程序中发生,感觉不对,但让处理程序发现受影响的成员,然后为每个成员发出单独的事件,在相反的方向听起来有点太多。我可以想到其他一些方法,但是想知道在NSB中是否有一种惯用的处理方式?
编辑以澄清:我正在使用Schedule
在凌晨3点发送命令,该处理程序将查询SQL数据库以查找需要处理的成员列表。处理将涉及每个成员更新/插入一行或两行。我的问题是如何处理NSB内潜在的大量成员名单。
编辑第2部分:工作现在需要每月运行,而不是每天运行。
答案 0 :(得分:1)
你提到了一个正在运行的过程,这听起来像是Saga的工作(见https://docs.particular.net/nservicebus/sagas/)。您可以在不同的存储介质(SQL,Mongo等)中使用saga数据和持久检查点。但是,有一些长期运行然后从Saga向个人处理程序发送消息绝对是我也会做的事情。
要考虑的其他事情是消息延期(Timeout Managers)。例如,假设您处理x个用户但又希望再次运行此用户。 NServiceBus允许您在定义的时间段内推迟消息,消息将位于等待分派的队列中。
再一次信息只是喊叫,我可以更新我的答案。
答案 1 :(得分:1)
我不会为此使用传奇。 Sagas应该是轻量级的,专为编排而不是工作而设计。它们是由消息启动而不是按计划启动的。
您可以使用内置的scheduler来达到目的。我没用过,但看起来很简单。
您可以执行以下操作:
然后,根据您的要求:
我正在开发一个使用NSB的项目......我们有一份需要的工作 每天都跑...
虽然你可以使用NSB进行这类工作,但这并不是我真正想做的事情。您可以使用许多其他方法。 SQL作业或cron作业将是显而易见的(并且开发速度更快,性能更高,更简单)。
尽管它确实支持这样的用例,但NServiceBus并不是真正设计用于预定的批处理。我会严肃质疑你是否应该使用NSB来完成这项任务。
答案 2 :(得分:1)
真正的 NSB解决方案是摆脱在一次运行中处理所有这些记录的“批处理”作业,并找出导致每个记录需要处理的操作毕竟。
执行此类操作时,您应该发布一个NSB事件并将批处理作业重构为一个订阅这些事件的NSB处理程序,以便它可以在执行操作时执行处理,并与其余部分并行运行PROCES。
这样就不再需要凌晨3点的预定“开始”消息了,因为所有的工作都已经完成了。
答案 3 :(得分:0)
以下是我如何使用NServiceBus以惯用方式对此进行建模:可能存在一个名为PointsExpirationPolicy的传奇,它将在任何点被授予用户时启动。传奇将存储用户ID和获得的点数,并且还计算点数应该到期的日期/时间。然后它会请求在这些点到期的日期/时间发送超时回调消息。当该回调到来时,该传奇发送命令以使该用户帐户中的该点数到期。这也可以为您提供一些关于精确何时和如何到期的逻辑的灵活性,并将消除整个批处理过程。