RabbitMQ 简介

导读:本篇文章讲解 RabbitMQ 简介,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

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)的开源消息中间件,支持多种客户端。

优点:

  1. 性能很好,延时低
  2. 吞吐量到万级
  3. 有良好的管理界面管理工具
  4. 社区相对比较活跃

缺点: 吞吐量相对低

RabbitMQ作为一个消息中间件,其中设计思路基本都来源于AMQP协议,主要有如下几个重要的概念:

  1. Server:接收客户端的连接,实现AMQP实体服务。
  2. Connection:连接,应用程序与Server的网络连接,TCP连接。
  3. Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
  4. Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
  5. Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue,实现用户权限隔离。
  6. Exchange:交换器(通常使用”.”做分割),接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种,后面详细介绍。
  7. Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
  8. RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
  9. Queue:消息队列,用来保存消息,供消费者消费(通常使用”.”做分割)。
  10. Broker:消息队列服务主机
  11. Producer: 消息生产者
  12. Consumer:消费者

其结构大致如下:
在这里插入图片描述

如图,主要分为三部分:

  • 生产者
  • 消费者
  • 服务端

整个消息的发布与消费的流程大致如下:

  1. 生产者client端指定服务端地址以及vhost虚拟主机,连接服务端
  2. 建立连接后,创建Channel信道,设置此信道的属性。
  3. 通过信道,声明交换机,队列,绑定关系,以及相关属性
  4. 通过信道,发送Message消息到Exchange交换机
  5. 交换机通过binding绑定关系与RoutingKey路由键,将消息分发到对应的Queue队列
  6. 消费者client通过服务端地址以及vhost连接服务端
  7. 建立连接后,创建信道,设置信道属性
  8. 通过信道,开启消费者监听队列,从队列中获取消息进行消费
  9. 根据是否延迟确认,确认消息已经被正常消费成功后,消息从队列中删除

Exchange交换机类型

在上述结构中,生产者发送消息,并不是直接发送到队列的,而是发送到Exchange交换机,再由交换机分发到相应队列,没有匹配到队列则丢弃消息。根据Exchange的类型不同,可灵活实现常见的消息模式。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/78229.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!