前言
消息队列的3个作用:解耦、异步、削峰
。
一、RabbitMQ的组成部分(含图解)
Connection
:publisher /consumer和broker之间的tcp之间的连接。Channel
:Channel 是在connection 内部建立的逻辑连接。Channel 作为轻量级的Connection 极大减少了操作系统建立TCP Connection 的开销。Broker
:接收和分发消息的应用。Virtual Host
:用来环境隔离,每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。Binding
:exchange 和queue之间的虚拟连接,binding中可以包含routing key,binding 信息被保存到exchange中的查询表中,用于message的分发依据。Exchange
:message到达broker的第一站,根据message中的routing key和查询表中Binding的routing key进行匹配,匹配上就分发消息到quene中去。常用的类型有:direct(point-topoint),topic(publish-subscribe)andfanout(multicast)。Queue
:消息被发送到这里等待consumer取走。
二、Exchange的4种类型
fanout
:每个发到fanout类型交换器的消息都会分到所有绑定的队列上去。direct
:消息中的路由键(routing key)如果和Binding中的routing key一致,交换器就将消息发到对应的队列中。topic
:消息中的路由键(routing key)如果和Binding中的routing key模式匹配上,交换器就将消息发到对应的队列中。headers
:匹配AMQP消息的header而不是路由键(Routing-key),此外headers交换器和direct交换器完全一致,但是性能差了很多,目前几乎用不到了。
三、RabbitMQ的6种工作模式
普通队列模式(无Exchange)
:一个生产者,一个队列,一个消费者。工作队列模式(无Exchange)
:一个生产者,一个队列,多个消费者。多个消费者中只会有一个会成功地消费消息。发布/订阅模式(Exchange=fanout)
:一个生产者,一个交换机,多个队列,多个消费者。每个队列中消息一致,每个消费者消费同样的消息。Routing路由模式(Exchange=direct)
:一个生产者,一个交换机,多个队列,多个消费者。每个队列有自己唯一的Routing Key,根据message的Routing Key和binding中的Routing Key进行匹配,匹配上就分发到队列中去,给消费者消费。Topic 主题模式(Exchange=topic)
:一个生产者,一个交换机,多个队列,多个消费者。每个队列有自己唯一的Routing Key(含模糊匹配字符,如*),根据message的Routing Key和binding中的Routing Key(含模糊匹配字符)进行匹配,匹配上就分发到队列中去,给消费者消费。RPC 模式(Exchange=direct)
:使用MQ可以实现RPC的异步调用。客户端即是生产者也是消费者,向RPC请求队列发送RPC调用消息,同时监听RPC响应队列。服务端监听RPC请求队列的消息,收到消息后执行服务端的方法,得到的结果发送到RPC响应队列。
四、相关概念:死信队列
死信队列(DLX Dead-Letter-Exchange):专门存放未被正常消费的消息的队列。
3种导致消息变成死信的原因
- 消息过期(过期时间TTL)。
- 队列达到最大长度。
- 消息被消费者拒绝且requeue=false。
2种死信队列应用场景
- 保证消息不被丢失,专门存放消息。
- 作为延迟队列(delay),将达到过期的消息放在该队列中重新消费。需要
两个交换机(生产者通过交换机发送给普通队列、普通队列通过交换机将死信转发给死信队列)
两个队列(普通队列、死信队列 【注:队列模式为direct】)
两个router key(生产者绑定交换机之间、死信交换机到死信队列之间)