NServicebus和同一SQS队列上的多个消息类型



我是NServicebus的新手,遇到了一个问题,我认为这个问题可能与我的体系结构有关。

我有一个包含三个SNS主题的SQS队列。所以我们说:

Queue1
MessageType1
MessageType2
MessageType3

我已经创建了三个NServicebus订阅者,它们都将作为三个独立的服务运行。每个订阅服务器都在监视Queue1,每个订阅服务器具有不同消息类型的处理程序。这是我设想如何工作的粗略草图:


---------MessageType3----------                  
|                               |
|     --MessageType2---------   |
|   /                        |  |
V  V                         |  |
[Outside Publisher] --MessageType1--> [Queue1] --MessageType1--> [Subscriber1]
|  |
|  |
/    
[Subscriber3]<--MessageType3---      ---MessageType2--> [Subscriber2]

外部服务已将MessageType1发布到Queue1。Subscriber1接收消息,进行一些处理,并将MessageType2和MessageType3发布回Queue1。然后订阅服务器2&3拿起各自的信息,做自己的事情。

但现在发生的情况是,哪个订阅者(1、2或3(获取初始MessageType1是随机的。所以Sub2会把它捡起来,并因为没有处理程序而出错

为什么会发生这种情况?我以为NServicebus只会接收它有处理程序的消息。NServicebus是否每个队列只喜欢一种消息类型?我是否需要为每种消息类型创建单独的队列?

我希望有一些方法可以配置三个订户服务,使其只接收预期的消息,但我意识到可能我对NServicebus的理解不足,我需要重新思考我的设计。

是的,这里有一些误解,让我们看看我是否可以帮助澄清它们。

你称之为";订阅者";不是订阅者。队列定义了一个逻辑端点,监视该单个队列的多个进程是端点实例,而不是订阅者。它们协作以扩展单个队列的处理。

如果您愿意,单个队列可以处理多种消息类型,但当任何端点实例从队列中请求消息时,它无法控制将获得哪种类型的消息。队列只是一行,它将获得下一个的消息,无论该消息是什么。

因此,所有端点实例都必须具有可能通过该队列的消息的所有消息处理程序,否则就会出现错误。

拥有多个端点实例的唯一原因是可扩展性(一次处理更多消息(或可用性(即使服务器B正在重新启动,也要在服务器a上处理消息(

实际订阅者不同。订阅服务器是指(用SQS/SNS的说法(单个SNS主题将消息的副本发送到多个队列。您发布OrderPlaced,一份副本进入销售队列,这样我们就可以存储销售,一份拷贝进入计费队列(这样信用卡就可以收费(,另一份拷贝则进入仓库队列(这样他们就可以开始准备放入盒子的过程。(

订阅者的强大之处在于,也许6个月后,你会创建另一个名为CustomerCare的订阅者,订阅OrderPlaced,以存储该客户在过去一年中购买的总金额(请参阅批量作业的死亡(,重要的是,你不必回到下订单的原始代码,只需添加另一个订阅者它自己的队列。

您可能想查看NServiceBus逐步教程,该教程详细介绍了这一点。

最新更新