Work Queues(Task Queues)简介
工作队列(任务队列)的主要目的是避免立即执行资源密集型任务以至于需要长时间的等待其完成。代替方案是我们可以定时的让任务稍后执行。
我们将一个任务(task)封装为一个消息(message)发送到一个队列(queue)中。后台的工作进程(worker process)会将任务从队列中弹出并最终执行该任务。任务将在多个工作进程之间共享。
![](https://img.haomeiwen.com/i7391491/d88c3f857264bb67.png)
示例
总结
Exchange类型
实现Work Queues(Task Queues)的Exchange类型为direct
。
在示例中,发送者(Tut2Sender
)使用了rabbitTemplate.convertAndSend(String routingKey, Object object)
方法来发送消息到队列。
![](https://img.haomeiwen.com/i7391491/e803f663ad38aaca.png)
看一下该方法的说明。
![](https://img.haomeiwen.com/i7391491/88d438de15c12de5.png)
上面提到,将Java对象转换成Amqp的
Message
,并指定routingKey
将其发送到默认的exchange(default exchange)。其实
default exchange
在Spring AMQP中就是direct
类型的。![](https://img.haomeiwen.com/i7391491/573f358713376da8.png)
Fair dispatch 和 Round-robin dispatching
当消息在消费者处理完成后,消费者会反馈一个确认消息(ack),以表示它已经完成了目前分配到的消息任务,可以接收下一条消息。
- Rabbit默认情况
RabbitMQ默认使用循环调度模式(Round-robin dispatching),即队列中的消息会按顺序依次发送给连接到它的消费者中去。
此时Rabbit不关心消费者是否反馈了确认消息(ack),只要有新的消息添加到队列中,它都会取出并发送给消费者。 - Spring AMQP
在Spring AMQP中,默认使用公平转发模式(Fair dispatch)
不会将新的消息发送给正在执行消息任务的消费者,而是发送给处于空闲状态的消费者。
![](https://img.haomeiwen.com/i7391491/d71b2a6507857056.png)
从上面的结果也可以看到,当instance1接收到Hello...3并执行,需耗时3s;此时instance2接收到耗时1s的Hello.4;当instance2执行完成后,instance1仍在执行Hello...3,此时rabbit将Hello..5分给了空闲的instance2,而不是正在执行当前消息任务的instance1。
网友评论