RabbitMQ:什么是消息队列MQ?为什么使用消息队列MQ?入门MQ先学哪种?(一)

0. 引言

MQ(Message Queue):消息队列,如今在各类业务场景中已经被广泛使用,特别在并发量日益增涨的业务和微服务架构中,消息队列能够帮助我们解决很多传统方式所不能解决的问题。

所以今天,我们就开始学习消息队列啦

1. 什么是消息队列?

学习之前,我们要先了解什么是消息队列,学习过java的同学应该知道,有一种数据结构叫队列(Queue),队列保持着先进先出的原则。消息队列呢实际上就是一种队列结构,这个队列中盛装的就是我们的消息。

什么是消息呢?通俗一点就是我们要传递的数据,可以是一个字符串,也可以是一个自定义的对象。

当然既然消息队列是用来传递数据的,那么队列就会有两端:一端生产消息,我们称之为生产者,一端接收消息并且利用该消息进行后续的处理,我们称之为消费者。先放入到消息队列中的消息,就会先被消费掉。如下图所示
在这里插入图片描述

2. 为什么要使用消息队列?

在讲述这个问题之前,我们先引入几个场景:

  • 1、异步调用

    场景一:我们有一个服务A,服务A需要调用服务B,C,三个服务的执行时间分别是1s,2s,3s。那么用户调用服务A时,需要等待6s后才会得到执行完毕的反馈。想象一下你是这个用户,做一个操作让你等待6s,你会怎么想?如果你还挺有耐心的,6s能接受,那如果执行时间是1s,2min,3min,你需要等待5分1s才能得到这个回执,你还愿意等吗?5分钟,面都泡好了!

    所以我们引入了一个服务异步调用的机制,什么是异步呢?就是服务A调用服务B,C时,不用再等待B,C执行完毕后才返回回执,服务A执行完,将服务B,C所需要的数据发送给他们,然后不等待完成,只要服务A自己的逻辑执行完成后就返回结果,这样的执行方式,我们称之为异步调用。

    那么这个异步调用怎么实现呢?如何保证异步调用的数据一定能够被B,C接收到呢?要知道因为服务A不会监控B,C的执行结果,所以一旦数据丢失了,那么服务A并不知道B,C都没收到数据,也没执行,也不问题大了嘛。

    解决办法就是MQ啦~

    我们把服务B,C所需要的数据传送到对应的消息队列中,然后让服务B,C分别监控他们自己的队列,当有消息进来时,就会触发服务B,C的消息消费逻辑,而进行下一步的业务处理,那么MQ又是如何保证消息不丢失呢?这个我们就后续再来详解,今天我们先掌握MQ的基础概念。
    在这里插入图片描述

  • 2、流量削峰

    场景2:另一个场景就是高并发的场景,想象下我们某一个时段有海量的请求发送过来,如果请求直接打到服务上,就会导致服务承受不住而宕机。

    有同学会想啦,那我不能用分布式的概念,来扩展几个服务不就好了嘛。但是问题在于这样的海量请求只是短时间的,更多时间的平常运行中是不会有这么多请求的,那么如果我们为了满足这个短时间的需求,而增加服务器配置的话,是不是有点得不偿失呢?

    于是乎,我们引入了MQ,将这些海量的请求数据先放到MQ中,然后服务一点一点的消费,每次消费服务能够承受的数量,这样就能将巨大的流量削减为一小部分。这样的操作我们也成为流量削峰。
    在这里插入图片描述

  • 3、服务解耦

    场景3:与场景1类似,我们有服务A,会调用服务B,C。如果服务B,C出现报错,就会导致服务A也报错,而B,C的业务逻辑与服务A关系不大,比如下订单后,要增加用户的积分,这个增加用户积分的操作并没有那么重要,甚至可以晚一点执行都可以,如果因为积分服务而导致订单服务报错,有点不划算

    于是我们想象,如果能够把对服务B,C的调用剥离出去,其调用不影响服务A的执行,也样的操作称为服务解耦,那我们的问题就解决啦。于是又是MQ来帮忙

    道理类似,我们把服务B,C需要的数据,传递到消息队列中,服务A执行完就直接反馈,而B,C的调用通过监控消息队列的数据来实现。

3. 初学者优先学习哪种MQ?

当前市面上常用的MQ有:ActiveMQ,RabbitMQ,RocketMQ,Kafka这四种

mq的概念和原理是相差不大的,只是不同的mq在不同的业务场景中有不同的表现,比如RabbitMQ适用于低延迟的场景,RocketMQ适用于高并发场景,并且是唯一支持分布式事务的消息队列,Kafka更是为了大数据而生的消息队列,是吞吐量最大的消息队列。

所以针对mq的学习,更多的是看大家公司的业务场景,以及自己未来可能接触的更多的业务场景。如果对于高并发没有那么大的要求,个人建议大家可以从RabbitMQ入手,也就是我们后续要带大家快速上手的MQ.

而ActiveMQ的话,是Apache公司早些时候的产品,在其又推出ActiveMQ之后,社区的维护就更少了,RabbitMQ有着轻量,入门快的特点,如果MQ不是公司的重点业务支撑中间的话,那么RabbitMQ毫无疑问,是我们入门的最佳选择。

但如果大家公司对于并发场景有要求,且对MQ的使用较频繁,那么由alibaba开源的RocketMQ,是不错的选择,其支撑住了中国的双11挑战,足以证明它的实力,现在RocketMQ已经贡献给Apache开源基金会了,由Apache来维护,但近期其开源社区并不活跃,所以如果选用RocketMQ还需要考虑公司是否有足够的技术实力来支持RocketMQ

如果你学习的方向是大数据方向,那么不用怀疑,Kafka就是你的命中注定!Kafka也常用于实时的数据收集和日志采集的场景,比如ELK+Kafka的应用。

特性ActiveMQRabbitMQRocketMQKafka
单机并发量万级万级10万级10万级
延迟毫秒级微秒级毫秒级毫秒级
可用性高,主从架构高,主从架构非常高,分布式架构非常高,分布式架构
消息可靠性低概率丢失消息基本不丢失优化后可做到0丢失优化后可做到0丢失
应用场景MQ基础应用场景低延迟业务场景高吞吐业务场景高吞吐,大数据领域,数据、日志采集

好了,本期的分享也就到此结束了,后续我们以更常用的RabbitMQ来入门,带大家学习MQ!

关注专栏,了解更多动态

参考文章

https://github.com/doocs/advanced-java/blob/main/docs/high-concurrency/why-mq.md

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wu@55555

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值