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一站式入门使用
从源码编译、部署broker、部署namesrv,使用java客户端首发消息等一站式入门RocketMQ。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
1月前
|
消息中间件 Java
springboot整合消息队列——RabbitMQ
springboot整合消息队列——RabbitMQ
74 0
|
8天前
|
消息中间件 供应链 Java
RabbitMQ入门指南(九):消费者可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了消费者确认机制、失败重试机制、失败处理策略、业务幂等性等内容。
RabbitMQ入门指南(九):消费者可靠性
|
8天前
|
消息中间件 存储 Java
RabbitMQ入门指南(八):MQ可靠性
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了MQ数据持久化、LazyQueue模式、管理控制台配置Lazy模式、代码配置Lazy模式、更新已有队列为lazy模式等内容。
|
8天前
|
消息中间件 微服务
RabbitMQ入门指南(四):交换机与案例解析
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了交换机在RabbitMQ中的作用与类型、交换机案例(Fanout交换机、Direct交换机、Topic交换机)等内容。
|
8天前
|
消息中间件 存储 数据库
RabbitMQ入门指南(二):架构和管理控制台的使用
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了RabbitMQ架构和管理控制台的使用等内容。
RabbitMQ入门指南(二):架构和管理控制台的使用
|
16天前
|
消息中间件 存储 负载均衡
消息队列学习之RabbitMQ
【4月更文挑战第3天】消息队列学习之RabbitMQ,一种基于erlang语言开发的流行的开源消息中间件。
15 0
|
1月前
|
消息中间件 存储 中间件
【SpringCloud Stream消息驱动、设计思想以及整合rabbitmq消息队列案例--学习笔记】
【SpringCloud Stream消息驱动、设计思想以及整合rabbitmq消息队列案例--学习笔记】
47 0
|
1月前
|
消息中间件 缓存 API
|
1月前
|
消息中间件 存储 监控
RabbitMQ:分布式系统中的高效消息队列
RabbitMQ:分布式系统中的高效消息队列
|
4月前
|
消息中间件 NoSQL 数据库
一文讲透消息队列RocketMQ实现消费幂等
这篇文章,我们聊聊消息队列中非常重要的最佳实践之一:消费幂等。
一文讲透消息队列RocketMQ实现消费幂等

相关产品

  • 云消息队列 MQ