C# 如何向特定订户重新发送消息?

C# 如何向特定订户重新发送消息?,c#,masstransit,C#,Masstransit,背景: 我们有一个基于MassTransit的消息传递子系统。它工作得很好,只需一些小问题就可以发送数千条消息。到目前为止,失败的消息被自动推送到xxx\u error队列。这也很有效 我们甚至有自己的基于web的管理控制台,可以查看消息队列并重新发送失败的消息。该工具基于总线驱动程序示例,直接在MSMQ上工作-它将消息从xxx\u error复制到xxx,并重新发送 当前情况: 我们考虑搬到RabBMQ,看起来更快,更具伸缩性。但当然,MSMQ管理控制台变得毫无用处,我不想再编写另一个版本的控

背景:

我们有一个基于MassTransit的消息传递子系统。它工作得很好,只需一些小问题就可以发送数千条消息。到目前为止,失败的消息被自动推送到
xxx\u error
队列。这也很有效

我们甚至有自己的基于web的管理控制台,可以查看消息队列并重新发送失败的消息。该工具基于总线驱动程序示例,直接在MSMQ上工作-它将消息从
xxx\u error
复制到
xxx
,并重新发送

当前情况:

我们考虑搬到RabBMQ,看起来更快,更具伸缩性。但当然,MSMQ管理控制台变得毫无用处,我不想再编写另一个版本的控制台来处理RabbitMQ队列。我宁愿采用一种通用的路由,将失败的消息放入我自己的存储库中,该存储库独立于MSMQ传输

听起来很简单。这就是我们有一个具体问题的地方

失败消息的存储库将包含(除其他属性外)消息正文和消息订阅者名称。稍后,我可以转到存储库,对消息进行反序列化并将其重新发送给特定订阅者

但是,我们不想
bus.Publish(msg)
,因为消息会再次击中所有订户,而不是先前失败的订户。我们想要的是将消息重新发送给一个订户

这在以下情况下似乎是可能的:

senderbus.GetEndpoint( new Uri( "rabbitmq://servername/subscriber1" ) ).Send( msg );

(取决于使用的运输工具)。通过这种方法,消息被传递给唯一的特定订阅者

问题是:

这是推荐的方法吗?我们有什么选择

可能的问题是,这种方法可能会忽略有关当前订阅的信息,并将消息直接传递到订阅队列。但是,订阅者可能不再订阅该类型的消息。因此,代码可能是这样的:

if ( subscriber1 still subscribes to messages of msg.GetType() ) <- how do to this?
   senderbus.GetEndpoint( new Uri( "rabbitmq://servername/subscriber1" ) ).Send( msg );
if(subscriber1仍然订阅msg.GetType()的消息)我不会

不确定您的管理控制台正在执行多少操作,但RabbitMQ的控制台可以执行所有操作,但可以将消息从一个队列移动到另一个队列。我自己也在寻找这个功能,希望有一个脚本可以专门用于此

需要记住的一件棘手的事情是端点!=消费者。端点服务于该总线上的所有使用者,虽然端点地址的存储和重新发布并不重要,但单个使用者不会

人们建议的是幂等消费者:


我不会担心消费者不会订阅特定的消息,使用静态键入来建立您正在查看的路由信息。作为升级过程的一部分,请注意这些信息。

我不太明白你所说的一切。例如,在公共交通的情况下,我相信队列==消费者(而对于使用RMQ的其他消息传递模型,这可能不是真的)。最终,我们决定坚持使用公共交通团队提供的公交车司机工具。在RMQ队列之间移动消息时,该工具按预期工作。然而,我感谢你的帮助,并感谢你的回答。我相信MassTransit没有它应得的受众-它是一个很好的框架,拥有相当小的社区。这很酷,尽管MassTransit中的queue==endpoint==IServiceBus实例,所以除非每个总线实例只有一个订户,订阅特定消息类型的所有使用者都将获得发送到该队列的消息。是讨论MassTransit的地方,作者们给予了惊人的支持。干杯我会接受你的答案,因为这似乎是唯一的答案:)
if ( subscriber1 still subscribes to messages of msg.GetType() ) <- how do to this?
   senderbus.GetEndpoint( new Uri( "rabbitmq://servername/subscriber1" ) ).Send( msg );