2015-11-04 44 views
3

我知道这对许多人来说似乎相当明显,但我的客户正在使用一种我不太方便的模式。我们应该如何处理使用nservicebus的长时间运行过程

情况是,他们的客户发送通过nservicebus发送到第三方系统的存款或取款。第三方系统需要处理该交易,但交易完成前可能需要几天甚至几周的时间。

今天的解决方案是创建一个传奇,它首先发送一条消息将事务交给第三方系统。完成后,传奇下一步是检查完成更新。如果事务未完成,则发送requesttimeout,“等待”。当达到超时时,再次执行相同的检查,并发送新的requesttimeout ...等等。这一直是一个永恒的循环。它还做了什么是一次又一次地完全填充同一个SagaTimeout的ServiceInsight。

我一直在寻找单反,但它似乎缺乏。我只需要针对特定​​消息进行多次重试,而不是针对所有消息。

要添加,第三方系统不能发送事务已完成,这意味着我们需要轮询完成更新。

另外,我相信更好的解决方案是保存交易状态,将交易发送给第三方并完成这个特殊的事件。然后有一个使用时间间隔检查完成更新的传奇。

以这种方式使用sagatimeouts是一种常见模式吗?而且,有一个传奇/处理程序只检查完成更新是一个更好的解决方案吗?

回答

3

据我所知,你正在按照它应该完成的方式去做。当然,你可以开始一个单独的传奇来处理超时,但我没有看到有任何理由这么做。

由于您不知道交易/流程何时在第三方系统上完成,因此对最终用户来说不会非常时间敏感,因此您不需要经常请求超时。您甚至可以统计传奇数据中超时的次数,并增加下一次超时的时间跨度,以减少超时数量。如果第三方系统已经花费了“太长时间”来完成交易,您还可以检查该传奇的运行时间并提醒某人(您或客户等)。这是NSB传奇真正闪耀的地方,在处理这些情况时非常灵活。

当然,不要使用单反这种东西,它只是为了在发生间歇性错误时重试处理程序。

0

IMO听起来像你的传奇混合了技术问题(轮询一个外部服务,等待发生的事情)与域问题(希望在事情发生时得到通知)。

我的经验是,你通常可以从技术性的东西中隔离你的领域的东西,在这种情况下,它可能意味着你应该把投票放在一个集成服务的某个地方,然后当事情发出适当的事件发生。

这样,传奇可能会在整个过程中发生超时(例如,检查过程是否在四周内完成,或者您认为是在任何人之前必须完成的最长时间),并且只需订阅TransactionCompleted来自集成服务的事件。

+0

在这种情况下,您是否建议集成服务是一个单独的端点内的nsb传奇,基本上只处理超时/轮询? – Trygve

+0

可能,是的 - 但也许没有必要使用它的传奇?投票不能像“System.Timers.Timer”这样简单的轮询一次,并将其发现作为事件发布? – mookid8000

+0

这听起来像mookid8000建议我最初的想法,投票外最初的传奇。 Trygve说它已经正确实施了。两者都可以,但是,真正的NServicebus方式是什么?我最初的想法是,暂停这个传奇并重新初始化新的游戏并不是一个好主意......但也许这就是做到这一点的方法 – Per

相关问题