RabbitMQ文档对此并不清楚(因为这可能是不可能的),因此我的问题是:我有大量的队列,所有队列都启用了单个活动消费者。现在,我有多个消费者应用程序示例在运行。我 * 希望 * 单个活动消费者将在我的消费者应用程序上轮换,但不幸的是,第一个出现的示例是我所有队列的活动消费者。其他示例只是空闲的。是否有可能在启用SAC的情况下将所有队列的负载分布到所有示例上?
aurhwmvo1#
不幸的是,RabbitMQ似乎没有内置的东西来实现这一点。我通过向应用程序的每个示例传递两个环境变量来解决这个问题。假设我的应用程序有4个并行运行的示例,每个示例都获得环境变量INSTANCE_CNT = 4和INSTANCE_IDX = 0到INSTANCE_IDX = 3。初始化队列时,我确保队列是有序的。每个示例初始化所有不存在的队列,但只将侦听器绑定到queue_idx % INSTANCE_CNT == INSTANCE_IDX所在的每个队列。这里,queue_idx是我的所有队列列表中的队列的idx。这样,示例0将监听队列0、4、8、12、16、...、示例1到1、5、9、13、15、...等等。不是最好的解决方案,但它有效。
queue_idx % INSTANCE_CNT == INSTANCE_IDX
1条答案
按热度按时间aurhwmvo1#
不幸的是,RabbitMQ似乎没有内置的东西来实现这一点。我通过向应用程序的每个示例传递两个环境变量来解决这个问题。假设我的应用程序有4个并行运行的示例,每个示例都获得环境变量INSTANCE_CNT = 4和INSTANCE_IDX = 0到INSTANCE_IDX = 3。
初始化队列时,我确保队列是有序的。每个示例初始化所有不存在的队列,但只将侦听器绑定到
queue_idx % INSTANCE_CNT == INSTANCE_IDX
所在的每个队列。这里,queue_idx是我的所有队列列表中的队列的idx。这样,示例0将监听队列0、4、8、12、16、...、示例1到1、5、9、13、15、...等等。不是最好的解决方案,但它有效。