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
目录
相关文章
|
3月前
|
消息中间件 Java Kafka
消息传递新纪元:探索RabbitMQ、RocketMQ和Kafka的魅力所在
【8月更文挑战第29天】这段内容介绍了在分布式系统中起到异步通信与解耦作用的消息队列,并详细探讨了三种流行的消息队列产品:RabbitMQ、RocketMQ 和 Kafka。其中,RabbitMQ 是一个基于 AMQP 协议的开源消息队列系统,支持多种消息模型;RocketMQ 则是由阿里巴巴开源的具备高性能、高可用性和高可靠性的分布式消息队列,支持事务消息等多种特性;而 Kafka 作为一个由 LinkedIn 开源的分布式流处理平台,以高吞吐量和良好的可扩展性著称。此外,还提供了使用这三种消息队列发送和接收消息的代码示例。总之,这三种消息队列各有优势,适用于不同的业务场景。
68 3
|
6天前
|
消息中间件 大数据 Kafka
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
本文深入探讨了消息队列的核心概念、应用场景及Kafka、RocketMQ、RabbitMQ的优劣势比较,大厂面试高频,必知必会,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka、RocketMQ、RabbitMQ 的优劣势比较
|
20天前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
21天前
|
消息中间件 存储 监控
ActiveMQ、RocketMQ、RabbitMQ、Kafka 的区别
【10月更文挑战第24天】ActiveMQ、RocketMQ、RabbitMQ 和 Kafka 都有各自的特点和优势,在不同的应用场景中发挥着重要作用。在选择消息队列时,需要根据具体的需求、性能要求、扩展性要求等因素进行综合考虑,选择最适合的消息队列技术。同时,随着技术的不断发展和演进,这些消息队列也在不断地更新和完善,以适应不断变化的应用需求。
64 1
|
1月前
|
消息中间件 数据采集 数据库
小说爬虫-03 爬取章节的详细内容并保存 将章节URL推送至RabbitMQ Scrapy消费MQ 对数据进行爬取后写入SQLite
小说爬虫-03 爬取章节的详细内容并保存 将章节URL推送至RabbitMQ Scrapy消费MQ 对数据进行爬取后写入SQLite
25 1
|
2月前
|
消息中间件
手撸MQ消息队列——循环数组
队列是一种常用的数据结构,类似于栈,但采用先进先出(FIFO)的原则。生活中常见的排队场景就是队列的应用实例。在数据结构中,队列通常用数组实现,包括入队(队尾插入元素)和出队(队头移除元素)两种基本操作。本文介绍了如何用数组实现队列,包括定义数组长度、维护队头和队尾下标(front 和 tail),并通过取模运算解决下标越界问题。此外,还讨论了队列的空与满状态判断,以及并发和等待机制的实现。通过示例代码展示了队列的基本操作及优化方法,确保多线程环境下的正确性和高效性。
41 0
手撸MQ消息队列——循环数组
|
2月前
|
消息中间件 监控 物联网
MQTT协议对接及RabbitMQ的使用记录
通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
168 0
|
消息中间件 Linux
centos7 yum快速安装rabbitmq服务
centos7 yum快速安装rabbitmq服务
225 0
|
消息中间件 中间件 微服务
RabbitMQ 入门简介及安装
RabbitMQ 入门简介及安装
121 0
|
消息中间件 Ubuntu Shell
ubuntu安装rabbitmq教程 避坑
ubuntu安装rabbitmq教程 避坑
479 0

相关产品

  • 云消息队列 MQ