公平调度 vs 轮询调度
默认情况下,RabbitMQ将按顺序将每个消息发送给下一个使用者。平均每个消费者将获得相同数量的消息。这种分发消息的方式称为循环。在这种模式下,调度不一定像我们希望的那样工作。例如,在两个工人(消费者)的情况下,当信息很多或很少,会出现一个工人将不断忙碌,另一个将几乎不做任何工作的情况。RabbitMQ 对此一无所知,仍然会均匀地分发消息。这是因为RabbitMQ 只是在消息进入队列时才分派消息。它不查看用户未确认的消息的数量。它只是盲目地将每个第 n 条消息分派给第 n 个消费者。
然而,“公平调度”是 Spring AMQP 的默认配置。SimpleMessageListenerContainer
将 DEFAULT_PREFETCH_COUN
T 的值定义为250。如果 DEFAULT_PREFETCH_COUNT
设置为0,则如上所述轮询传递。
但是,在默认情况下将 prefetchCount 设置为250时,这告诉 RabbitMQ 不要向工人一次性发送超过250条消息。或者,换句话说,当未打包的消息数量为250时,不要将新消息发送给工人。相反,它将把它发送给下一个不太忙的工人。
关于队列大小的注意事项
如果所有的工人(消费者)都很忙,你的队伍可能会排满。你需要关注这个问题,也许需要增加更多的工人,或者有其他的策略。
通过使用Spring AMQP,您可以为消息确认和公平调度配置合理的值。Spring AMQP提供的队列的默认持久性和消息的持久性允许消息在RabbitMQ重启时仍然存在。