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

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

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的应用。

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

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

关注专栏,了解更多动态

参考文章

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

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
2月前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
106 6
|
2月前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
97 8
|
1月前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
2月前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
2月前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
5月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
5月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
75 4
|
3月前
|
消息中间件 运维 监控
云消息队列RabbitMQ实践解决方案评测报告
本报告旨在对《云消息队列RabbitMQ实践》解决方案进行综合评测。通过对该方案的原理理解、部署体验、设计验证以及实际应用价值等方面进行全面分析,为用户提供详尽的反馈与建议。
93 16
|
3月前
|
消息中间件 弹性计算 运维
阿里云云消息队列RabbitMQ实践解决方案评测报告
阿里云云消息队列RabbitMQ实践解决方案评测报告
82 9

相关产品

  • 云消息队列 MQ