RabbitMQ 简介
MQ简介
MQ全称为Message Queue,消息队列(MQ)是一种应用程序对应用程序的通信方法。
使用场景
- 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
- 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
- 日志处理
- 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。
异步处理
流量削峰
主要是还是来自于互联网的业务场景,例如,马上即将开始的春节火车票抢购,大量的用户需要同一时间去抢购;以及大家熟知的阿里双11秒杀, 短时间上亿的用户涌入,瞬间流量巨大(高并发),比如:200万人准备在凌晨12:00准备抢购一件商品,但是商品的数量确是有限的100-500件左右。
这样真实能购买到该件商品的用户也只有几百人左右, 但是从业务上来说,秒杀活动是希望更多的人来参与,也就是抢购之前希望有越来越多的人来看购买商品。
但是,在抢购时间达到后,用户开始真正下单时,秒杀的服务器后端却不希望同时有几百万人同时发起抢购请求。
我们都知道服务器的处理资源是有限的,所以出现峰值的时候,很容易导致服务器宕机,用户无法访问的情况出现。
日志处理
应用解耦
AMQP 协议
AMQP,即Advanced Message Queuing Protocol 高级消息队列协议,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。Erlang中的实现有RabbitMQ等。
所以,总结为一句话就是,AMQP是一个开放的消息队列标准协议!,而RabbitMQ就是此协议的一个开源实现,所以RabbitMQ与AMQP的协议中的概念是高度重合的。这在下面讲到RabbitMQ的使用时,再详说。
RabbitMQ简介
官网文档:官网文档
简介:RabbitMQ采用Erlang语言开发,是实现了高级消息队列协议(AMQP Advanced Message Queuing Protocol)的开源消息中间件,支持多种客户端。
优点:
- 性能很好,延时低
- 吞吐量到万级
- 有良好的管理界面管理工具
- 社区相对比较活跃
缺点: 吞吐量相对低
RabbitMQ作为一个消息中间件,其中设计思路基本都来源于AMQP协议,主要有如下几个重要的概念:
- Server:接收客户端的连接,实现AMQP实体服务。
- Connection:连接,应用程序与Server的网络连接,TCP连接。
- Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
- Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
- Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue,实现用户权限隔离。
- Exchange:交换器(通常使用”.”做分割),接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种,后面详细介绍。
- Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
- RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
- Queue:消息队列,用来保存消息,供消费者消费(通常使用”.”做分割)。
- Broker:消息队列服务主机
- Producer: 消息生产者
- Consumer:消费者
其结构大致如下:
如图,主要分为三部分:
- 生产者
- 消费者
- 服务端
整个消息的发布与消费的流程大致如下:
- 生产者client端指定服务端地址以及vhost虚拟主机,连接服务端
- 建立连接后,创建Channel信道,设置此信道的属性。
- 通过信道,声明交换机,队列,绑定关系,以及相关属性
- 通过信道,发送Message消息到Exchange交换机
- 交换机通过binding绑定关系与RoutingKey路由键,将消息分发到对应的Queue队列
- 消费者client通过服务端地址以及vhost连接服务端
- 建立连接后,创建信道,设置信道属性
- 通过信道,开启消费者监听队列,从队列中获取消息进行消费
- 根据是否延迟确认,确认消息已经被正常消费成功后,消息从队列中删除
Exchange交换机类型
在上述结构中,生产者发送消息,并不是直接发送到队列的,而是发送到Exchange交换机,再由交换机分发到相应队列,没有匹配到队列则丢弃消息。根据Exchange的类型不同,可灵活实现常见的消息模式。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78229.html