目录
介绍
案例
测试
改进:
-
介绍
- Work queues
- 也被称为(Task queues),任务模型
- 简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息
- 当消息处理比较耗时的时候,可能生产消息的速度会远远大于消息的消费速度
- 长此以往,消息就会堆积越来越多,无法及时处理
- 此时就可以使用 work 模型,多个消费者共同处理消息处理,速度就能大大提高了
- 提高消息处理速度,避免队列消息堆积
-
案例
- 模拟WorkQueue,实现一个队列绑定多个消费者
- 基本思路如下:
- 1.在publisher服务中定义测试方法,每秒产生50条消息,发送到simple.queue
- 2.在consumer服务中定义两个消息监听者,都监听simple.queue队列
- 3.消费者1每秒处理50条消息,消费者2每秒处理5条消息
-
测试
- 启动ConsumerApplication后
- 再执行publisher服务中刚刚编写的发送测试方法testWorkQueue
- 可以看到消费者1很快完成了自己的25条消息
- 消费者2却在缓慢的处理自己的25条消息
- 也就是说消息是平均分配给每个消费者,并没有考虑到消费者的处理能力
- 这样显然是有问题的
- 结果是两个消费者平均处理了50条消息,是由于rabbitmq内部的 消息预取机制
- 消息预期指当大量消息到达队列时,两个消费者会提前将消息取过去(轮流拿)
-
改进:
- 在Spring中有一个简单的配置,可以解决这个问题
- 设置prefetch这个值,可以控制预取消息的上限
- 修改consumer服务的application.yml文件,添加配置:
- 实现了能者多劳