C# 多线程.NET RabbitMQ发布服务器

C# 多线程.NET RabbitMQ发布服务器,c#,.net,multithreading,rabbitmq,C#,.net,Multithreading,Rabbitmq,使用.NET RabbitMQ库,我们有以下场景: 工作线程从队列中拾取“请求”消息,并将其分派到多个工作线程上进行处理。完成后,每个工作线程将发送另一条消息 我的问题是,为了获得最佳吞吐量和稳定性,人们建议发送方采用什么“模式”?。例如: 1) 所有工作线程通过单个连接和IModel访问的单个“发布者”实例(使用“锁”同步对IModel的访问) 2) 单个“发布者”实例,所有工作线程通过单个连接访问该实例,并为每个发送请求创建一个新的IModel 或者其他什么?根据RabbitMQ用户指南,“

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

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

我的问题是,为了获得最佳吞吐量和稳定性,人们建议发送方采用什么“模式”?。例如:

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

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


或者其他什么?

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

虽然您没有提到是否需要事务来实现更高的消息传递可靠性,但通道必须设置为事务模式,并且可能每次传递都需要事务

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

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

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

对于一些试验和测量来说,这听起来是一个很好的问题。我怀疑这里的变量太多,任何人都无法为您提供最适合您的特定用例的答案。可能最好让每个工作线程从消息队列中拾取消息,而不是让一个中央进程将工作分配给wo使用共享内存队列(RabbitMQ库中有一个线程安全的实现)可以完成您建议的任务主进程可以放置工作项,工作线程可以拾取它们。Thx两者都可以。Chris:会这样做,我真的希望有其他人的真实世界体验。道歉-过早地点击“发送”。Chris:会这样做,但我希望有其他人的类似场景的真实世界体验Yavor:我们实际上已经有了您建议的解决方案(单个使用者线程;共享内存队列;工作线程在处理完成时发出“确认”消息)。我真正感兴趣的是发送方的模式。谢谢-将此标记为已接受的答案,因为这里有一些有用的指针。作为记录,我们现在正在考虑构建一个“异步”发送方,该发送方使用共享队列和内部线程来执行实际发送。