RabbitMQ到底是什么?

📢📢📢📣📣📣

哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜

✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。

q

✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。

✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注一心同学】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️


目录

一、MQ是什么?

二、MQ的使用场景

2.1 异步处理

🚀 易错概念讲解

🌴 传统的做法

🌵 使用消息队列

2.2 应用解耦

🌴 传统做法

🌵 使用消息队列

2.3 流量削锋

2.4 日志处理

2.5 消息通讯

三、使用MQ的好处

四、RabbitMQ介绍

五、为什么要选择RabbitMQ?

六、RabbitMQ 特点

七、RabbitMQ的基本概念

小结


一、MQ是什么?

MQ的全称是Message Queue,也就是消息队列,MQ是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在

二、MQ的使用场景

2.1 异步处理

🚀 易错概念讲解

并发:指应用能够交替执行不同的任务,例如在一段时间内,我们一边吃饭,一边喝水,这两个是交替进行的。

并行:指应用能够同时执行不同的任务,例如我们在一段时间内,我们一边吃饭,一边泡脚,是同时进行的。

异步强调任务的异步执行,例如到一家餐馆,来第一位客人,点什么,点鱼,给它一个牌子,让他去一边等吧,下一位客人接着点菜,点完接着点让厨师做去吧,哪个的菜先好就先端出来。

场景说明:用户注册后,需要发注册邮件和注册短信。

🌴 传统的做法

(1)串行的方式

将注册信息写入数据库成功后,发送注册邮件,再发送注册短信。以上三个任务全部完成后,返回给客户端。

(2)并行方式

将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信。以上三个任务完成后,返回给客户端。与串行的差别是,并行的方式可以提高处理的时间。

🔥 分析

假设三个业务节点每个使用50毫秒钟,不考虑网络等其他开销,则串行方式的时间是150毫秒,并行的时间可能是100毫秒。
因为CPU在单位时间内处理的请求数是一定的,假设CPU1秒内吞吐量是100次。则串行方式1秒内CPU可处理的请求量是7次(1000/150)。并行方式处理的请求量是10次(1000/100) 。

也就是说如果我们使用传统的方式来做这个案例,那么我们的性能(并发量,吞吐量,响应时间)会出现瓶颈

🌵 使用消息队列

我们引入消息队列,将不是必须的业务逻辑,进行异步处理。改造后的架构如下:

🔥 分析:

按照以上约定,用户的响应时间相当于是注册信息写入数据库的时间,也就是50毫秒。注册邮件,发送短信写入消息队列后,直接返回,因此写入消息队列的速度很快,基本可以忽略,因此用户的响应时间可能是50毫秒。因此架构改变后,系统的吞吐量提高到每秒20 QPS。比串行提高了3倍,比并行提高了两倍。

2.2 应用解耦

场景说明:用户下单后,订单系统需要通知库存系统。

🌴 传统做法

订单系统调用库存系统的接口。如下图:

缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合 。

🌵 使用消息队列

订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功。
库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作。

假如在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦

2.3 流量削锋

流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛。

应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列。

a、可以控制活动的人数
b、可以缓解短时间内高流量压垮应用

用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。

秒杀业务根据消息队列中的请求信息,再做后续处理

2.4 日志处理

日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题。架构简化如下:

日志采集客户端:负责日志数据采集,定时写受写入Kafka队列。
Kafka消息队列:负责日志数据的接收,存储和转发。
日志处理应用:订阅并消费kafka队列中的日志数据 。

2.5 消息通讯

消息通讯是指:消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通讯。比如实现点对点消息队列,或者聊天室等。

🚀 点对点通讯:

客户端A和客户端B使用同一队列,进行消息通讯。

🚀 聊天室通讯:

客户端A,客户端B,客户端N订阅同一主题,进行消息发布和接收。实现类似聊天室效果。

以上实际是消息队列的两种消息模式,点对点或发布订阅模式

三、使用MQ的好处

(1)降低了两台服务器之间的耦合,哪怕是一台服务器挂了,另外一台服务器也不会报错或者休克,因为其监听的是MQ,只要服务器恢复再重新连上MQ发送消息,监听服务器就能再次接收。

(2)MQ作为一个仓库,本身就提供了非常强大的功能,例如不再是简单的一对一功能,还能一对多,多对一,类似补保险箱场景,只要有特定的密码,谁都能存,谁都能取。也就是说能实现群发消息和以此衍生的功能。

(3)普遍化的持久化功能,当MQ挂掉可以存储在磁盘等下重启恢复。(需要设置)

四、RabbitMQ介绍

RabbitMQ是采用Erlang语言实现了高级消息队列协议(AMQP)的开源消息代理软件,是一个消息代理 , 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息再传输过程中的安全。

五、为什么要选择RabbitMQ?

我们常见的消息中间件其实不单单只有RabbitMQ,还有ActiveMQKafka以及RocketMQ等。以下就是我们选中RabbitMQ的理由:

(1)RabbitMQ部署最广泛的开源消息代理。
(2)RabbitMQ拥有成千上万的用户,是最受欢迎的开源消息代理之一。从T-Mobile 到Runtastic。

(3)RabbitMQ在全球范围内的小型初创企业和大型企业中都得到使用。
(4)RabbitMQ轻巧,易于在内部和云中部署。它支持多种消息传递协议。RabbitMQ可以部署在(4)分布式和联合配置中,以满足大规模,高可用性的要求。
(5)RabbitMQ可在许多操作系统和云环境上运行,并为大多数流行语言提供了广泛的开发人员工具。

六、RabbitMQ 特点

(1)可靠性

RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。

(2)灵活的路由

在消息进入队列之前,通过 Exchange 来分发路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。

(3)消息集群

多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。

(4)高可用

队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用

(5)多种协议

RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。

(6)多语言客户端

RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。

(7)管理界面

RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

(8)跟踪机制

如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

(9)插件机制

RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

七、RabbitMQ的基本概念

🚀 Producer消息的生产者,也是一个向交换器发布消息的客户端应用程序。

🚀 Consumer消息的消费者,表示一个从一个消息队列中取得消息的客户端应用程序。

🚀 Broker接受客户端的链接,实现AMQP实体的服务。

🚀 Connection生产者、消费者与broker之间的TCP链接。

🚀 Channel如果每一次访问RabbitMQ都建立一个connection,在有消息量大的时候建立大量的TCP链接的开销太大,效率也低。channel是在connection内部建立的逻辑链接,channel之间完全隔离,这样就减少了系统频繁创建TCP链接的开销。

🚀 Exchangemessage到达broker的第一站,根据分发规则,匹配routing key,将消息分发到queue中去。常用的类型有direct(点对点)、topic(规则匹配)、fanout(广播)。

🚀 Queue消息最终被送到这里等待consumer。

🚀 Bindingexchange和queue之间的虚拟链接,binding中包含routing key,binding信息保存到exchange的查询表中,用于message的分发。

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


小结

以上就是【一心同学】整理的【消息队列MQ】以及其【RabbitMQ】的讲解了,看完【一心同学】的陈述,是不是对【RabbitMQ】不再陌生了,在接下来我博客里,我将会继续讲解【RabbitMQ的更多操作】。

如果这篇【文章】有帮助到你,希望可以给【一心同学】点个👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

本网页由快兔兔AI采集器生成,目的为演示采集效果,若侵权请及时联系删除。

原文链接:https://blog.csdn.net/Huang_ZX_259/article/details/123200750

更多内容