文章目录
前言
看到 RabibtMQ 的时候我们首先会想它到底是什么呢?RabbitMQ 其实可以分为两个部分:Rabbit + MQ,Rabbit 是指 Rabibt 公司,MQ 指的是 Message Queue,即消息队列,合起来理解 RabbitMQ 就是 Rabbit 公司企业下的一个消息队列产品。
RabbitMQ 是一个实现了 AMQP 的消息队列服务,是当前主流的消息中间件之一。AMQP ,即 Advanced Message Queuing Protocol(高级消息队列协议),是一个通用的应用层协议,提供统一消息消息服务的协议,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端或者中间件,开发语言等条件的限制。
什么是MQ
当大致知道了什么是 RabbitMQ,我们来详细的学习一下什么是 MQ(Message Queue)。既然是 Queue,那么他就具有队列的特性 FIFO,先进先出,Message Queue 与普通的 Queue 不同的就是 Message Queue 中存放的是消息(message)。当然这些消息可以很简单也可以很复杂,但是他们统称为消息。MQ 多用于分布式系统之间的通信。
系统之间的调用通常有两种方式:1. 同步通信 2. 异步通信
同步通信
同步通信是一种比特同步通信技术,要求发收双方具有同频同相的同步时钟信号。在同步通信中,发送方和接收方在传送数据时需要保持严格的同步,以确保数据的正确传输。简单来说就是,数据从一端发出后立即就可以到达另一端。
同步通信的好处呢就是系统 B 对于系统 A 传递来的数据,系统 B 可以立即对这些数据进行处理并返回,响应速度就很快。但是这样的话,如果系统 B 短时间内接收到大量的数据请求的话,由于硬件或者软件上的限制,就无法对这些全部的请求做出处理,甚至还可能导致我们的系统 B 发生崩溃宕机。
所以在处理高请求量的时候,我们往往会将同步通信和异步通信结合起来使用。
异步通信
异步通信是一种非同步的通信方式,发送方和接收方在执行相应操作时不需要同时存在或同时运行。在异步通信中,每个字符的传输都是独立的,字符之间可以有任意的时间间隔。
数据从一端发出后,先进入一个容器中进行临时存储,当达到某种条件之后,再由这个容器发送给另一端,容器的一个具体的实现就是 MQ。
对于系统 A 传递来的消息,不必直接传递给系统 B,而是先存放在消息队列中,当系统 B 处理完成当前消息之后,会向消息队列订阅消息,获得下一个消息,然后进行处理。这样就算系统 A 或者其他系统向系统 B 短时间内发送大量的消息,这些也是存放在消息队列中的,不会对系统 B 造成太大的压力,实现了削峰的效果。
MQ的作用
- 异步处理
- 提升系统响应速度:通过将耗时较长的操作异步化,MQ允许生产者在发送消息后立即返回,而不需要等待消费者处理完成。这样可以显著提升系统的响应速度和用户体验。
- 提高系统吞吐量:通过异步处理,系统能够同时处理更多的请求,从而提高单位时间内处理请求的数目(吞吐量)。
- 应用解耦
- 降低系统耦合度:MQ作为一个中介,使得生产者和消费者之间不需要直接交互,从而降低了系统之间的耦合度。这种解耦提高了系统的容错性和可维护性。
- 灵活扩展:当系统需要增加新的消费者或生产者时,只需要让它们与MQ进行交互即可,而不需要修改其他系统的代码。
- 削峰填谷
- 应对突发流量:在高峰期,系统可能会接收到大量的请求,这些请求如果直接处理可能会导致系统崩溃。MQ可以将这些请求暂时保存起来,然后系统可以按照自己的消费能力逐步处理这些请求,从而避免系统崩溃。
- 平衡负载:通过MQ,系统可以更加灵活地分配资源,确保在高负载情况下仍然能够稳定运行。
- 支持多种消息模型
- 发布/订阅(Pub/Sub):同一个topic下的消息会被所有的订阅者消费。
- 点对点(P2P):消息只会被一个消费者消费。
- 可靠性
- 确保消息传递:MQ通常提供多种机制来确保消息的可靠传递,如消息确认、持久化等。
- 容错性:即使部分消费者或生产者出现故障,MQ也能保证消息不会丢失,并在故障恢复后继续传递消息。
- 延迟通知
- 在需要特定时间后发送通知的场景中,可以使用 MQ 的延迟消息功能,比如在电子商务平台中,如果用户下单一定时间内未支付,可以使用延迟队列在超时后自动取消订单。
为什么选择RabbitMQ作为MQ呢
当前业界有很多的 MQ 产品,例如 RabbitMQ、RocktMQ、ActiveMQ、Kafka、ZeroMQ等,也有直接使用 Redis 作为消息队列的案例,这些消息队列各有侧重,也没有好坏,只有适合不合适,在实际选择使用哪个 MQ 的时候需要结合实际需求来进行选择。
1.Kafka
Kafka 一开始的目的就是用于日志收集和传输,追求高吞吐量,性能卓越,单机吞吐达到十万级,在日志领域比较成熟,但是功能较为简单,主要支持简单的 MQ 功能,如果有日志采集需要肯定就是首选 Kafka 了。
2.RocketMQ
RocketMQ 采用 Java 语言开发,由阿里巴巴开源,后捐赠给了 Apache。
它在设计的时候借鉴了 Kafka,并做出了一些自己的改进,青出于蓝而胜于蓝,经过多年双十一的洗礼,在实用性、可靠性和稳定性方面都有出色的表现,适合对于可靠性比较高,且并发比较大的场景,比如互联网金融。但是支持的客户端语言不多,且社区活跃度一般
3.RabbitMQ
采用 Erlang 语言开发,MQ 功能比较完备,且几乎支持所有的主流语言,开源提供的页面也非常友好,性能较好,吞吐量也可以达到万级,社区活跃度也比较高,比较适合中小型公司,数据量没那么大,且开发没有那么高的场景。
所以综合起来,RabbitMQ 适合初学者学习,且功能比较完善,是属于我们个人开发的最佳选择。
RabbitMQ 官网 https://www.rabbitmq.com/
版权归原作者 不能再留遗憾了 所有, 如有侵权,请联系我们删除。