根据端点可用性重定向NServiceBus消息

时间:2017-01-19 18:20:09

标签: nservicebus nservicebus5

我是NServiceBus的新手,但目前正在使用它与SQL Server Transport在三台机器之间发送消息:一个属于名为Server的端点,两个属于名为Agent的端点。这是按预期工作的,发送到Agent端点的消息通过默认循环分发到两台机器中的一台。

我现在想要添加一个名为PriorityAgent的新端点,该端点具有不同的队列和另外两台计算机。虽然所有端点都使用相同的消息类型,但我知道在发送之前应该处理每条消息的位置,所以通常我可以选择正确的目标端点,并相应地处理消息。

但是,我需要构建一个特殊情况:如果PriorityAgent端点上的所有计算机当前都处于关闭状态,那么通常应该发送到那里的消息应该发送到Agent端点,所以他们可以毫不拖延地处理。另一方面,如果Agent端点上的所有计算机当前都已关闭,则不应将任何Agent消息发送到PriorityAgent,他们只需等待Agent计算机回来。

我一直在研究实现这一目标的正确方法,并且没有看到很多结果。我想这不是一个闻所未闻的场景,所以我的假设是我在寻找错误的东西或以错误的方式思考这个问题。不过,我想出了几个可能的解决方案:

  1. 分别跟踪PriorityAgent台机器的心跳,并添加一个mutator或行为,以便在PriorityAgent端点发出Agent端点时将其更改为PriorityAgent端点。

  2. 短暂过期Agent消息,并以某种方式处理将消息重定向到#The view def check_if_logged_in(request): if request.user.is_authenticated: return HttpResponse('logged-in') else: return HttpResponse('not-logged-in') #The jQuery function ajax_check(){ $.get( 'the-view-url' ).done(function(response){ if (response === 'not-logged-in'){ location.reload(true); } }).fail( // something else ); } setInterval(ajax_check, 15000) 端点的过期时间。我不确定这是否真的可行。

  3. 这些解决方案中的一个是正确的轨道,还是完全偏离基础?

2 个答案:

答案 0 :(得分:1)

我是Dennis van der Stelt和我为NServiceBus的制造商特别软件公司工作。

根据我的理解,PriorityAgentAgent已经在多台计算机上扩展了?然后他们都根据竞争消费者模式工作。换句话说,两台机器都试图从同一队列中获取消息,其中只有一个会赢,并开始处理消息。

您还在谈论高可用性。因此,当PriorityAgent发生故障时,另一台机器将会启动它。这是我不明白的。为什么要故障转移到Agent,这在我看来是一个逻辑上不同的端点?如果它在逻辑上不同,它如何处理PriorityAgent消息?如果它可以处理相同的消息,它似乎在逻辑上是相同的端点。那么为什么要区分PriorityAgentAgent

除此之外,SQL Server还具有各种功能(如Always-On),以确保它不会(完全)关闭。为什么尝试使用自定义构建解决方案来解决困难的场景,当SQL Server已经为您解决了这个问题?

另一种情况可能是PriorityAgent应该处理优先级案例。像首选客户或高价值客户。当(例如)许多订单(读取:消息)进入时,有时会使用它,但我们希望比普通客户更快地处理高价值客户。但由于消息量的增加,高价值客户也会与常规客户一起排在队列后面。解决方案可以是发布这些消息,并且有两个不同的端点(具有不同的队列)订阅此消息。两者都接收每个唯一的消息,但检查它是否是他们应该处理的消息。 Agent会忽略高价值客户,PriorityAgent会忽略常客。

这些是可用作标准消息传递模式的一些解决方案,或用于解决您的问题的基础架构解决方案。同样,我并不完全清楚你在寻找什么。如果您想继续讨论;也许你想给support@particular.net发电子邮件,我们可以在那里继续讨论。

答案 1 :(得分:1)

你没有看到很多人这样做,因为它被认为是反模式。或者更确切地说是两个反模式中的一个。

1)您要发送命令,在这种情况下,命令的RECEIVER定义合同。为什么要将PriorityAgent定义的命令发送到Agent?那里应该没有耦合。命令属于ONE逻辑端点/队列。

2)或者您要发布由发布者定义的事件,PriorityAgentAgent作为订阅者。这两个用户应该100%自主,不分享任何东西。检查这两个逻辑单独实体之间的心跳/共享信息是一件坏事。为什么首先将它们分开呢?如果他们彼此了解“肮脏的秘密”,他们应该是同一回事。

如果您主要担心的是,如果托管它的计算机关闭,并且想要使用托管PriorityAgent的计算机作为备份,则不会处理Agent消息,只需部署PriorityAgent那里也是。一台机器可以运行多个端点就好了。

通过这种方式,您可以利用其他计算机,但不必将相同的命令发送到不同的逻辑端点或通过某些反向通道将两个不同的逻辑端点耦合在一起。