Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NServiceBus和系统集成:如何正确处理消息?_Nservicebus - Fatal编程技术网

NServiceBus和系统集成:如何正确处理消息?

NServiceBus和系统集成:如何正确处理消息?,nservicebus,Nservicebus,我正在使用利用MSMQ传输层的NServiceBus集成两个(将来可能不止两个)系统。 我需要支持几种业务对象类型的同步(特别是从端点两侧创建、更新、删除这些对象上的事件)。 我使用的是发布/订阅消息模式 NSB消息传输有关创建、更新和删除业务对象的信息。服务总线应禁用更新或删除特定端点系统中不存在的对象 我们考虑下面的例子。Endpoint1中有按以下顺序发布的消息: [Message1]: "create business object A" [Message2]: "update busi

我正在使用利用MSMQ传输层的NServiceBus集成两个(将来可能不止两个)系统。 我需要支持几种业务对象类型的同步(特别是从端点两侧创建、更新、删除这些对象上的事件)。 我使用的是发布/订阅消息模式

NSB消息传输有关创建、更新和删除业务对象的信息。服务总线应禁用更新或删除特定端点系统中不存在的对象

我们考虑下面的例子。Endpoint1中有按以下顺序发布的消息:

[Message1]: "create business object A"
[Message2]: "update business object A"
[Message3]: "delete business object A"
问题1:我们不知道Endpoint2(a)接收入站队列和(b)处理上述消息的顺序,对吗

问题2:若在Endpoint2中无法正确处理Message1,它将被放回队列,其他消息将首先被处理,对吗

问题3:在这种情况下,Message2和Message3将以错误结束,因为在不存在的对象上尝试操作。那么我应该如何处理Message2和Message3呢?我应该用传说吗

问题4:另一个问题:如果有多条“更新对象A”消息-如何确保/强制将具有的最后一条消息作为最后一条消息处理

问题1:我们不知道Endpoint2(a)将以何种顺序接收 到入站队列和(b)处理上述消息,对吗

对。这就是说,根据您期望这些消息生成的距离,它们可能会被无序地接收和处理

问题2:如果在Endpoint2中无法正确处理Message1,它将 将被放回队列中,其他消息将首先被处理, 我说得对吗

它将根据配置立即尝试x次(我认为默认值为5次),然后返回到第二级重试,这将允许在延迟此消息的同时处理其他消息

问题3:在这种情况下,Message2和Message3将以错误结束 因为在不存在的对象上尝试操作。我该怎么做 然后处理消息2和消息3?我应该用传说吗

对于这一点,传奇无疑是一个可能的选择。工作流是否准确地创建=>update=>delete?可以有多个更新吗?删除总是发生吗?SAGA通常用于对固定/已知的工作流进行建模,因此这可能是最佳选择,也可能不是最佳选择,具体取决于您的具体情况

问题4:另一个问题:如果有几个“更新对象A” 消息-如何确保/强制将最后一条消息作为 最后一个

执行更新并发布更新的端点可能需要在消息上添加版本号(对于该实体实例),订阅者可能必须确保按顺序处理消息。或者,订阅者可能只需要丢弃版本号低于上次处理版本号的消息。这取决于每次更新是过渡还是表示状态的完全覆盖。在任何情况下,订阅端点都必须以某种方式通过本地存储版本号来管理这一点

总之,所有这些都取决于您的具体情况、您希望消息如何发布以及消息处理无序的后果。例如,您希望在99.999%的情况下,消息的发布间隔足够远,而这一切都无关紧要,我不建议在这方面花费太多精力

如果这些确实是罕见的实例,那么明智地使用Bus.Defer()可能足以理顺消息顺序


我假设你问这个问题更多的是作为一个一般性问题,而不是一个特定的场景,但是如果你确实有一个特定的问题要解决,我建议你将你的特定场景发布到社区——社区通常非常有帮助。

Ad。问题3:工作流就是create=>update(s)=>删除,但它可以在任何点停止。可以有多个更新。那么在这种情况下,sagas会是一个好的选择吗?我认为sagas在这种情况下不是一个好的选择——我认为您需要的是一个数据库或其他一些持久数据存储。这听起来更像是一个永久性的持久性,而不是一个长期运行的过程,除非我误解了你的意思。你很了解我-因此,一个可能的解决方案是添加消息版本号(或者时间戳),并将其本地存储在BusinessObjectInstanceType&Id和TimestampOfLastSuccessfullyHandledMessage的数据库对中。然后,如果端点接收到非实际消息(即,本地存储的版本小于1),则引发异常,结果是,在重试&SLR之后,该消息被放入错误队列。你觉得这有道理吗?你认为这样的解决方案有什么需要注意的地方吗?谢谢,行吗?对这是最好的解决办法吗?不知道全部情况很难说。如果输入的版本低于数据库的版本,可以忽略它吗?如果您已经知道它将重复失败,那么让它重试多次是没有意义的。同样,堆栈溢出可能不是提供详细解决方案的最佳场所——我建议您在论坛上发表文章(社区非常有帮助)。