ruby - RabbitMQ Bunny 并行消费者
问题描述
我已经构建了一个应用程序,它由一个发布者、几个队列和每个队列的几个消费者组成。队列(包括队列)上的消费者共享通道。其他队列使用不同的通道。我观察到,对于不同的队列,任务正在并行处理,但对于特定队列,这并没有发生。如果我一次将多条消息发布到特定队列,则只有一个消费者工作,而其他消费者则等到工作结束。我应该怎么做才能让消费者并行工作?
workers.each do |worker|
worker.on_delivery() do |delivery_info, metadata, payload|
perform_work(delivery_info, metadata, payload)
end
queue.subscribe_with(worker)
end
这就是我为特定队列注册所有消费者的方式。该操作perform_work(_,_,_)
相当昂贵,需要几秒钟才能完成。
解决方案
RabbitMQ 在 的概念后面工作channels
,并且通道通常不打算在线程之间共享。此外,默认情况下,通道的工作线程池大小为 1。通道类似于会话。
在您的情况下,您有多个消费者共享一个队列和通道,并在通道的事件处理程序中执行长时间的工作。
有两种方法可以解决此问题:
- 为每个消费者分配一个频道,或者
- 在创建时设置通道的工作池大小请参阅此文档
我建议每位消费者使用 1 个渠道,因为它引起意外副作用的可能性较低。
推荐阅读
- git - .gitignore 应该放在 React-Native expo 应用程序的什么位置?
- ecmascript-6 - 这个 ES6 解构对象数组有什么问题?
- sql - SQL JOINS(如何连接值)
- python - 如何注册一个 Numpy 数组?
- javascript - 使用 gatsby-plugin-sitemap 仅生成一页到站点地图
- linux - 什么是 docker --kernel-memory
- python - 交互式股票图表,带有滑块的分步动画。Matplolib 和 Jupyter
- oracle - WHERE 子句中的 CASE WHEN 因缺少关键字错误而失败
- css - CSS LinearGradient 停止偏移属性
- node.js - define() 不是函数