【RabbitMQ学习笔记#2】队列

一、什么是队列?

队列是AMQP消息通信的基础模块,为消息提供了等待被消费的场所。对负载均衡来说,队列是绝佳方案。只需要附加一堆消费者,并让RabbitMQ以循环的方式均匀地分配发来的消息。队列是消息的最后的终点,除非消息进入黑洞。

二、该由谁来创建队列?

如果不能承担消息进入黑洞而丢失,则消费者和生产者都应该尝试创建去创建队列。如果能承担丢失消息,或者实现一种方法重新发布未处理的消息,可以只让消费者声明队列。

三、如何创建队列?

如果消费者在同一条信道上订阅了另外一个队列,则无法声明队列,因此需要先取消订阅,将信道设置为“传输”模式。

创建队列时,需要指定队列名称,如果不指定队列名称,RabbitMQ会分配一个随机名称。如果声明一个已经存在的队列,只要声明的参数完全匹配现存的队列,RabbitMQ什么都不会做,并成功返回。检测队列是否存在,可以把queue.declare的passive设置为true,如果队列存在则成功返回,否则返回一个错误并不创建队列。 消费者在订阅队列时需要队列名称,并且在创建绑定时也需要指定队列名称。

四、消费者从特定队列接收消息的方式

(1)持续订阅,通过AMQP的basic.consume命令订阅。消费者消费(或拒绝)最近接收的消息,会自动接收下一条。

(2)非持续订阅,通过AMQP的basic.ge命令实现,此方式获得单条消息后会取消订阅。不建议将basic.get放在循环中来实现basic.consume。对于高吞吐量要使用basic.consume 队列中,无消费者时,消息会在队列中等待。

队列中,有多个消费者时,队列将会把消息以循环的方式发给消费者。每条消息只会发给一个订阅的消费者。 消费者接收到的每一条消息都必须进行确认。确认的方式:

(1)通过AMQP的basic.ack命令显式地向RabbitMQ发送一个确认。

(2)订阅队列时将auto_ack参数设置为true.如果auto_ack==true,一旦消费者接收消息,RabbitMQ会自动视其确认了消息。消费者对消息的确认和告诉生产者消息已被接收是两件毫无关系的事情。 只有消息被消费者确认之后,队列才能安全地把消息从队列中删除。 如果消费者收到一条消息,在对消息进行确认之前从RabbotMQ断开了连接(或取消消息订阅),RabbitMQ会认为这条消息没有分发,然后重新发给下一个消费者。如果忘记确认消息的话,RabbitMQ将不会给消费者发送更多消息。

五、拒绝消息的方式

(1)把消费者从RabbitMQ服务器断开连接。缺点是会额外增加RabbitMQ的负担。

(2)2.0.0或更新版本,使用AMQP的basic.reject命令。如果把reject命令的requeue参数设置为true,RabbitMQ将会将消息重新发送给下一个订阅者。

【参考资料】

《RabbitMQ实战》

0

发表评论

电子邮件地址不会被公开。 必填项已用*标注

微信扫一扫,分享到朋友圈

【RabbitMQ学习笔记#2】队列
返回顶部