精选文章 RabbitMQ(一):RabbitMQ简介

RabbitMQ(一):RabbitMQ简介

作者:cuibin1991 时间: 2020-08-04 06:52:38
cuibin1991 2020-08-04 06:52:38

RabbitMQ是目前非常热门的一款消息中间件,不管是互联网大厂还是中小企业都在大量使用。作为一名合格的开发者,有必要对RabbitMQ有所了解,本文是RabbitMQ快速入门文章,主要内容包括RabbitMQ是什么、RabbitMQ核心概念、常用交换器类型等。

RabbitMQ简介

消息队列提供一个异步通信机制,消息的发送者不必一直等待到消息被成功处理才返回,而是立即返回。消息中间件负责处理网络通信,如果网络连接不可用,消息被暂存于队列当中,当网络畅通的时候在将消息转发给相应的应用程序或者服务,当然前提是这些服务订阅了该队列。如果在商品服务和订单服务之间使用消息中间件,既可以提高并发量,又降低服务之间的耦合度。

RabbitMQ就是这样一款我们苦苦追寻的消息队列。RabbitMQ是一个开源的消息代理的队列服务器,用来通过普通协议在完全不同的应用之间共享数据。

RabbitMQ是使用Erlang语言来编写的,并且RabbitMQ是基于AMQP协议的。Erlang语言在数据交互方面性能优秀,有着和原生Socket一样的延迟,这也是RabbitMQ高性能的原因所在。可谓“人如其名”,RabbitMQ像兔子一样迅速。

RabbitMQ除了像兔子一样跑的很快以外,还有这些特点: 

  • 开源、性能优秀,稳定性保障
  • 提供可靠性消息投递模式、返回模式
  • 与Spring AMQP完美整合,API丰富
  • 集群模式丰富,表达式配置,HA模式,镜像队列模型
  • 保证数据不丢失的前提做到高可靠性、可用性 

MQ典型应用场景:

  • 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
  • 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
  • 日志处理。
  • 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。

AMQP协议和RabbitMQ

提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

先了解一下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:消息队列,用来保存消息,供消费者消费。

下图是AMQP的协议模型:

RabbitMQ(一):RabbitMQ简介1

正如图中所看到的,AMQP协议模型有三部分组成:生产者、消费者和服务端。

生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。

接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。

最后还要关闭信道和连接。

RabbitMQ是基于AMQP协议实现的,其结构如下图所示,和AMQP协议简直就是一模一样。

RabbitMQ(一):RabbitMQ简介2

常用交换器

RabbitMQ常用的交换器类型有direct、topic、fanout、headers四种。

Direct Exchange

该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey完全匹配的队列中。

RabbitMQ(一):RabbitMQ简介3

Topic Exchange

该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。

Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"login."只能匹配到“com.rabbitmq”。

RabbitMQ(一):RabbitMQ简介4

Fanout Exchange

该类型不处理路由键,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。

RabbitMQ(一):RabbitMQ简介5

Headers Exchange

该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。

 

勿删,copyright占位
分享文章到微博
分享文章到朋友圈

上一篇:Centos7 挂载新添加的磁盘

下一篇:2020年成为机器学习工程师,看这9本书就够了!

您可能感兴趣

  • 35个Java岗位面试题全曝光!史上最全的超硬核Java 面试 “备战” 仓库!

    由于本人对有深度的系列文章情有独钟,所以本仓库【Java Github 超硬核面试 “备战” 手册】整理过程中会更加偏重这个方向,整理中我也会分享一些近些年自己开发和工作过程中的一些感悟、心得和无奈。 本仓库大部分内容来自我近几年的收集和整理,整体文章思路也是围绕着【面试备战计划】来进行整理的,主体内容包含:职业规划篇,跳槽篇,实操篇,一线大厂面试题篇,以及高频面试必备综合篇 等知识内容。 ...

  • 太难为我了,阿里面试了7轮(5年经验,拿下P7岗offer)

    前言 今年的大环境非常差,互联网企业裁员的现象比往年更严重了,可今年刚好是我的第一个“五年计划”截止的时间点,说什么也不能够耽搁了,所以早早准备的跳槽也在疫情好转之后开始进行了。但是,不得不说,这次阿里面试真的太难为我了,可以说是和面试官大战了7个回合,不过好在最后给了offer。 我个人情况是5年Java后台经验,阿里定级P7的样子,下面是我的面试经历分享,希望能带来一些不一样的启发和帮助...

  • 京东T10用后台系统+京东商城两大项目实战带你吃透SpringBoot

    这两大项目实战是基于Spring Boot 2.X版本,采用“知识点+实例”的形式编写,通过58 个基于知识的实例+2个综合性的项目(开发企业级通用的后台系统+实现一个类似“京东"的电子商务商城),全面深入地讲解了Spring Boot的主要技术原理和应用。 PDF把晦涩难懂的理论通过图文结合的方式讲解,把不便理解的名词用通俗化的文字进行讲解,将每个抽象的知识点用具化的实例进行展现。这使读者...

  • 工作 3 年,什么时候发现自己技术弱到爆?

    今日一问:你什么时候发现自己技术弱到爆? 没错,就是面试的时候。 昨天一位同学和我说,他工作了3年,特别有信心去面字节跳动的,但没有想到这么抠细节,太难了: · 什么是分布式锁? · 如何实现分布式锁? · 单机锁有哪些?它为什么不能在分布式环境下使用? · Redis 是如何实现分布式锁?可能会遇到什么问题? · 分布式锁使用超时的话会有什么问题?如何解决? ………… 面试中,十个公司有八...

  • 面试官写了个双冒号::问我这是什么语法?Java中有这玩意?

    点击上方“Java基基”,选择“设为星标” 做积极的人,而不是积极废人! 源码精品专栏 原创 | Java 2020 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布...

  • Flink 容错机制与状态

    简介 Apache Flink提供了一种容错机制,可以持续恢复数据流应用程序的状态。 该机制确保即使出现故障,经过恢复,程序的状态也会回到以前的状态。 Flink 主持 at least once 语义 和 exactly once 语义 Flink 通过定期地做 checkpoint 来实现容错 和 恢复, 容错机制不断地生成数据流的快照, 而不会对性能产生太大的影响。 流应用程序的状态存...

  • 天天在用 Stream,那你知道如此强大的 Stream 的实现原理吗?

    点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 8:55 更新文章,每天掉亿点点头发...

  • 榜单|2020年7月编程语言排行榜

    参考:https://www.tiobe.com/tiobe-index/ 前言 TIOBE 2020 年 7 月份的编程语言排行榜已经公布,官方的标题是:R 语言的排名达到了历史最高位。 R 语言一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。也有人把 R 语言用作矩阵计算,其分析速度可媲美专用于矩阵计算的自由软件 GNU Octave 和商业软件 MATLAB,前段时间...

华为云40多款云服务产品0元试用活动

免费套餐,马上领取!
CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。