SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比

简介: SA实战 ·《SpringCloud Alibaba实战》第18章-消息服务:MQ使用场景与选型对比

大家好,我是冰河~~

一不小心《SpringCloud Alibaba实战》专栏都更新到第18章了,再不上车就跟不上了,小伙伴们快跟上啊!

注意:本项目完整源码加入 冰河技术 知识星球即可获取,文末有入场方式。

在《SpringCloud Alibaba实战》专栏前面的文章中,我们实现了用户微服务、商品微服务和订单微服务之间的远程调用,并且实现了服务调用的负载均衡。也基于阿里开源的Sentinel实现了服务的限流与容错,并详细介绍了Sentinel的核心技术与配置规则。

简单介绍了服务网关,并对SpringCloud Gateway的核心架构进行了简要说明,也在项目中整合了SpringCloud Gateway网关实现了通过网关访问后端微服务,同时,也基于SpringCloud Gateway整合Sentinel实现了网关的限流功能,详细介绍了SpringCloud Gateway网关的核心技术。

在链路追踪章节,我们开始简单介绍了分布式链路追踪技术与解决方案,随后在项目中整合Sleuth实现了链路追踪,并使用Sleuth整合ZipKin实现了分布式链路追踪的可视化 。

今天,我们正式进入消息服务章节,首先,我们来简单的聊聊MQ的使用场景,引入MQ后的注意事项以及MQ的选型对比。

本章总览

图片.png


MQ的使用场景

MQ的英文全称是Message Queue,翻译成中文就是消息队列,队列实现了先进先出(FIFO)的消息模型。通过消息队列,我们可以实现多个进程之间的通信,例如,可以实现多个微服务之间的消息通信。MQ的最简模型就是生产者生产消息,将消息发送到MQ,消息消费者订阅MQ,消费消息。

图片.png


MQ的使用场景通常包含:异步解耦、流量削峰

异步解耦

关于异步的场景,我们这里举一个用户下单成功后,向用户发送通知消息,为用户增加积分和优惠券的场景。

同步耦合场景分析

如果是同步调用的场景,则具体业务为:当用户提交订单成功后,订单系统会调用通知系统为用户发送消息通知,告知用户下单成功,订单系统调用积分系统为用户增加积分,订单系统调用优惠券系统为用户增加优惠券。整个调用流程如下所示。

图片.png

通过上图的分析,可以看到,用户调用订单系统下单时,总共会经过8个步骤。并且每个步骤都是紧密耦合在一起串行执行,如下所示。

image.gif图片.png

此时,订单系统、通知系统、积分系统和优惠券系统是紧密耦合在一起的,订单系统下单、通知系统发通知、积分系统发积分和优惠券系统发优惠券,四个任务全部完成后,才会给用户返回提交订单的结果信息。

用户提交订单花费的总时间为调用订单系统下单的时间+订单系统调用通知系统发送通知的时间+订单系统调用积分系统发放积分的时间+订单系统调用优惠券系统发放优惠券的时间。

注意:这里为了更好的说明系统之间串行执行的问题,忽略了网络的延迟时间。

这种串行化的系统执行方式,在高并发、大流量场景下是不可取的。另外,如果其中一个系统异常或者宕机,势必会影响到订单系统的可用性。在系统维护上,只要任意一个系统的接口发生变动,订单系统的逻辑也要跟着发生变动。

异步解耦场景分析

既然在高并发、大流量场景下使用订单系统直接串行调用通知系统、积分系统和优惠券系统的方式不可取。那我们是否能够使用异步解耦的方式呢。

其实,在用户提交订单的场景中,用户最关心的是自己的订单是否提交成功,由于下单时,订单系统会直接返回是否下单成功的提示。

对于通知、积分和优惠券可以以异步的方式延后一小段时间执行。并且通知系统、积分系统和优惠券系统之间不存在必然的业务关联逻辑,它们之间可以以并行的方式执行。

所以,可以使用MQ将订单系统与通知系统、积分系统和优惠券系统进行解耦,用户调用订单系统的接口下单时,订单系统向数据库写入订单数据后,向MQ写入消息,就可以直接返回给用户下单成功的提示,此时通知系统、积分系统和优惠券系统都订阅MQ中的消息,收到消息后各自执行自身的业务逻辑即可。

image.gif图片.png

当引入MQ进行异步解耦之后,用户调用订单系统的接口下单,订单系统执行完业务逻辑将订单数据入口,会向MQ发送一条消息,随后便直接返回用户下单成功的提示。通知系统、积分系统和优惠券系统会同时订阅MQ中的消息,当收到消息时,它们各自会执行自身的业务逻辑,并且它们是以并行的方式执行各自的业务逻辑。

图片.pngimage.gif

从执行的时间线上可以看出,当引入MQ进行异步解耦之后,通知系统、积分系统、优惠券系统和订单系统回复响应都是并行执行的,大大提高系统的执行性能。

并且解耦后,任意一个系统异常或者宕机,都不会影响到订单系统的可用性。只要订单系统与其他系统提前约定好发送的消息格式和消息内容,后续任意一个系统的业务逻辑变动,几乎都不会影响到订单系统的逻辑。

流量削峰

MQ在高并发、大流量的场景下可以用作削峰填谷的利器,例如,12306的春运抢票场景、高并发秒杀场景、双十一和618的大促场景等。

在高并发、大流量业务场景下,瞬间会有大量用户的请求涌入系统,如果不对这些流量做处理的话,直接让这些流量进入下游系统,则很可能由于下游系统无法支撑如此高的并发而导致系统崩溃或宕机。为了解决这些问题,可以引入MQ进行流量的削峰填谷。

图片.pngimage.gif

将流量发送到MQ中后,下游系统根据自身的处理能力进行消费即可。保证了下游系统的高可用性。

图片.png

系统的整体可用性降低

在对一个系统进行架构设计时,引入的外部依赖越多,系统的稳定性和可用性就会降低。系统中引入了MQ,部分业务就会出现强依赖MQ的现象,此时,如果MQ宕机,则部分业务就会变得不可用。所以,引入MQ时,我们就要考虑如何实现MQ的高可用。

系统的复杂度变高

引入MQ后,会使之前的同步接口调用变成通过MQ的异步调用,在实际的开发过程中,异步调用会比同步调用复杂的多。并且异步调用出现问题后,重现问题,定位问题和解决问题都会比同步调用复杂的多。

并且引入MQ后,还要考虑如何保证消息的顺序等问题。

消息一致性问题

引入MQ后,不得不考虑的一个问题就是消息的一致性问题。这期间就要考虑如何保证消息不丢失,消息幂等和消息数据处理的幂等性问题。

MQ选型对比

目前,在行业内使用的比较多的MQ包含RabbitMQ、Kafka和RocketMQ。这里,我将三者的对比简单整理了个表格,如下所示。

消息中间件(MQ) 优点 缺点 使用场景
RabbitMQ 功能全面、消息的可靠性比较高 吞吐量低,消息大量积累会影响性能,使用的开发语言是erlang,不好定制功能。 规模不大的场景
Kafka 吞吐量最高,性能最好,集群模式下高可用 功能上比较单一,会丢失部分数据 日志分析,大数据场景
RocketMQ 吞吐量高,性能高,可用性高,功能全面。使用Java语言开发,容易定制功能。 开源版不如阿里云上版,文档比较简单。 几乎支持所有场景,包含大数据场景和业务场景。

好了,今天我们就到儿吧,限于篇幅,文中并未给出完整的案例源代码,想要完整源代码的小伙伴可加入【冰河技术】知识星球获取源码。也可以加我微信:hacker_binghe,一起交流技术。

另外,一不小心就写了18章了,小伙伴们你们再不上车就真的跟不上了!!!

相关实践学习
通过轻量消息队列(原MNS)主题HTTP订阅+ARMS实现自定义数据多渠道告警
本场景将自定义告警信息同时分发至多个通知渠道的需求,例如短信、电子邮件及钉钉群组等。通过采用轻量消息队列(原 MNS)的主题模型的HTTP订阅方式,并结合应用实时监控服务提供的自定义集成能力,使得您能够以简便的配置方式实现上述多渠道同步通知的功能。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
9月前
|
消息中间件 大数据 关系型数据库
RocketMQ实战—3.基于RocketMQ升级订单系统架构
本文主要介绍了基于MQ实现订单系统核心流程的异步化改造、基于MQ实现订单系统和第三方系统的解耦、基于MQ实现将订单数据同步给大数据团队、秒杀系统的技术难点以及秒杀商详页的架构设计和基于MQ实现秒杀系统的异步化架构。
679 64
RocketMQ实战—3.基于RocketMQ升级订单系统架构
|
9月前
|
消息中间件 Java 数据库
RocketMQ实战—9.营销系统代码初版
本文主要介绍了实现营销系统四大促销场景的代码初版:全量用户推送促销活动、全量用户发放优惠券、特定用户推送领取优惠券消息、热门商品定时推送。
RocketMQ实战—9.营销系统代码初版
|
9月前
|
消息中间件 搜索推荐 调度
RocketMQ实战—8.营销系统业务和方案介绍
本文详细介绍了电商营销系统的业务流程、技术架构及挑战解决方案。涵盖核心交易与支付后履约流程,优惠券和促销活动的发券、领券、用券、销券机制,以及会员与推送的数据库设计。技术架构基于Nacos服务注册中心、Dubbo RPC框架、RocketMQ消息中间件和XXLJob分布式调度工具,实现系统间高效通信与任务管理。针对千万级用户量下的推送和发券场景,提出异步化、分片处理与惰性发券等优化方案,解决高并发压力。同时,通过RocketMQ实现系统解耦,提升扩展性,并利用XXLJob完成爆款商品推荐的分布式调度推送。整体设计确保系统在大规模用户场景下的性能与稳定性。
RocketMQ实战—8.营销系统业务和方案介绍
|
4月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
1988 1
|
9月前
|
消息中间件 存储 NoSQL
RocketMQ实战—6.生产优化及运维方案
本文围绕RocketMQ集群的使用与优化,详细探讨了六个关键问题。首先,介绍了如何通过ACL配置实现RocketMQ集群的权限控制,防止不同团队间误用Topic。其次,讲解了消息轨迹功能的开启与追踪流程,帮助定位和排查问题。接着,分析了百万消息积压的处理方法,包括直接丢弃、扩容消费者或通过新Topic间接扩容等策略。此外,提出了针对RocketMQ集群崩溃的金融级高可用方案,确保消息不丢失。同时,讨论了为RocketMQ增加限流功能的重要性及实现方式,以提升系统稳定性。最后,分享了从Kafka迁移到RocketMQ的双写双读方案,确保数据一致性与平稳过渡。
|
9月前
|
消息中间件 NoSQL 大数据
RocketMQ实战—5.消息重复+乱序+延迟的处理
本文围绕RocketMQ的使用与优化展开,分析了优惠券重复发放的原因及解决方案。首先,通过案例说明了优惠券系统因消息重复、数据库宕机或消费失败等原因导致重复发券的问题,并提出引入幂等性机制(如业务判断法、Redis状态判断法)来保证数据唯一性。其次,探讨了死信队列在处理消费失败时的作用,以及如何通过重试和死信队列解决消息处理异常。接着,分析了订单库同步中消息乱序的原因,提出了基于顺序消息机制的代码实现方案,确保消息按序处理。此外,介绍了利用Tag和属性过滤数据提升效率的方法,以及延迟消息机制优化定时退款扫描的功能。最后,总结了RocketMQ生产实践中的经验.
RocketMQ实战—5.消息重复+乱序+延迟的处理
|
9月前
|
消息中间件 Java 测试技术
RocketMQ实战—7.生产集群部署和生产参数
本文详细介绍了RocketMQ生产集群的部署与调优过程,包括集群规划、环境搭建、参数配置和优化策略。
RocketMQ实战—7.生产集群部署和生产参数
|
9月前
|
消息中间件 NoSQL Java
RocketMQ实战—10.营销系统代码优化
本文主要介绍了如何对营销系统的四大促销场景的代码进行优化,包括:全量用户推送促销活动、全量用户发放优惠券、特定用户推送领取优惠券消息、热门商品定时推送。
|
9月前
|
消息中间件 存储 Kafka
RocketMQ实战—4.消息零丢失的方案
本文分析了用户支付完成后未收到红包的问题,深入探讨了RocketMQ事务消息机制的实现原理及其在确保消息零丢失中的作用。首先,通过全链路分析发现消息可能在推送、存储或消费环节丢失。接着,介绍了RocketMQ事务消息机制如何通过half消息、本地事务执行及回调确认来保证消息发送成功,并详细解析了其底层原理,如half消息对消费者不可见、rollback与commit操作等。同时,对比了同步重试方案,指出其在复杂场景下的局限性。
RocketMQ实战—4.消息零丢失的方案

热门文章

最新文章