RabbitMQ基础知识
在工作中常常会用到消息中间件RabbitMQ,但是自己却一直没合适的机会总结一些关于rabbitmq的知识,今天就总结一下这方面的知识
消息队列
消息,在应用间传送的数据。消息队列,应用间的通信方式,消息发送后可以立即返回,由消息队列来确保消息的可靠传递,发布者只负责讲消息发布到MQ中,消费者只管从MQ中取消息
为何使用消息队列
消息队列应该是一种应用间的异步协作机制
解耦
系统之间相互调用,耦合性太强,将消息写入消息队列,则需要消息的系统自己从消息队列中订阅
异步
非必要的业务逻辑以同步方式运行,太耗费时间,将消息写入消息队列,非必要逻辑以异步方式运行,加快响应速度
削峰
并发量大的时候,请求都到数据库,连接异常,系统可按照数据库能处理的并发量,从消息队列中慢慢拉取消息
优缺点
可用性降低 消息队列挂了,系统就挂了
复杂度增加 消息不重复消费、可靠传输
MQ选型:
ActiveMQ RabbitMQ RocketMQ Kafka
ActiveMQ 社区活跃程度比较低,主要研究下一代产品
RocketMQ Kafka 分布式环境 大的数据量
RabbitMQ 开源,管理界面,数据量不大,功能完备的MQ
RabbitMQ 特点:
由erlang 开发的AMQP 开源实现,AMQP 高级队列协议,应用层协议的开放标准
- 可靠性: 持久化 传输确认 发布确认
- 路由灵活:Exchange实现路由
- 消息集群: 多个rabbitmq服务器组成集群,逻辑上的broker
- 高可用:队列可以在集群的机器上进行镜像
- 多协议:
- 多语言:
- 管理界面:
- 跟踪机制:异常消息
- 插件机制:
消息模型:
producer-创建消息-发布到queue consumer-订阅queue
RabbitMQ基本概念:
RabbitMQ 是AMQP协议的开源实现,内部也是AMQP中的基本概念
- Message 消息,消息是不具名的,由消息头和消息题组成。消息体不透明,消息头可选属性组成,包括routing-key路由键,priority优先权,delivery-mode 持久化存储
- Publiser 消息生产者,向交换器发布消息的客户端应用程序
- Exchange 交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列
- Binding 绑定,消息队列和路由器之间的关联,一个绑定即基于路由键将交换器和消息队列连接起来的路由规则
- Queue 消息队列,保存消息直到发送给消费者,是消息的容器,也是消息的终点,一个消息可投入多个或者一个队列
- Connection 网络连接,eg:TCP连接
- Channel 信道,多路复用连接中的一条独立的双向数据流通道,信道是建立在真实TCP连接内地虚拟连信道发出去的,无论是发布消息、订阅队列、接收消息都是通过信道完成,对操作系统开销昂贵,所以引入信道,复用TCP连接
- Consumer 消息消费者,表示从一个消息队列中取得消息的客户端程序
- Virtual Host 虚拟主机,表示一批交换器、消息队列和相关对象,虚拟主机共享相同的身份认证和加密环境的独立服务域,每个vhost本质为mini rabbitmq服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,默认/
- Broker 消息队列服务器实体
AMQP中的消息路由
AMQP中增加了Exchange Binding角色,生产者把消息发布到Exchange上,消息最终到达队列并被消费者接收,而Binding决定交换器的消息发送到哪个队列
Exchange 类型:
Exchange分发消息时根据类型不同,分发策略存在区别
headers:
匹配AMQP消息的header而不是路由键
direct:
消息中的路由键routing key,和binding中的binding-key 一致,交换器就将消息发送到对应的队列中,路由键与队列名完全匹配,完全匹配,单播的模式,如果一个队列绑定到交换机要求路由键为“dog”,则只转发 routing key 标记为“dog”的消息,不会转发“dog.puppy”,也不会转发“dog.guard”等等
fanout:
每个发到fanout类型交互起的消息都会分到所有绑定的队列上去。fanout交换器不处理路由键,只是简单将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上,类似子网广播,每台子网内的主机都获得了一份复制的消息,fanout类型转发消息是最快的。
topic:
topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。将路由键和绑定键的字符串切分成单词,单词之间用点隔开,同样会识别同配符:符号‘#‘匹配0个或者多个单词,*匹配一个单词