一、初识RabbitMQ
RabbitMQ是一个开源的消息队列和队列服务器,用来通过普通协议在完全不同的应用之间共享数据,也就是说可以跨平台跨语言的进行数据共享。RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。
目前很多互联网公司如嘀嘀打车、美团、头条等都在使用RabbitMQ,这些公司选择使用RabbitMQ自然是因为它具有自己的许多优点:
- RabbitMQ底层采用Erlang语言进行编写: Erlang语言由Ericson设计,专门为开发concurrent和distribution系统的一种语言,在电信领域使用广泛,对于数据信息的传递有着十分优越的性能。
- 开源、性能优秀、稳定性保障
- 与SpringAMQP完美整合、API丰富
- 集群模式丰富、表达式配置、HA模式、镜像队列模型
- 保证数据不丢失的前提做到高可靠性、可用性
二.AMQP协议
Advanced Message Queuing Protocol(AMQP)即高级消息队列协议。
以下协议内容采自: https://www.cnblogs.com/frankyou/p/5283539.html
1.AMQP模型
- Broker: 接收和分发消息,RabbitMQ Server就是Message Broker,实现AMQP的实体服务。
- Virtual Host: 虚拟主机,用于进行逻辑隔离,最上层的消息路由,一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange和Queue。
- Connection: publisher/consumer和Broker之间的TCP连接。断开连接的操作只会在client端进行,Broker不会断开连接,除非出现网络故障或Broker服务出现问题。
- Channel: 几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道,客户端可建立多个Channel,每个Channel代表一个会话任务。如果每一次访问RabbitMQ都建立一个Connection,开销会很大,Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
- Exchange: 交换机,message到达broker的第一站,根据路由键转发消息到绑定的queue中去。常用的类型有:direct (point-to-point)、topic (publish-subscribe) 和 fanout (multicast)。
- Queue: 消息队列,消息最终被送到这里等待consumer取走
- Binding: exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
- Routing key: 一个路由规则,虚拟机可用它来确定如何路由一个特定消息。
- Message: 消息,服务器和应用程序之间传送的数据,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性Body则是消息体内容。
2.典型例子
生产者发送消息到broker server(RabbitMQ)。在Broker内部,用户创建Exchange/Queue,通过Binding规则将两者联系在一起。Exchange分发消息,根据类型/binding的不同分发策略有区别。消息最后来到Queue中,等待消费者取走。
在这个过程中,生产者在发送信息时候会指定发送到哪个exchange,并且指定路由规则。
3.Exchange类型
Exchange有多种类型,但是最常用的有Direct/Fanout/Topic三种
- Direct: Message中的“routing key”如果和Binding中的“binding key”一致, Direct exchange则将message发到对应的queue中。
- Fanout: 每个发到Fanout类型Exchange的message都会分到所有绑定的queue上去。
- Topic: 根据routing key,及通配规则,exchange将分发到目标queue中,这也是比较常用的交换机类型。
- Routing key中可以包含两种通配符,类似于正则表达式
- "#"通配任何零个或多个word
- "*"通配任何单个word
- Routing key中可以包含两种通配符,类似于正则表达式