云原生架构设计:分布式消息队列技术解析

news2025/2/26 13:19:25

消息队列是在消息传输过程中保存消息的容器,消息队列管理器在将消息从源到目标时充当中间人的角色,消息队列的主要目的是提供路由并保证消息的可靠传递。如果发送消息时接收者不可用,那消息队列就会保留消息,直到下次成功消费为止。

分布式消息系统通过提供消息传递和消息排队模型,在分布式环境下扩展进程间的通信,并支持多通信协议、语言、应用程序、软硬件平台,实现系统之间的可靠异步消息通信,并保障数据再复杂网络中的高效传输、稳定、安全、可靠,以及分布式环境下的高可用性和一致性,常用在应用解耦、异步通信、流量削峰填谷、日志收集、缓存更新、数据同步、事务最终一致性等典型场景。

在云原生时代,微服务架构的大规模应用对链路间的可靠性传输提出了更大的挑战,而消息服务作为应用通信的基础设施,逐渐成为微服务架构应用的核心依赖,同时也是实践云原生核心设计理念的关键技术。架构师和核心开发人员通过分布式消息系统可以搭建出分布式、高性能、弹性、稳定的应用程序。

消息服务在云原生架构中的重要性也导致其极有可能成为应用实践云原生的阻塞点,所以消息服务的云原生化也是至关重要的。在云原生时代,消息队列不仅解耦不同的微服务,而且随着 Serverless、Service Mesh 等技术的广泛应用,分布式消息队列的使用场景也得到了进一步的扩展从可靠异步传输链路的基础设施,逐渐演变为事件传递的中枢神经,连接着各种各样的云服务、云应用和 SaaS 产品,提升了产品的集成与被集成能力,消息形态也从单纯的消息裸数据逐渐转变为更高维度的事件抽象。

2、典型技术和架构

当前主流的主要有 Apache Kafka、RabbitMQ、ActiveMQ、RocketMQ 等。

  • RabbitMQ:开源的消息队列中间件,支持多种消息协议和消息模式,适用于广泛的应用场
  • ActiveMQ:基于 JMS 规范的消息队列实现,提供了丰富的特性和可靠性保障
  • Apache Kafka:由 LinkedIn 开发的高吞吐量分布式消息系统,旨在为处理实时数据提供一个统一、高通量、低延迟的平台。最大特性是可以实时处理大数据以满足各种需求场景
  • RocketMQ:一款低延迟、高可靠、可伸缩、易于使用的消息中间件,由阿里巴巴贡献给 Apache,采用发布-订阅模式传递消息,具有高效灵活的水平扩展能力和海量消息堆积能力

消息队列一般都采用如下图所示的中心化架构:

(图片来自互联网)

分布式消息队列包含以下模块:

  • 客户端:提供了消息的接收和订阅 API,同时支持重试、熔断等高可用功能
  • 注册中心:提供了集群管理、元数据管理、路由和服务发现等功能
  • 计算节点:在消息队列的服务端 Broker 中,计算部分包含高性能的传输层以及可扩展的 RPC 框架,用于处理来自客户端的不同请求
  • 存储引擎:Broker 的核心是存储引擎,某些消息队列可能会将存储引擎与计算节点拆分开来,主要是为了消息提供高性能持久化,以队列方式组织消息,用以保证消息必达

3、云原生时代的挑战

在云原生时代,虽然消息队列已经成为了云原生架构的底层通信基础设施,但是随着使用场景的逐步扩展,也面临着更大的挑战,主要来自以下几个方面的挑战:

高 SLA

消息队列在应用系统中一般用于业务的核心链路,因此业务系统对消息队列的可用性要求极高,在云原生时代,云原生应用对消息这种云原生 BaaS 有更高的 SLA 要求,应用将假设它依赖的云原生服务具备和云一样的可用性,从而无须建设备份链路来提高应用的可用性,降低了架构的复杂度。

高性能

随着越来越多的行业场景开始使用消息队列,就随之而来更高的要求。除了容量之外,更低的写入延迟,更短的端到端延时,更平稳的性能曲线都是需要关注的重点。

极致弹性

消息队列是有状态服务,云原生时代的消息队列最大的改进在于从用户的视角彻底消除了状态,在逻辑资源和物理资源两个维度真正做到了按需使用。消息队列与 Serverless 的结合正好将这种需求做到了极致。架构师和研发者更关心消息实例提供的逻辑资源是否充足,队列数量是否能满足扩展性的需求。在服务提供者侧,我们更关心的是如何降低运维的成本,系统可以根据集群 Load 等指标自动扩容或收缩 MQ 物理资源,而 Kubernetes 和 Serverless 等技术的大量使用,使得这种极致的弹性扩缩能力成为可能。

标准

为避免厂商锁定,同时提升多种消息队列的互通性,云原生时代的消息队列必定是遵循开源和开放标准的。在消息领域,无论是接口还是协议,社区一直有很多事实标准用于提高消息队列的易用性,比如,Kafka 提供的 API 和协议、JMS API、CloudEvents 规范,MQTT 中的协议和模型,AMQP 的协议和模型等。以阿里云为代表的云平台的消息队列产品对这些事实标准都提供了相应的接入方式,企业可以低成本地完成迁移上云。然而,事实标准如果太多,其实就是没有标准。OpenMessaging 作为云原生时代的分布式消息队列标准,得到了越来越多云平台的支持,它将提供六大核心特性:多领域、流、平台无关、标准的 Benchmark、面向云和线路层可插拔。

原生事件支持

事件相对于消息更加具象化,代表了事情的发送、条件和状态的变化。事件源来自不同的组织和环境,所以事件总线天然需要跨组织。事件源对事件将如何响应没有任何预期,所以采用事件的应用架构是更彻底的解耦,将具备更好的可扩展性和灵活性。云原生时代的消息队列已经不只停留在消息层面,而是对更高维度的事件提供支持,这不仅消除了微服务之间的耦合,甚至在企业的组织架构层面都做了解耦,提升了应用本身的集成与被集成能力。同时,消息队列对事件的更好支持,也使得 EDA(Event-Driven Architecture,事件驱动架构)在微服务领域得到广泛的应用。

4、RocketMQ 阿里实践案例分析

阿里巴巴内部业务众多,微服务化带来了大量的系统间交互。其中,消息是不同微服务间进行交互所不可缺少的一环,尤其是对于交易、物流等核心业务链路而言。阿里巴巴内部的使用场景具体包括异步解耦、削峰填谷、数据同步、事务最终一致性保证等。

下面以电商业务为案例来讲述消息系统的具体使用。

在电商业务中,用户的下单流程可以简单地分为两个阶段,支付阶段和物流阶段,这两个阶段的业务逻辑是由两个相互独立的微服务完成的,如下图所示,下单服务编排了 Alipay 和菜鸟两个服务,以完成整个网购流程。

异步解耦

异步解耦本质上是一个同步转异步的过程,在系统间的交互过程中,最大程度避免上游服务对下游服务的依赖,并保证整个业务链路的完整性与正确性。

在上述网购业务中,相较于支付服务,物流服务中包含的业务链路更长。所以,在用户购买服务中,如果需要等待物流服务返回具体的结果,则不仅会影响用户体验,而且会极大降低系统性能。因此,阿里巴巴内部使用分布式消息队列 RocketMQ 来解耦上游支付系统与物流订单系统的耦合。

通过异步解耦,系统只需要在支付完成、发送物流消息成功后,向用户返回购买成功的信息即可,而不用等待物流系统实际处理后再返回。这不仅提升了用户体验,还提升了系统容量,同时降低了系统开发的复杂度。

削峰填谷

随着电商业务的蓬勃发展,大促已经成为电商领域非常常见的营销模式,但大促会对系统带来超过平时数倍乃至上百倍的数据压力,因此需要引入 RocketMQ 分布式消息队列。RocketMQ 的引入,不仅可以解决支付系统与物流系统的耦合,而且在大促流量达到洪峰后,还可以通过自身所具有的亿级消息堆积能力,极大程度地降低物流服务被冲垮的风险,使得物流服务可以按照自身的实际处理能力对业务进行处理。同时,由于 RocketMQ 提供了消息必达的能力,能够避免消息丢失给用户带来损失,保证了整个业务处理的完整性与正确性。

事务最终一致性

回到上面的案例,虽然我们已经把整个电商网购业务简单地拆分成两个阶段,但是仍不可避免地要对系统之间可能产生的异常进行容错处理。那么,我们就要面临一个非常简单的问题,到底是应该先扣款支付,还是应该先发物流消息。如果先发物流消息,而扣款不成功,则将给平台带来极大的损失;而一旦选择先扣款,如果扣款成功,消息发送却失败,则将会发生用户付款了却收不到货的情况,这将给用户造成损失;因此,这两种选择都是不可接受的。

在这个案例中,我们使用 RocketMQ 提供的事务消息轻松解决了这个问题。在事务消息的解决方案中,我们首先会发送一条 prepare 消息到 RocketMQ 集群,此时,该消息并不会被下游物流服务收到;发送 prepare 消息成功后,我们会进行实际的扣款,如果扣款成功,就会提交上述 prepare 消息,并投递到下游物流服务中,而如果扣款失败,我们就会回滚上述 prepare 消息,避免下游物流服务收到该消息。此时,我们需要面临另外一个问题:如果在提交或回滚的过程中,当前处理业务的下单服务实例宕机怎么办?RocketMQ 通过回查机制解决了这个问题,如果一条prepare消息在很长时间后还没有提交或回滚,那么 RocketMQ 就会主动向集群中的其他下单服务发起回查,其他实例会根据实际扣款结果来决定是否提交或回滚该 prepare 消息。以 RocketMQ 为代表的分布式消息队列通过这种方式解决了系统开发过程中常见的分布式事务问题。

分布式消息队列技术是云原生架构设计中的重要组成部分,为构建高效、可靠的云原生应用系统提供了关键支持。在未来,随着云原生架构的不断演进,分布式消息队列技术将扮演者越来越重要的角色,推动者云原生应用的发展和创新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1504819.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超网、IP 聚合、IP 汇总分别是什么?三者有啥区别和联系?

一、超网 超网(Supernet)是一种网络地址聚合技术,它可以将多个连续的网络地址合并成一个更大的网络地址,从而减少路由表的数量和大小。超网技术可以将多个相邻的网络地址归并成一个更大的网络地址,这个更大的网络地址…

C语言:通讯录(纯代码)

目录 背景&#xff1a;VS2019编译器 创建文件&#xff1a; contact.h代码&#xff1a; test.c代码&#xff1a; contact.c代码&#xff1a; 背景&#xff1a;VS2019编译器 创建文件&#xff1a; contact.h代码&#xff1a; #pragma once#include <string.h> #includ…

第二课 情感认知模型

一、学习目标 1.学习各种思想的情感模型 2.了解通过情感诱发方法所建立的情感模型 二、情感模型 想要进行情感计算&#xff0c;首先步骤就是对情感建模&#xff0c;要分析理解情感的产生&#xff0c;从而才能让计算机理解情感。由于情感是感性的&#xff0c;所以现有的情感模…

设计模式 代理模式

代理模式主要使用了 Java 的多态&#xff0c;主要是接口 干活的是被代理类&#xff0c;代理类主要是接活&#xff0c; 你让我干活&#xff0c;好&#xff0c;我交给幕后的类去干&#xff0c;你满意就成&#xff0c;那怎么知道被代理类能不能干呢&#xff1f; 同根就成&#xff…

ai学习前瞻-python环境搭建

python环境搭建 Python环境搭建1. python的安装环境2. MiniConda安装3. pycharm安装4. Jupyter 工具安装5. conda搭建虚拟环境6. 安装python模块pip安装conda安装 7. 关联虚拟环境运行项目 Python环境搭建 1. python的安装环境 ​ python环境安装有4中方式。 从上图可以了解…

BulingBuling - 《金钱心理学》 [ The Psychology of Money ]

金钱心理学 摩根-豪泽尔 关于财富、贪婪和幸福的永恒课程 The Psychology of Money Morgan Housel Timeless Lessons on Wealth, Greed, and Happiness 内容简介 [ 心理学 ] [ 金钱与投资 ] Whats it about? [ Psychology ] [ Money & Investments ] 《金钱心理学》&…

Jmeter---非GUI命令行的执行生成报告、使用ant插件执行接口测试脚本生成报告

非GUI命令行的执行 1. 在jmx后缀的文件目录下打开命令行 2. 运行&#xff1a; jmeter -n -t filename.jmx&#xff08;-n : 非GUI的方式 -t: 指定需要执行的脚本&#xff09; 生成jtl报告 运行&#xff1a; jmeter -n -t filename.jmx -l result_filename.jtl 生成html报…

【解读】OWASP大语言模型应用程序十大风险

OWASP大型语言模型应用程序前十名项目旨在教育开发人员、设计师、架构师、经理和组织在部署和管理大型语言模型&#xff08;LLM&#xff09;时的潜在安全风险。该项目提供了LLM应用程序中常见的十大最关键漏洞的列表&#xff0c;强调了它们的潜在影响、易利用性和在现实应用程序…

剑指offer经典题目整理(二)

一、斐波那契数列&#xff08;fib&#xff09; 1.链接 斐波那契数列_牛客题霸_牛客网 (nowcoder.com) 2.描述 斐波那契数列就是数列中任意一项数字&#xff0c;都会等于前两项之和&#xff0c;满足f(n) f(n-1) f(n-2) 的一个数列&#xff0c;例如&#xff1a;1 1 2 3 5 8…

类与对象-对象特性

师从黑马程序员 对象的初始化和清理 构造函数和析构函数 用于完成对象的初始化和清理工作 如果我们不提供构造和析构&#xff0c;编译器会提供编译器提供的构造函数和析构函数是空实现 构造函数&#xff1a;主要用于创建对象时为对象的成员属性赋值&#xff0c;构造函数由编…

CSS伪类与常用标签属性整理与块级、行级、行级块标签(文本,背景,列表,透明,display)

目录 文本 color&#xff1a;字体颜色 font-size&#xff1a;字体大小​编辑 front-family&#xff1a;字体 text-align&#xff1a;文本对齐 text-decoration:line-through&#xff1a;定义穿过文本下的一条线 text-decoration:underline&#xff1a;定义文本下的一条线…

7-15 2.2 译密码

输入5个字母&#xff0c;将其译成密码&#xff0c;密码规律是&#xff1a;用原来的字母后面第4个字母代替原来的字母。例如&#xff1a;A被E代替&#xff0c;C被G代替。 输入格式: 输入一行5个字符 输出格式: 输出一行5个字符 输入样例: China输出样例: Glmre #include …

前端框架的发展历程

文章目录 前言 一、静态页面时代 二、JavaScript的兴起 三、jQuery的出现 四、前端框架的崛起 1.AngularJS 2.React 3.Vue.js 五、面向组件化的发展趋势 总结 前言 前端框架的发展史就是一个不断进化的过程&#xff0c;它的发展和进化一定程度…

消息服务--Kafka的简介和使用

消息服务--Kafka的简介和使用 前言异步解耦削峰缓存1、消息队列2、kafka工作原理3、springBoot KafKa整合3.1 添加插件3.2 kafKa的自动配置类3.21 配置kafka地址3.22 如果需要发送对象配置kafka值的序列化器3.3 测试发送消息3.31 在发送测试消息的时候由于是开发环境中会遇到的…

flask-sqlalchemy库

彩笔激流勇退。 1. 简介 ORM&#xff0c;对象关系映射。简单来说&#xff0c;ORM将数据库中的表与面向对象中的类建立了一种对应关系。这样&#xff0c;我们要操作数据库&#xff0c;表&#xff0c;记录就可以直接通过操作类或者类实例来完成。 SQLAlchemy 是目前python中最…

连接时序分类 Connectionist Temporal Classification (CTC)

CTC全称Connectionist temporal classification&#xff0c;是一种常用在语音识别、文本识别等领域的算法&#xff0c;用来解决输入和输出序列长度不一、无法对齐的问题。在CRNN中&#xff0c;它实际上就是模型对应的损失函数(CTC loss)。 一、背景 字母和语音的对齐(align)非…

Redis 内存的优化

目录 前言 Redis 的内存碎片问题 判断Redis 内存碎片 如何清理内存碎片&#xff1f; 前言 我想讲一下怎么提高Redis 内存的利用率&#xff0c;redis 的数据是保存在内存中。对内存的利用率低&#xff0c;意味着存的数据很少&#xff0c;并不意味着就没有内存了&#xff0c…

React-路由导航

1.声明式路由导航 1.1概念 说明&#xff1a;声明式导航是指通过在模版中通过<Link/>组件描述出要跳转到哪里去&#xff0c;比如后台管理系统的左侧菜单通常使用这种方式进行。 import {Link} from "react-router-dom" const Login()>{return (<div>…

[nlp入门论文精读] | Transformer

写在前面 最近工作从CV转向了NLP&#xff0c;于是空余时间便跟着哔哩哔哩李沐老师的视频学习。其实研一NLP课程讲论文的时候&#xff0c;我们小组就选择了经典的Attention和Bert&#xff0c;但还有很多细节并不完全理解&#xff0c;实际使用时也很困惑。 因此这个系列就来记…

Spring学习 基础(三)MVC

5、Spring MVC 传统Web模式&#xff1a; Model:系统涉及的数据&#xff0c;也就是 dao 和 bean。View&#xff1a;展示模型中的数据&#xff0c;只是用来展示。Controller&#xff1a;处理用户请求都发送给 &#xff0c;返回数据给 JSP 并展示给用户。 随着 Spring 轻量级开发…