我对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缺乏理解,我需要重新考虑我的设计。
发布于 2022-08-04 20:38:11
是的,你有一些误解,看看我能不能帮你澄清一下。
你所说的“订户”不是订户。队列定义一个逻辑端点,多个进程监视单个队列是端点实例,而不是订阅服务器。他们合作扩大单个队列的处理。
如果选择的话,单个队列可以处理多个消息类型,但是当任何端点实例请求队列中的消息时,它都无法控制它将得到哪种类型。队列只是一行,它将得到下一个消息,不管消息是什么。
因此,所有端点实例都必须有可能通过该队列的消息的所有消息处理程序,否则您将得到该错误。
拥有多个端点实例的唯一原因是可伸缩性(一次处理更多消息)或可用性(即使重新启动ServerA上的进程消息)。
实际订户是不同的。订阅者是单个SNS主题将消息副本传递给多个队列的地方(用SQS/SNS的说法)。您可以发布OrderPlaced,其中一份副本进入销售队列,这样我们就可以存储已进行的销售,并将一份副本发送到计费队列(以便支付信用卡费用),另一份副本则进入仓库队列(这样他们就可以开始准备将其放入框中的过程)。
订户的强大之处在于,在您创建另一个名为CustomerCare的订户时,您可能会在6个月后创建一个订阅OrderPlaced的订阅者,以便存储该客户在过去一年中购买的总金额(参见批次作业死亡),而重要的一点是,您不必回到订单所在的原始代码中--您只需添加另一个具有自己队列的订阅者即可。
您可能需要查看NServiceBus逐步教程,它详细介绍了这一点。
https://stackoverflow.com/questions/73241559
复制相似问题