RabbitMQ
简介
RabbitMQ是一个由erlang语言编写的、开源的、在AMQP基础上完整的、可复用的企业消息系统。支持多种语言,包括java、Python、ruby、PHP、C/C++等。
概念
生产者(Producer)
- 发送消息的应用。
消费者(Consumer)
- 接收消息的应用。
队列(Queue)
- 存储消息的缓存。
消息(Message)
- 由生产者通过RabbitMQ发送给消费者的信息。
连接(Connection)
- 连接RabbitMQ和应用服务器的TCP连接。
通道(Channel)
- 连接里的一个虚拟通道。当你通过消息队列发送或者接收消息时,这个操作都是通过通道进行的。
交换机(Exchange)
- 交换机负责从生产者那里接收消息,并根据交换类型分发到对应的消息列队里。要实现消息的接收,一个队列必须到绑定一个交换机。
绑定(Binding)
- 绑定是队列和交换机的一个关联连接。
路由键(Routing Key)
- 路由键是供交换机查看并根据键来决定如何分发消息到列队的一个键。路由键可以说是消息的目的地址。
特性
优点
- 1、异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。
2、应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。
3、流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请求。
缺点
- 1、可用性降低。(强依赖消息通知业务处理)
2、一致性降低。(消息的异步性,导致其动作完整性无法保证)
3、复杂度提升。(考虑数据传输可靠性,数据重复处理等等问题)
消息发送模式
简单队列
- (1)生产者将消息发送到队列,消费者从队列获取消息。
(2)一个队列对应一个消费者。
工作队列
- (1)一个生产者,多个消费者。
(2)一个消息发送到队列时,只能被一个消费者获取。
(3)多个消费者并行处理消息,提升消息处理速度。 - 注意:channel.basicQos(1)表示同一时刻只发送一条消息给消费者。
发布/订阅模式
- (1)一个生产者,多个消费者。
(2)每一个消费者都有自己的一个队列。
(3)生产者没有将消息直接发送到队列,而是发送到交换机。
(4)每一个队列都要绑定到交换机。
(5)生产者发送的消息,经过交换机到达队列,实现一个消息被多个消费者获取的目的。
(6)交换机类型为“fanout”。 - 注意:交换机本身没有存储消息的能力,消息只能存储到队列中
路由模式
- (1)路由模式的交换机类型为“direct”。
(2)绑定队列到交换机时指定 key,即路由键,一个队列可以指定多个路由键。
(3)生产者发送消息时指定路由键,这时,消息只会发送到绑定的key的对应队列中。
主题模式
- 将路由键和某模式进行匹配。此时,队列需要绑定到一个模式上。符号“#”匹配一个或多个词,“*”匹配不多不少一个词。绑定队列到交换机指定key时,进行通配符模式匹配。
交换机
直连交换机:Direct exchange
- 直连交换机是一种带路由功能的交换机,一个队列会和一个交换机绑定,除此之外再绑定一个routing_key,当消息被发送的时候,需要指定一个binding_key,这个消息被送达交换机的时候,就会被这个交换机送到指定的队列里面去。同样的一个binding_key也是支持应用到多个队列中的。这样当一个交换机绑定多个队列,就会被送到对应的队列去处理。
扇形交换机:Fanout exchange
- 扇形交换机是最基本的交换机类型,它所能做的事情非常简单———广播消息。扇形交换机会把能接收到的消息全部发送给绑定在自己身上的队列。因为广播不需要“思考”,所以扇形交换机处理消息的速度也是所有的交换机类型里面最快的。
主题交换机:Topic exchange
- 发送到主题交换机上的消息需要携带指定规则的routing_key,
主题交换机会根据这个规则将数据发送到对应的(多个)队列上。
主题交换机的routing_key需要有一定的规则,交换机和队列的binding_key需要采用*.#.*…的格式,每个部分用.分开,其中:
*表示一个单词
#表示任意数量(零个或多个)单词。
首部交换机:Headers exchange
- 定义一个Hash的数据结构,消息发送的时候,会携带一组hash数据结构的信息,
当Hash的内容匹配上的时候,消息就会被写入队列
绑定交换机和队列的时候,Hash结构中要求携带一个键“x-match”,这个键的Value可以是any或者all,这代表消息携带的Hash是需要全部匹配(all),还是仅匹配一个键(any)就可以了。相比直连交换机,首部交换机的优势是匹配的规则不被限定为字符串(string)。
集群架构模式
主备模式
- 就是一个主/备方案(主节点如果挂了,从节点提供服务而已)
远程模式
- 远距离通信和复制,就是我们可以把消息进行不同数据中心的复制工作,我们可以跨地域的让两个mq集群互联。
模型变成了近端同步确认,远端异步确认方式,大大提高了订单确认速度,并且还能保证可靠性。
镜像模式
- 就是实现数据的同步,一般来讲是2-3个实现数据同步(对于100%数据可靠性解决方案一般是3个节点)
,保证100%数据不丢失,在实际工作中用的最多的。
多活模式
- 采用双中心模式(多中心),那么在两套(或多套)数据中心中各部署一套RabbitMQ集群,各中心之间还需要实现部分队列消息共享。
实现异地数据复制的主流模式,
因为远程模式配置比较复杂,所以一般来说实现异地集群都是使用双活或者多活模式来实现的。
这种模式需要依赖rabbitmq的federation插件,可以实现继续的可靠AMQP数据通信,多活模式在实际配置与应用非常的简单。
XMind - Trial Version