C#-多线程.NET RabbitMQ发布者

提问

使用.NET RabbitMQ库,我们有以下情形:

工作线程从队列中提取“请求”消息,并将其分派到多个工作线程上进行处理.完成后,每个工作线程都会发送另一个消息.

我的问题是,人们为发件人推荐哪种“模式”以获得最佳的吞吐量和稳定性?例如:

1)由所有工作线程使用单个Connection和IModel访问的单例“发布者”实例(使用“锁”同步对IModel的访问)

2)一个单例“发布者”实例,所有工作线程都可以通过一个Connection对其进行访问,并为每个发送请求创建一个新的IModel.

或者是其他东西?

最佳答案

根据RabbitMQ用户指南“ IModel实例不能同时被多个线程使用:应用程序代码应为IModel实例维护明确的线程所有权概念”
如果共享IModel,则应按您所说的那样使用锁,但我认为这会导致代码更加复杂,因为在断开连接的情况下,连接和模型应保持活动状态.

尽管您没有提到是否需要事务以提高消息传递的可靠性,但必须将通道设置为事务模式,并且可能每次传递都需要事务.

每次交付使用新模型可确保更简单的错误管理,但是
显然会减慢吞吐量(和使用事务一样).

您还可以根据需要使用非持久性队列以及直接或扇出交换,以提供更好的吞吐量.

例如,在开发机器上,Windows服务使用一个单线程来消耗队列中的消息(反序列化,进行一些业务逻辑,最后通过使用事务通过打开/关闭连接发送新的序列化消息,并且模型可以实现大约3000条消息)每秒处理一次.
(序列化是通过XmlSerializer完成的,这比DataContractSerializer还要差)

评论