首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NServicebus和同一个SQS队列上的多个消息类型

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

Stack Overflow用户
提问于 2022-08-04 19:51:18
回答 1查看 74关注 0票数 0

我对NServicebus相当陌生,遇到了一个我认为可能与我的体系结构有关的问题。

我有一个包含三个SNS主题的SQS队列。那么,让我们说:

代码语言:javascript
复制
Queue1
    MessageType1
    MessageType2
    MessageType3

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

代码语言:javascript
复制
                                         ---------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缺乏理解,我需要重新考虑我的设计。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-04 20:38:11

是的,你有一些误解,看看我能不能帮你澄清一下。

你所说的“订户”不是订户。队列定义一个逻辑端点,多个进程监视单个队列是端点实例,而不是订阅服务器。他们合作扩大单个队列的处理。

如果选择的话,单个队列可以处理多个消息类型,但是当任何端点实例请求队列中的消息时,它都无法控制它将得到哪种类型。队列只是一行,它将得到下一个消息,不管消息是什么。

因此,所有端点实例都必须有可能通过该队列的消息的所有消息处理程序,否则您将得到该错误。

拥有多个端点实例的唯一原因是可伸缩性(一次处理更多消息)或可用性(即使重新启动ServerA上的进程消息)。

实际订户是不同的。订阅者是单个SNS主题将消息副本传递给多个队列的地方(用SQS/SNS的说法)。您可以发布OrderPlaced,其中一份副本进入销售队列,这样我们就可以存储已进行的销售,并将一份副本发送到计费队列(以便支付信用卡费用),另一份副本则进入仓库队列(这样他们就可以开始准备将其放入框中的过程)。

订户的强大之处在于,在您创建另一个名为CustomerCare的订户时,您可能会在6个月后创建一个订阅OrderPlaced的订阅者,以便存储该客户在过去一年中购买的总金额(参见批次作业死亡),而重要的一点是,您不必回到订单所在的原始代码中--您只需添加另一个具有自己队列的订阅者即可。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73241559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档