深入解读 RabbitMQ 以及在 Java 中的使用

1. RabbitMQ 简介

 

在介绍 RabbitMQ 之前实现要介绍一下 MQ,MQ 是什么?

MQ 全称是 Message Queue,可以理解为消息队列的意思,简单来说就是消息以管道的方式进行传递。

RabbitMQ 是一个实现了 AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言的。

使用场景

在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中,而不是像几年前一样页面卡死或报错给用户。

像这种排队结算就用到了消息队列机制,放入通道里面一个一个结算处理,而不是某个时间断突然涌入大批量的查询新增把数据库给搞宕机,所以 RabbitMQ 本质上起到的作用就是削峰填谷,为业务保驾护航。

为什么选择 RabbitMQ

现在的市面上有很多 MQ 可以选择,比如 ActiveMQ、ZeroMQ、Appche Qpid,那问题来了为什么要选择 RabbitMQ?

  1. 除了 Qpid,RabbitMQ 是唯 一一 个实现了 AMQP 标准的消息服务器;
  2. 可靠性,RabbitMQ 的持久化支持,保证了消息的稳定性;
  3. 高并发,RabbitMQ 使用了 Erlang 开发语言,Erlang 是为电话交换机开发的语言,天生自带高并发光环,和高可用特性;
  4. 集群部署简单,正是应为 Erlang 使得 RabbitMQ 集群部署变的超级简单;
  5. 社区活跃度高,根据网上资料来看,RabbitMQ 也是首选;

 

 

2.深入了解 RabbitMQ 工作原理及简单使用

RabbitMQ 工作机制

生产者、消费者和代理

在了解消息通讯之前首先要了解 3 个概念:生产者、消费者和代理。

生产者:消息的创建者,负责创建和推送数据到消息服务器;

消费者:消息的接收方,用于处理数据和确认消息;

代理:就是 RabbitMQ 本身,用于扮演 “ 快递 ” 的角色,本身不生产消息,只是扮演 “ 快递 ” 的角色。

消息发送原理

首先你必须连接到 Rabbit 才能发布和消费消息,那怎么连接和发送消息的呢?

你的应用程序和 Rabbit Server 之间会创建一个 TCP 连接,一旦 TCP 打开,并通过了认证,认证就是你试图连接 Rabbit 之前发送的 Rabbit 服务器连接信息和用户名和密码,有点像程序连接数据库,使用 Java 有两种连接认证的方式,后面代码会详细介绍,一旦认证通过你的应用程序和 Rabbit 就创建了一条 AMQP 信道(Channel)。

信道是创建在 “ 真实 ” TCP 上的虚拟连接,AMQP 命令都是通过信道发送出去的,每个信道都会有一个唯一的 ID,不论是发布消息,订阅队列或者接收消息都是通过信道完成的。

为什么不通过 TCP 直接发送命令?

对于操作系统来说创建和销毁TCP会话是非常昂贵的开销,假设高峰期每秒有成千上万条连接,每个连接都要创建一条 TCP 会话,这就造成了 TCP 连接的巨大浪费,而且操作系统每秒能创建的 TCP 也是有限的,因此很快就会遇到系统瓶颈。

如果我们每个请求都使用一条 TCP 连接,既满足了性能的需要,又能确保每个连接的私密性,这就是引入信道概念的原因。

uploading.4e448015.gif转存失败重新上传取消

你必须知道的 Rabbit

想要真正的了解 Rabbit 有些名词是你必须知道的。

包括:ConnectionFactory(连接管理器)、Channel(信道)、Exchange(交换器)、Queue(队列)、RoutingKey(路由键)、BindingKey(绑定键)。

ConnectionFactory(连接管理器):应用程序与 Rabbit 之间建立连接的管理器,程序代码中使用;

Channel(信道):消息推送使用的通道;

Exchange(交换器):用于接受、分配消息;

Queue(队列):用于存储生产者的消息;

RoutingKey(路由键):用于把生成者的数据分配到交换器上;

BindingKey(绑定键):用于把交换器的消息绑定到队列上;

看到上面的解释,最难理解的路由键和绑定键了,那么他们具体怎么发挥作用的,请看下图:

uploading.4e448015.gif转存失败重新上传取消

 


版权声明:本文为ab1991823原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>