消息队列之RabbitMQ(一) 介绍、核心概念、交换器类型
背景
博主在介绍 RabbitMQ
之前有必要说说消息队列是什么?
消息是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以很复杂,可能包含嵌入对象。
消息队列是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者(生产者)只管把消息发布到MQ中而不用管谁来取,消息使用者(消费者)只管从MQ中取消息而不管消息是谁发布的。这样发布者和使用者都不用知道对方的存在,这样就形成了应用间的解耦。
目前主流的消息队列是 RabbitMQ
、 Kafka
。当然 Redis
也能当做轻量级的消息队列。
消息队列典型的应用场景
- 异步处理: 把消息放入消息中间件中,等到需要的时候再去使用。
- 流量削峰: 例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了后就拒绝响应,这样就使得系统达到一定并发后不会因为超负载而崩溃。
- 日志处理: 在分布式系统中,每个节点应用都会产生日志,一旦集群规模庞大。日志系统也将面临大并发的尴尬局面。因此可以在日志收集后推送到队列里,再由日志系统去消费存储。
- 应用解耦: 假设某个服务A需要给许多个服务(B,C,D)发送消息,当服务B不需要发送消息了,服务A需要修改代码重新部署,新加入一个服务E需要服务A的消息时,也需要修改代码重新部署。这样对于整个系统而言,他的拓展性是十分不足的,但是使用MQ发布订阅模式后,服务A作为生产者,而其他的应用只需作为消费者去消费队列里的消息,这样就会使得应用之间解耦。大大的提高了系统的拓展性。
RabbitMQ
RabbitMQ
是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。RabbitMQ
是使用Erlang语言来编写,并且 RabbitMQ
是基于AMQP协议。Erlang于洋在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是 RabbitMQ
高性能的原因所在。
AMQP协议
AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
常用交换器
交换器,接受消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。
RabbitMQ
常用的交换器类型由direct、topic、fanout、headers四种。
Direct交换器:该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是路由到BindKey和RoutingKey完全匹配的队列中
Topic交换器:该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey指定的Topic队列上面。交换器会将Routingkey和某Topic进行模糊匹配,其中
""
用来匹配一个词,"#"
用于匹配一个或者多个词。例如"com.#""
能匹配到"com.rabbitmq.oa"
和"com.rabbitmq"
而"login."
只能匹配到"com.rabbitmq"
Fanout交换器: 该类型不处理RoutingKey,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。
Headers交换器: 该类型交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。
结束语
上面是博主总结的RabbitMQ的基本原理和需要掌握的基础知识,后面将会介绍如何安装以及使用入门。