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

时间:2013-02-07 12:56:35

标签: c# masstransit

背景:

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

我们甚至拥有自己的基于Web的管理控制台来查看消息队列并重新发送失败的消息。该工具基于 BusDriver 示例,并直接在MSMQ上工作 - 它将邮件从xxx_error复制到xxx并重新发送。

目前情况:

我们考虑转移到RabbitMQ,它似乎更快,更具可扩展性。但是,当然,MSMQ管理控制台变得毫无用处,我不喜欢编写另一个版本的控制台来处理RabbitMQ队列。我宁愿选择一条通用路由,将失败的消息放入我自己的存储库中,该存储库将独立于MSMQ传输。

听起来很简单。这就是我们提出具体问题的地方。

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

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

这似乎可以用:

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

senderbus.GetEndpoint( new Uri( "msmq://localhost/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 );

提前感谢您对此提出的任何意见。

1 个答案:

答案 0 :(得分:0)

我不会。

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

要记住的一个棘手的事情是端点!=消费者。端点为该总线上的所有消费者提供服务,而端点地址对于存储和重新发布将是微不足道的,而个人消费者则不会。

人们建议的是幂等消费者:http://en.wikipedia.org/wiki/Idempotence#Computer_science_meaning

我不担心消费者没有订阅特定消息,使用静态类型来建立您正在升级的路由信息​​。在升级过程中处理这些消息。