RocketMq-入门篇

简介: 前言 你在工作中是否遇到过这些问题?系统平时访问流量平平,在某个时间段好像决堤似的突增?上下游执行链路长,重要和不重要的执行内容混在一起,层层嵌套?面对高并发时,下游系统无法承载海量的调用量,影响上游响应……如果你也有,那就和我一起来学习rocketMq吧,据说rocketMq能帮我们很好的解决这些问题。

前言

       你在工作中是否遇到过这些问题?系统平时访问流量平平,在某个时间段好像决堤似的突增?上下游执行链路长,重要和不重要的执行内容混在一起,层层嵌套?面对高并发时,下游系统无法承载海量的调用量,影响上游响应……如果你也有,那就和我一起来学习rocketMq吧,据说rocketMq能帮我们很好的解决这些问题。


一、rocketMq是什么?


 Apache rocketMq是阿里开发的一款具有低延迟,高可靠的,万亿级容量,可灵活扩展的分布式消息队列。由4部分组成:nameSrv,broker,producer,consumer,每部分都支持水平扩展。        


       nameSrv:提供轻量级的服务发现与路由,每个nameSrv都记录完整的路由信息,起到注册中心的作用。与ZooKeeper不同的是,nameSrv的每个节点彼此不通信,无状态,无主从。


       broker:提供轻量级的topic和queue机制来存储消息。


       producer:消息生产者。


       consumer:消息消费者。



592f03a250b64936bd7e706f580bbced.png


 从官方文档了解到,因为早期的ActiveMq5.X无法支持业务吞吐量的增大,而Kafka在低延迟和高可靠方面无法满足要求,于是技术团队发明一个新的消息传递引擎来处理更广泛的用例集,从传统的发布/订阅场景到大容量实时零丢失容忍交易系统,就是rocketMq。官方文档给出了activeMq,kafka,rocketMq的对比,从一个CSDN博主的文章中还读到了与RabbitMq 对比,一起看下


a15721d712a94581ad989d501fd107c1.png



二、rocketMq的应用

异步解耦


1、异步解耦,“缩短”执行链路



举个例子,在商城系统中用户取消订单时,至少需要做这几步:


       ①调用订单系统更新订单状态为取消;


       ②调用计费系统费用计算和退款;


       ③调用优惠券系统退还用户优惠券(②和③也可能在一个流程里;有些公司优惠券系统和计费系统是两个系统);


       ④通知商家;


       ⑤多平台合作的情况下,通知到其他平台订单已取消;


       在大型的商城项目中需要执行节点可能更多,比如淘宝系统,可能还会累积用户取消次数,取消次数达到阈值后,将用户列入风控名单,限制用户购买运费险等。如果这些操作我们放到一个线程里执行,执行的步骤越多,给用户响应会越慢;上一步执行失败可能会影响后面的操作无法执行;有些步骤执行失败后可能需要重试……所有执行节点耦合在一起,一笔订单取消用3s以上都有可能,而我们正常的APP响应,超过500ms,都会感觉到卡顿,这样肯定不行。


       所以,我们必须把执行步骤解耦。用户最关注步骤①和②的执行结果,所以①和②的优先级最高,执行完成后需要立刻返回;③④⑤可以晚点告知用户,优先级相对降低,且③④⑤不依赖彼此的执行结果,所以我们可以新建一个线程池专门执行③④⑤,并分别添加异常处理。这时候,我们使用新建线程池的方式完成了解耦操作。


       随着使用系统的人数增多,订单量越来越多,系统的QPS持续升高,机器的负载也越来越高,系统响应时长又变慢了,怎么办呢? 你可能会说,都这时候了,那肯定是扩容啊。是的,那怎么个扩法呢?


       方法一:横向扩展,把项目往服务器上多部署几个;


       方法二:使用rocketMq;我们之前是新建了一个线程池,专门执行③④⑤。方法二简单来说就是换一种异步执行的方式,把③④⑤迁到新的系统ConsumerProject,原系统简称OrderProject。当①②执行完成,发送消息到消息队列,ConsumerProject建立监听,监听到消息后执行③④⑤。


       方法二的好处是我们可以根据系统负载情况对OrderProject 和ConsumerProject 分别扩容,比如在机器有限的情况下,OrderProject 可以优先部署在性能相对比较好的机器上,可能部署2个实例就够了;ConsumerProject 执行的步骤比较多,可以根据情况多部署几个实例。这样通过rocketMq可以很好的将执行链路“缩短”,对操作步骤解耦。



2、减少下游对上游的影响



还用1的例子,当优惠券系统响应慢或者宕机了,因为③在ConsumerProject中执行,所以此时最多也只影响到ConsumerProject工程,不会影响到OrderProject工程。用户收到优惠券退还的通知会晚一点,但订单取消和退款都能正常进行。


削峰平谷


 以秒杀系统为例,用户的请求量在短时间内暴增,消费者消费消息时,很可能出现因消息发送量突增而来不及处理的情况,导致消费方负载过高,进而导致影响系统稳定性。在实际场景中,消息的到来具有瞬时性、不规律性,导致系统可能出现空闲资源。rocketMq削峰平谷就是把超过消费端处理能力的消息(图中黄色部分)均摊到后面系统空闲时去处理,让系统负载处在一个稳定的水位,同时尽可能地处理更多消息。

ff7862ce539d9b3fbaf8fef4dd58d6e9.png

(来自AHAS为消息队列RocketMQ版消费端削峰填谷 - 应用高可用服务 AHAS - 阿里云

       除了使用AHAS,我认为还可以使用rocketMq的拉取模式,根据消费者的消费能力和业务场景自定义拉取方式来处理消息。


三、总结

 这篇rocketMq入门,我们从rocketMq是什么,和其他消息队列的对比入手,对rocketMq 有了一个总体的认识。同时通过结合场景,我们看到了rocketMq 在异步解耦,削峰平谷上发挥的巨大力量,后面我们将结合配置和源码对rocketMq进行更加深入的认识,敬请期待。



相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
7月前
|
消息中间件 存储 Kafka
一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
本文详细介绍了分布式消息中间件RocketMQ的核心概念、部署方式及使用方法。RocketMQ由阿里研发并开源,具有高性能、高可靠性和分布式特性,广泛应用于金融、互联网等领域。文章从环境搭建到消息类型的实战(普通消息、延迟消息、顺序消息和事务消息)进行了全面解析,并对比了三种消费者类型(PushConsumer、SimpleConsumer和PullConsumer)的特点与适用场景。最后总结了使用RocketMQ时的关键注意事项,如Topic和Tag的设计、监控告警的重要性以及性能与可靠性的平衡。通过学习本文,读者可掌握RocketMQ的使用精髓并灵活应用于实际项目中。
5581 9
 一文带你从入门到实战全面掌握RocketMQ核心概念、架构部署、实践应用和高级特性
|
消息中间件 新零售 弹性计算
云消息队列 RabbitMQ 版入门训练营,解锁对比开源优势与零基础实战
欢迎加入「云消息队列 RabbitMQ 版入门训练营」。
317 97
EMQ
|
安全 网络性能优化
MQTT 5.0 报文(Packets)入门指南
MQTT 控制报文是 MQTT 数据传输的最小单元。MQTT 客户端和服务端通过交换控制报文来完成它们的工作,比如订阅主题和发布消息。
EMQ
1295 95
MQTT 5.0 报文(Packets)入门指南
|
消息中间件 Java Kafka
RabbitMQ 入门
RabbitMQ 入门
288 0
|
消息中间件 存储 Java
分享一下rocketmq入门小知识
分享一下rocketmq入门小知识
378 0
分享一下rocketmq入门小知识
|
网络协议 物联网 测试技术
App Inventor 2 MQTT拓展入门(保姆级教程)
本文演示的是App和一个测试客户端进行消息交互的案例,实际应用中,我们的测试客户端可以看着是任意的、支持MQTT协议的硬件,通过订阅及发布消息,联网硬件与我们的App进行双向数据通信,以实现万物互联的智能控制效果。
1133 2
|
消息中间件 监控 Linux
RabbitMQ轻松入门:从零开始的部署与安装指南
RabbitMQ轻松入门:从零开始的部署与安装指南
379 0
RabbitMQ轻松入门:从零开始的部署与安装指南
|
消息中间件 Docker 微服务
RabbitMQ入门指南(十一):延迟消息-延迟消息插件
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了DelayExchange插件、延迟消息插件实现延迟消息等内容。
2552 0
|
消息中间件 存储 Kafka
01.RabbitMQ入门
01.RabbitMQ入门
176 0
|
消息中间件 微服务
RabbitMQ入门指南(十):延迟消息-死信交换机
RabbitMQ是一个高效、可靠的开源消息队列系统,广泛用于软件开发、数据传输、微服务等领域。本文主要介绍了死信交换机、死信交换机实现延迟消息等内容。
529 0