关于java:RabbitMQ-入门之基础概念

36次阅读

共计 3489 个字符,预计需要花费 9 分钟才能阅读完成。

什么是音讯队列(MQ)

音讯是在不同利用间传递的数据。这里的音讯能够非常简单,比方只蕴含字符串,也能够非常复杂,蕴含多个嵌套的对象。音讯队列(Message Queue)简略来说就是一种应用程序间的通信形式,音讯发送后立刻返回,而后由音讯零碎保障音讯的可靠性传输,音讯生产者只须要把音讯发到 MQ 中就能够了,不须要关怀音讯的生产,同样,音讯消费者只管从 MQ 中拉取音讯而不管是谁生产的音讯,通过这样的一个“相互不晓得对象存在”模式,将音讯的生产者和音讯的消费者解耦了。

什么场景下思考应用音讯队列

从下面能够晓得,音讯队列是一种利用间的异步合作机制,那么咱们什么时候须要用到 MQ 呢?以常见的订单零碎为例,当用户点击「下单」后的业务逻辑可能包含:扣减库存、生成相应订单数据、发短信告诉等。在我的项目和业务倒退初期下面这些逻辑可能放在一起执行,随着业务的倒退订单量的减少,须要晋升零碎服务的性能,此时就能够将一些不须要立刻失效的操作这份进去异步执行,比方发送短信告诉等。这种场景下就能够应用 MQ,在下单主流程(比方扣减库存、生成订单数据等)实现之后发送一条音讯到 MQ 让主流程疾速走完,而后由另外一个线程拉取 MQ 的音讯,执行相应的业务逻辑。这里的例子次要是用音讯队列来解耦。

RabbitMQ 的特点

RabbitMQ 是一个由 Relang 语言开发的 AMQP 的开源实现。AMQP(Advanced Message Queue:高级音讯度列协定)它是应用层协定的一个凋谢规范,为面向音讯的中间件设计,基于此协定的客户端与消息中间件可传递音讯,并不受产品、开发语言等条件的限度。RabbitMQ 最后起源于音讯零碎,用于在分布式系统中存储转发音讯,具体有如下一些特点:

  • 可靠性: RabbitMQ 应用一些机制来保障可靠性,比方长久化、传输确认机制(ack)和公布确认等。
  • 灵便的路由策略: 在音讯进入队列之前,通过 Exchange 来路由音讯,对于典型的路由性能,RabbitMQ 曾经提供了一些内置的 Exchange 来实现。针对简单的路由性能,能够将多个 Exchange 绑在一起,也通过插件机制实现本人的 Exchange。
  • 音讯集群: 多个 RabbitMQ 服务器能够组成一个集群,造成一个逻辑 Broker。
  • 高可用: 队列能够在集群中的集群上进行镜像,使得在局部节点出问题的状况下队列依然可用。
  • 多种协定: RabbitMQ 反对多种音讯队列协定,比方 STOMP、MQTT 等。
  • 多语言客户端: RabbitMQ 简直反对多有罕用的语言,比方:Java、.NET 等
  • 治理界面: RabbitMQ 提供了一个易用的用户界面,使得用户能够监控和治理音讯 Broker 的许多方面。

RabbitMQ 装置(mac)和运行

1、装置
因为 RabbitMQ 依赖于 Erlang 语言,所以在装置 RabbitMQ 之前须要先装置 Erlang 环境,然而因为是 Mac 环境,能够应用 HomeBrew 装置,装置前先更新 brew:

brew update

接着装置 RabbitMQ 即可,装置过程中会主动装置其所依赖的 Erlang。

2、运行
RabbitMQ 的启动运行很简略,找到其装置目录后(应用 Homwbrew 装置的默认目录为:/usr/local/Cellar/rabbitmq),进入到目录的 sbin 目录下,能够看到有 6 个
以 rabbitmq 结尾的可执行文件,间接执行 rabbitmq-server 即可。

启动失常的话能够看到启动过程的日志信息和最初的 completed with 6 plugins,这也阐明启动的时候默认加载了 6 个插件。

此时通过浏览器拜访 http://localhost:15672 能够看到其治理界面(默认用户名和明码都是 guest),能够在 admin 选项卡页面新增用户,治理界面如下:

PS: 以上形式不是后盾启动,如果想让 RabbitMQ 后盾守护过程的形式启动的话,能够在启动的时候加上 -detached 参数。

3、查问服务器状态
在装置目录的 sbin 上面有个可执行文件 rabbitmqctl,它提供了 RabbitMQ 治理须要的简直一站式解决方案,绝大部分的运维命令它都能够提供。查问 RabbitMQ 服务器的状态信息能够用参数 status。

RabbitMQ 中的根底概念

1、音讯模型 简直所有的 MQ 形象来说都是一样的过程:消费者订阅某个队列,生产者生产音讯,而后公布到队列中,最初将音讯发送到监听该队列的消费者那里。如下图所示:

2、基本概念 下面上一个音讯队列的形象概述,具体到 RabbitMQ 有一些特有的概念,RabbitMQ 是 AMQP 协定的一个开源实现,其外部概念大都是 AMQP 协定的一些概念。

名称 形容
Message 音讯 音讯是不具名的,它由音讯头和音讯体组成。音讯体是不通明的,而音讯头则是由一系列的可选属性组成,这些属性包含 routing-key(路由键)、priority(绝对于其它音讯的优先权)、delivery-mode(指出该音讯可能须要持久性存储)等。
Publisher 音讯生产者 一个向交换机发送音讯的客户端应用程序。
Exchange 交换器 用来接管生产者发送过去的音讯,并将这些音讯发送给服务器中的队列。
Binding 绑定 用于音讯队列和交换器之间的关联,一个绑定就是一个基于路由键将交换器和音讯队列连接起来的路由规定,所以能够将交换器了解成一个由绑定形成的路由表。
Queue 音讯队列 用来保留音讯直到发送给消费者,它是音讯的容器,也是音讯的起点,一个音讯可投入一个或多个队列,音讯始终在队列外面,期待消费者连贯到这个队列并将其取走。
Connection 网络连接 比方一个 TCP 连贯。
Channel 信道 多路复用连贯中的一条独立双向数据流通道,信道是建设在实在 TCP 连贯内的虚构连贯,AMQP 命令都是通过信道发送进来的,不论是公布音讯、订阅音讯还是接管音讯,这些动作都是通过信道实现的。因为对于操作系统来说建设和销毁 TCP 都是十分低廉的开销,所以引入了信道的概念,以复用一条 TCP 连贯。
Consumer 音讯的消费者 一个从音讯队列中获取音讯的客户端应用程序。
Virtual Host 虚拟主机 示意一批交换器、音讯队列和相干对象。虚拟主机是共享雷同身份认证和加密环境的对服务器域。每个 vhost 实质上是一个 mini 版的 RabbitMQ 服务器,领有本人的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的根底,必须在连贯时指定,RabbitMQ 默认的 vhost 是 /。

3、AMQP 中的音讯路由 AMQP 中音讯路由过程和 Java 开发者相熟的 JMS 存在一些差异,AMQP 中减少了 Exchange 和 Binding 的角色。生产者把音讯发送到 Exchange 上,音讯最终达到队列并被消费者接管,而 Binding 决定交换器的音讯应该发到哪个队列。

4、Exchange 类型 Exchange 散发音讯时依据类型的不同散发策略略有区别,目前共有四种类型:direct、fanout、topic、headers。headers 匹配 AMQP 音讯的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前简直用不到了,所以间接看另外三种类型即可。

4.1、direct 类型

音讯中的路由键(routing key)如果和 Binding 中的 binding key 统一,交换器就将音讯发到对应的队列中。路由键与队列名齐全匹配,如果一个队列绑定到交换机要求路由键为 “dog”,则只转发 routing key 标记为“dog”的音讯,不会转发 “dog.puppy”,也不会转发 “dog.guard” 等等。它是齐全匹配、单播的模式。

4.2、fanout 类型

每个发到 fanout 类型交换机的音讯都会发到所有绑定的队列下来。fanout 交换器不解决路由键,只是简略的将队列绑定到交换器上,每个发送到交换器的音讯都会被转发到与该交换器绑定的所有队列上。很像子网播送,每台子网内的主机都取得一份复制的音讯。fanout 类型转发音讯是最快的。

3、topic 类型

topic 交换器通过模式匹配调配音讯的路由键属性,将路由键和某个模式进行匹配,此时队列须要绑定到一个模式上,它将路由键和绑定的字符串切分成单词,这些单词之间用点隔开。它同样也辨认两个通配符:符号 “#” 和符号 ““。# 符号匹配 0 个或多个单词, 符号匹配不多不少一个单词。

总结

本文次要讲了对于 RabbitMQ 的装置以及根底概念的相干介绍,因为它是基于 Erlang 语言开发,可能对于局部 Java 开发者想理解其底层实现细节以及排查比较复杂的问题时不是很敌对。

正文完
 0