在我们的项目中,我们希望在"任务队列中使用RabbitMQ"模式传递数据。
在生产者方面,我们构建一些TCP服务器(在node.js中)来recv 高并发数据并将其发送到MQ而不做任何事情。
在消费者方面,我们使用JAVA客户端从中获取任务数据 MQ,处理它然后确认。
所以问题是: 要获得最大消息传递吞吐量/性能(例如,400,000 msg /秒),最好有多少个队列?更多队列是否意味着更好的吞吐量/性能?还有什么我应该注意到的吗? 在这种情况下使用RabbitMQ的任何已知最佳实践指南?
任何评论都非常感谢!!
答案 0 :(得分:30)
根据我从rabbitmq-discuss邮件组获得的回复,您还可以尝试提高吞吐量并减少延迟:
使用更大的预取计数。小的价值会影响表现。
主题交换比直接交换或扇出交换慢。
确保队列保持简短。较长的队列会产生更多的处理 开销。
如果您关心延迟和消息速率,请使用较小的消息。 使用有效格式(例如,避免使用XML)或压缩有效负载。
使用HiPE进行实验,这有助于提高性能。
避免交易和持久性。还要避免立即发布 或强制模式。避免HA。群集也会影响性能。
如果有的话,您将在多核系统上获得更好的吞吐量 多个队列和消费者。
至少使用v2.8.1,它引入了流量控制。确保 内存和磁盘空间警报永远不会触发。
虚拟化可以带来很小的性能损失。
调整您的操作系统和网络堆栈。确保你提供的不仅仅是 内存。提供快速核心和RAM。
答案 1 :(得分:28)
为了在RabbitMQ中获得最佳性能,请遵循其创建者的建议。来自RabbitMQ blog:
RabbitMQ的队列在空的时候最快。当队列是 空的,它有消费者准备接收消息,然后尽快 队列接收到一条消息,直接发送到 消费者。对于持久队列中的持久性消息,是的, 它也将转到磁盘,但这是以异步方式完成的 被大量缓冲。重点是很少有簿记 需要完成,很少有数据结构被修改,非常 需要分配额外的内存。
如果你真的想深入研究RabbitMQ队列的性能,那么他们的other blog entry会更深入地进入数据。
答案 2 :(得分:2)
您将通过更大的预取计数来增加吞吐量,同时为您的消费者确认多条消息(而不是为每条消息发送ACK)。
但是,当然,在(http://www.rabbitmq.com/amqp-0-9-1-reference.html#basic.ack)上带有多个标志的ACK需要您的消费者应用程序(http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-August/029600.html)上的额外逻辑。您必须保留从代理传递的消息的传递标记列表,它们的状态(无论您的应用程序是否已处理它们)以及当所有消息都已发送时确认每个第N个传递标记(NDTAG)已经处理了小于或等于NDTAG的标签。