我们有以下使用 .NET RabbitMQ 库的场景:
工作线程从队列中获取“请求”消息,并将它们分派(dispatch)到多个工作线程上进行处理。完成后,每个工作线程都会发送另一条消息。
我的问题是人们为发件人推荐什么“模式”以获得最佳的吞吐量和稳定性?例如:
1) 一个单例“发布者”实例,所有工作线程都可以使用单个连接和 IModel(使用“锁”来同步对 IModel 的访问)访问
2) 一个单例“发布者”实例,所有工作线程都使用一个连接访问它,并为每个发送请求创建一个新的 IModel。
还是别的?
最佳答案
根据 RabbitMQ 用户指南“IModel 实例不应被多个线程同时使用:应用程序代码应为 IModel 实例维护线程所有权的清晰概念” 如果 IModel 是共享的,应该像您所说的那样使用锁,但在我看来,这会导致代码更复杂,因为在断开连接的情况下,连接和模型应该保持事件状态。
虽然您没有提及是否需要事务以实现消息传递的更高可靠性,但必须将 channel 设置为事务模式,并且您可能每次传递都需要一个事务。
每次交付使用新模型可确保更简单的错误管理,但它 显然会降低吞吐量(使用事务也是如此)。
根据您的要求,您还可以使用非持久队列和直接或扇出交换器来提供更好的吞吐量。
例如,在一台开发机器上,一个窗口服务使用一个线程从队列中消费消息(反序列化,制作一些业务逻辑,最后通过打开/关闭连接和模型使用事务发送一个新的序列化消息可以实现每秒处理大约 3000 条消息。 (序列化是通过 XmlSerializer 完成的,它比 DataContractSerializer 更糟糕)
关于c# - 多线程 .NET RabbitMQ 发布者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9369691/