内容参考自:https://liuyueyi.github.io/hexblog/2018/05/27/RabbitMQ%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/
RabbitMQ是一个消息队列,消息队列的主要目的实现消息的生产者和消费者之间的解耦,支持多应用之间的异步协调工作。
可以划分为三个角色: Producer, Queue, Consumer
RabbitMQ基本概念
生产者,将消息投递给Exchange,然后由Exchange将消息路由到对应的Queue上,供消费者消费,那么这个路由有哪些方式呢?
Direct策略
消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中
简单来讲,就是路由键与队列名完全匹配
举例说明
Exchange和两个队列绑定在一起:
Fanout策略
从上图也可以看出,这种策略,将忽略所谓的routing key,将消息分发到所有绑定的Queue上,更加类似我们理解的广播模式
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上
可以理解为直接策略的进阶版,直接策略是完全精确匹配,而topic则支持正则匹配,满足某类指定规则的(如以xxx开头的路由键),可以键消息分发过去
#
匹配0个或多个单词*
匹配不多不少一个单词Producer发送消息时需要设置routing_key,
test.orange.mm
消息,则会路由到Q1;而如果是 test.orange
则无法路由到Q1,因为Q1的规则是三个单词,中间一个为orange,不满足这个规则的都无效test.qq.rabbit
或者 lazy.qq
都可以分发到Q2;即路由key为三个单词,最后一个为rabbit或者不限制单词个数,主要第一个是lazy的消息,都可以分发过来test.orange.rabbit
消息,则Q1和Q2都可以满足Headers策略
这个实际上用得不多,它是根据Message的一些头部信息来分发过滤Message,忽略routing key的属性,如果Header信息和message消息的头信息相匹配
主要使用的消息分发策略有三个,直接,路由和扇形,简单的小结下应用场景和区别
a. Direct Exchange
直接完全匹配模式,适用于精准的消息分发
b. Topic Exchange
Routing Key的匹配模式,支持Routing Key的模糊匹配方式,更适用于多类消息的聚合
c. Fanout Exchange
忽略Routing Key, 将消息分配给所有的Queue,广播模式,适用于消息的复用场景
消息队列的一个重要指标,当有消费者获取了消息之后,对这个消息我应该怎么办?是直接删除还是等某个合适的机会再删除?又或者是干脆不删除,就留着了?
在实际的应用场景中,消息正常消费之后,我们希望的是这个消息就不要了,但是消费的过程中如果出现了bug,则希望不要删除消息,等我修复这个bug后,可以把这个消息重新的投递给我
Consumer接收到了消息之后,必须返回一个ack的标志,表示消息是否成功消费,如果返回true,则表示消费成功了,然后这个消息就会从RabbitMQ的队列中删掉;如果返回false,且设置为重新入队,则这个消息可以被重新投递进来
通常实际编码中,默认是自动ACK的,如果消息的重要性程度较高,我们应该设置为主动ACK,在接收到消息之后,自主的返回对应的ACK信息