消息队列:解耦、异步、削峰,现有MQ对比以及新手入门该如何选择MQ?

简介:
愿打开此篇对你有所帮助
本文大量引用了CSDN博主:晨兮要努力的博客: 消息队列作用(解耦、异步、削峰),目测是个小姐姐了。看这个文章还要有点设计模式的基础哈哈
以及参考了CSDN博客专家:ithuangqing的博客: 编码之外,一文搞懂什么是消息队列!
他们写的都很好。然后我是学C++的,在群里天天看大佬们聊RabbitMQ、RocketMQ、Kafka,我觉得我得入门并实践一下,拉近和大佬们的距离。
文末还会放上一些我找到C++使用MQ的资料。

@[toc]

什么是消息队列(MQ)?

其实字面意思很清楚了,存放消息的队列。
由于它的应用场景在服务器方面被重新定义而名声大噪,它的价值也被由原先的通信而重新定义,成为高并发场景下,分布式系统解耦合,任务异步,流量削峰的利器。

其实消息队列属于一种中间件。

解耦合

  • 传统做法

    - 传统的做法是,订单系统调用库存系统的接口。如下图:

在这里插入图片描述

 - 传统模式的缺点:假如库存系统无法访问,则订单减库存将失败,从而导致订单失败,订单系统与库存系统耦合

如何解决以上问题呢?

  • 使用消息队列

    - 引入应用消息队列后的方案,如下图:

在这里插入图片描述

  • 订单系统:用户下单后,订单系统完成持久化处理,将消息写入消息队列,返回用户订单下单成功
  • 库存系统:订阅下单的消息,采用拉/推的方式,获取下单信息,库存系统根据下单信息,进行库存操作
  • 在下单时库存系统不能正常使用。也不影响正常下单,因为下单后,订单系统写入消息队列就不再关心其他的后续操作了。实现订单系统与库存系统的应用解耦.

举个新例子:

比如说某一个系统A要与其他系统打交道(即调用其中的方法),如果其它系统改变或者新增系统,那么A系统都会改变,这样的话耦合度比较高,比较麻烦。

在这里插入图片描述
使用消息队列来解决这个问题。

我们A系统将产生的数据发入消息队列中,其它的系统再去消息队列来进行消费,那么其他系统的减少或者新增系统即与A系统关系不大了,这样来实现解耦的功能。

在这里插入图片描述

异步

场景说明:用户注册后,需要发注册邮件和注册短信
  • 传统做法

    - 串行:将注册信息写入数据库成功后,发送注册邮件,再发送注册短信

在这里插入图片描述

- 并行:将注册信息写入数据库成功后,发送注册邮件的同时,发送注册短信

在这里插入图片描述

其实让我想我也就只能想到并行。

  • 使用消息队列

    • 将不是必须的业务逻辑,异步处理。改造后的架构如下:

在这里插入图片描述

举个新例子

某一个用户使用系统A,但是A要调用系统B,C,D,但是每一个系统返回的时间是不一样的,你必须要等待全部返回后才可以响应用户。

在这里插入图片描述
如果我们这里采用消息队列,当用户发送请求后,我们把数据传给消息队列,然后再直接响应给用户我已经发送了信息。

在这里插入图片描述

流量削峰

场景说明:商品秒杀业务,一般会因为流量过大,导致流量暴增,应用挂掉
  • 传统做法

    - 限制用户数量
    
  • 使用消息队列

    - 用户的请求,服务器接收后,首先写入消息队列,秒杀业务

在这里插入图片描述


举个新例子

比如平常用户的请求我们会直接访问数据库,在大量用户过来的时候,这样的话我们会对数据库照常比较大的压力

在这里插入图片描述

在这里我们增加一个消息队列,这样的话不管你请求来多少,我先存入消息队列,然后我再让系统慢慢的处理你的请求(如右图),这样很好的减缓了数据库的访问压力。


有哪些消息队列?

当下比较流行的,其实也就三种:

RabbitMQ
RocketMQ
Kafka

RabbitMQ

RabbitMQ在一开始是很强势的,也就是曾经很辉煌,当然,现在也不赖,只不过由于一些后起之秀,光芒不胜从前了,毕竟后来的也很优秀,RabbitMQ它的特点你需要记住:

开箱即用
轻量级
易于部署和使用
支持灵活的路由配置
客户端支持的编程语言是最多的(至少目前是)
……

不足之处嘛:

使用Erlang语言编写(这是个啥语言我之前真不知道,这就导致一个大问题,想要二次开发与扩展,以及遇到问题的话,解决的成本都比较高啊)
对消息堆积支持的不友好(消息队列就是进行消息收发的啊,大量的消息扔进RabbitMQ的话,它的性能表现就不那么好了)
性能相比较RocketMQ和Kafka是最差的

RocketMQ

RocketMQ属于明星产品啊,它是阿里巴巴搞出来的,后来捐赠给了Apache基金会,2017年成了其顶级项目,阿里内部也是使用的它。

可以说,RocketMQ是一款综合变现都很不错的消息队列产品,无论是性能还是稳定性,亦或是可靠性,RocketMQ表现的都很不错,反正吧,这家伙是越来越首欢迎了。

Kafka

它一开始是为了用于处理海量日志的,所以啊,它与大数据关系颇深,它在处理海量日志啊,或者是监控信息,以及流计算这些的时候,无疑是最好的选择。

而且Kafka可以说是与周边开源产品兼容最好的一个中间件,也就是说,几乎所有的相关开源软件系统都会优先支持Kafka。

另外它使用java和Scala编写,在性能,稳定性和可靠性上也都表现优异,这么一看,这家伙好像是集万众宠爱于一身啊,妥妥的老大啊,各方面都很优异啊。

但是它对消息是进行异步批量进行处理的,这就带来一个问题,延迟比较高,这点他是比不上RocketMQ。

该如何选择呢?

作为一个新手,我问了群里的大佬们,得到一个答案:学后面两个。

首先对于RabbitMQ,我们讲到它的时候,可能最先想到的就是它的轻量,开箱即用易于维护,所以基于这个特点,如果你的项目需要用到消息队列,但是消息队列又不是你系统的主角,那么RabbitMQ是一个不错的选择。

当然,如果对于你的系统,消息队列扮演着重要的角色,对性能,稳定性以及可靠性等都有一定的要求,更重要的是你需要使用消息队列来处理在线业务场景,那么你最好选择RocketMQ,因为它优越的低延迟,以及优秀的稳定性绝对会给你给力的表现。

如果你是需要处理海量的信息,业务涉及大数据,流计算等,那么这样的情况下,Kafka无疑是最好的选择了。

所以嘛,==我选择的是RocketMQ==

相关实践学习
消息队列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
相关文章
|
4天前
|
消息中间件
解决方案 | 云消息队列RabbitMQ实践获奖名单公布!
云消息队列RabbitMQ实践获奖名单公布!
|
5天前
|
消息中间件 JSON Java
开发者如何使用轻量消息队列MNS
【10月更文挑战第19天】开发者如何使用轻量消息队列MNS
24 2
|
11天前
|
消息中间件 存储 弹性计算
云消息队列RabbitMQ实践
云消息队列RabbitMQ实践
|
14天前
|
消息中间件 安全 Java
云消息队列RabbitMQ实践解决方案评测
一文带你详细了解云消息队列RabbitMQ实践的解决方案优与劣
51 3
|
18天前
|
消息中间件 存储 监控
解决方案 | 云消息队列RabbitMQ实践
在实际业务中,网站因消息堆积和高流量脉冲导致系统故障。为解决这些问题,云消息队列 RabbitMQ 版提供高性能的消息处理和海量消息堆积能力,确保系统在流量高峰时仍能稳定运行。迁移前需进行技术能力和成本效益评估,包括功能、性能、限制值及费用等方面。迁移步骤包括元数据迁移、创建用户、网络打通和数据迁移。
58 4
|
17小时前
|
消息中间件 存储 Kafka
MQ 消息队列核心原理,12 条最全面总结!
本文总结了消息队列的12个核心原理,涵盖消息顺序性、ACK机制、持久化及高可用性等内容。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
|
21天前
|
消息中间件 Java Kafka
RabbitMQ 入门
RabbitMQ 入门
|
4月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
4月前
|
消息中间件 Java C语言
消息队列 MQ使用问题之在使用C++客户端和GBase的ESQL进行编译时出现core dump,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
2月前
|
消息中间件
手撸MQ消息队列——循环数组
队列是一种常用的数据结构,类似于栈,但采用先进先出(FIFO)的原则。生活中常见的排队场景就是队列的应用实例。在数据结构中,队列通常用数组实现,包括入队(队尾插入元素)和出队(队头移除元素)两种基本操作。本文介绍了如何用数组实现队列,包括定义数组长度、维护队头和队尾下标(front 和 tail),并通过取模运算解决下标越界问题。此外,还讨论了队列的空与满状态判断,以及并发和等待机制的实现。通过示例代码展示了队列的基本操作及优化方法,确保多线程环境下的正确性和高效性。
34 0
手撸MQ消息队列——循环数组

相关产品

  • 云消息队列 MQ