RabbitMQ萌新入门简介

网友投稿 647 2022-05-29

1、RabbitMQ是什么?

RabbitMQ是一个消息中间件:它接受并转发消息。你可以把它当做一个快递站点,当你要发送一个包裹时,你把你的包裹放到快递站,快递员最终会把你的快递送到收件人那里,按照这种逻辑RabbitMQ是一个快递站,一个快递员帮你传递快件。RabbitMQ与快递站的主要区别在于,它不处理快件而是接收,存储和转发消息数据。

2、RabbitMQ四大核心概念

生产者: 产生数据发送消息的程序是生产者。

交换机: 交换机是RabbitMQ非常重要的一个部件,一方面它接收来自生产者的消息,另一方面它将消息推送到队列中。交换机必须确切知道如何处理它接收到的消息,是将这些消息推送到特定队列还是推送到多个队列,亦或者是把消息丢弃,这个得有交换机类型决定。

队列: 队列是RabbitMQ内部使用的一种数据结构,尽管消息流经RabbitMQ和应用程序,但它们只能存储在队列中。队列仅受主机的内存和磁盘限制的约束,本质上是一个大的消息缓冲区。许多生产者可以将消息发送到一个队列,许多消费者可以尝试从一个队列接收数据。这就是我们使用队列的方式。

消费者: 消费与接收具有相似的含义。消费者大多时候是一个等待接收消息的程序。请注意生产者,消费者和消息中间件很多时候并不在同一机器上。同一个应用程序既可以是生产者又是可以是消费者。

3、RabbitMQ核心-7种模式

3.1、简单模式

只有一个生产者,一个消费者;

3.2、工作队列模式(Work queues)

一个生产者,多个消费者,每个消费者获取到的消息唯一。

3.3、发布/订阅模式(Publish/Subscribe)

RabbitMQ萌新入门简介

一个生产者发送的消息会被多个消费者获取。发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(binding)的所有的Queue上。这种模式不需要任何Routekey,需要提前将Exchange 与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以和多个Exchange绑定。如果接收到消息的Exchange没有与任何Queue绑定,则消息会丢失。

3.4、路由模式(Routing)

任何发送到Direct Exchange的消息都会被转发到RouteKey指定的Queue,这种模式下不需要将Exchange进行任何绑定(binding)操作,消息传递时需要一个RouteKey,可以简单的理解为要发送到的队列名字。如果vhost中不存在该队列名,消息会丢失。

3.5、主题模式(Topic)

任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey指定主题的Queue中。就是每个队列都有其关心的主题,所有的消息都带有一个标题(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配队列。这种模式需要Routekey并且提前绑定Exchange与Queue。在进行绑定时要提供一个该队列对应的主题。‘ # ’表示0个或若干个关键字,‘ * ’表示一个关键字。如果Exchange没有发现能够与RouteKey匹配的Queue,消息会丢失。

3.6、RPC模式

客户端发起RPC请求时,request请求中会发送两个参数replyTo和correlationId(replyTo:同步互斥队列,也就是该请求对应的队列;correlationId:唯一标识),请求存入rpc队列,采用的是有界数组阻塞队列(ArrayBlockingQueue),消息接受端(也就是服务器端)接受到请求之后,利用replyTo中的携带的数据,处理任务并返回结果,返回结果中携带correlationId和具体结果。

3.7、发布确认模式(Publisher Confirms)

发布确认模式有三种策略:

1、单次确认,并等待超时时间,超时时间内返回结果;超时则抛出异常,该策略实现简单;会大大降低吞吐量,但是延时可接受。

2、批量确认,积累到一定次数再等待返回,该策略会很大提升效率和吞吐量;但是出错排查困难。

3、同步处理,新建一个同步集合,正常返回就从队列中remove,该策略是最佳实践,有效利用资源,错误可以控制;但是实现复杂,需要正确编码。

4、RabbitMQ工作原理

5、RabbitMQ中名词介绍

Broker: 表示消息队列服务器实体,接收和分发消息的应用,RabbitMQ Server 就是 Message Broker。

Virtual host: 出于多租户和安全因素设计的,把 AMQP 的基本组件划分到一个虚拟的分组中,类似 于网络中的 namespace 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时,可以划分出 多个 vhost,每个用户在自己的 vhost 创建 exchange/queue 等。

Connection: publisher/consumer 和 broker 之间的 TCP 连接。

Channel: 如果每一次访问 RabbitMQ 都建立一个 Connection,在消息量大的时候建立 TCP Connection 的开销将是巨大的,效率也较低。Channel 是在 connection 内部建立的逻辑连接,如果应用程 序支持多线程,通常每个 thread 创建单独的 channel 进行通讯,AMQP method 包含了 channel id 帮助客 户端和 message broker 识别 channel,所以 channel 之间是完全隔离的。Channel 作为轻量级的 Connection 极大减少了操作系统建立 TCP connection 的开销 。

Exchange: message 到达 broker 的第一站,根据分发规则,匹配查询表中的 routing key,分发 消息到 queue 中去。常用的类型有:direct (point-to-point), topic (publish-subscribe) and fanout (multicast) 。

Queue: 消息最终被送到这里等待 consumer 取走。

Binding: exchange 和 queue 之间的虚拟连接,binding 中可以包含 routing key,Binding 信息被保 存到 exchange 中的查询表中,用于 message 的分发依据。

RabbitMQ

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:有了这个数据强一致“利器”,DBA们轻松修复数据,对加班“say no”
下一篇:235_Redis_概述_常规操作
相关文章