多线程 .NET RabbitMQ 发布者

Sim*_*ood 5 .net c# multithreading rabbitmq

我们有以下使用 .NET RabbitMQ 库的场景:

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

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

1) 一个单独的“发布者”实例,所有工作线程都可以通过一个连接和 IModel 访问它(使用“锁”来同步对 IModel 的访问)

2) 一个单独的“发布者”实例,所有工作线程都可以通过一个连接访问它,并为每个发送请求创建一个新的 IModel。

或者是其他东西?

End*_*ion 6

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

尽管您没有提到是否需要事务以实现消息传递的更高可靠性,但必须在事务模式下设置通道,并且每次传递可能需要一个事务。

每次交付使用新模型可确保更简单的错误管理,但显然会降低吞吐量(使用事务也是如此)。

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

举个例子,在一个开发机器上,一个windows服务使用一个单线程(反序列化,制作一些业务逻辑,最后通过打开/关闭连接和模型使用事务发送一个新的序列化消息)可以实现大约3000条消息每秒处理。(序列化是通过 XmlSerializer 完成的,它比 DataContractSerializer 最差)