2021年12月15日

重新定义分析 - EventBridge实时事件分析平台发布
对于日志分析大家可能并不陌生,在分布式计算、大数据处理和 Spark 等开源分析框架的支持下,每天可以对潜在的数百万日志进行分析。 事件分析则和日志分析是两个完全不同的领域,事件分析对实时性的要求更高,需要磨平事件领域中从半结构化到结构化的消息转换管道,实现查询检索,可视化等功能。但是目前针对流式的事件做分析的可用工具非常少,这对于期望使用Serverless架构或 EDA(事件驱动)架构的开发者会非常不便。(更多 EDA 架构介绍参考 :) 基于事件的特征,无法追溯事件内容,无法跟踪事件流转,无法对事件做可视化分析成为了事件驱动架构演进的绊脚石。为了解决事件领域中针对流式事件做分析的难题,EventBridge 近日发布了针对事件/消息领域的全新分析工具EventBridge 实时事件分析平台。下面简要对 EventBridge 实时事件分析平台的内容进行介绍。 EventBridge 实时事件分析平台简介_ EventBridge 实时事件分析平台依托基于事件的实时处理引擎,提供数值检索、可视化分析、多组态分析、事件轨迹、事件溯源和 Schema 管理等能力。EventBridge 实时事件分析平台具有无入侵、无需数据上报,低成本,操作快捷等特点,通过简单的引导式交互,即可快速实现基于事件的流式查询与分析。 EventBridge 实时事件分析平台依托基于事件的实时处理引擎,提供数值检索,可视化分析,多组态分析,事件轨迹,事件溯源,Schema 管理等能力。EventBridge 实时事件具有无入侵,无需数据上报,低成本,操作快捷等特点,通过简单的引导式交互,即可快速实现基于事件的流式查询与分析。 核心功能 多场景支持 目前市面上比较流行的是事件查询平台,但是分析和查询还是有些本质区别,分析基于查询,但是查询并不是分析的全部。 EventBridge 构建了一套完整的事件工具链,帮助开发,运维,甚至运营团队更高效的使用分析工具,统一在一个分析平台上无缝整合全部事件,提供高效、可靠、通用的事件分析能力。 Serverless 领域:得益于 Serverless 架构的推广,事件驱动被更多用在企业核心链路。无服务器的定义是不必管理任何基础设施,但是无服务器的不透明且难以调试却是整个架构必需解决的痛点,当我们配置完触发器后不会知道什么数据在什么时刻触发了函数,触发链路是否异常。EventBridge 事件分析能力将彻底解决 Serverless触发数据黑箱的问题,让所有事件触发都清晰可见。 微服务领域:微服务在现代开发架构中比较常见,该架构由小型、松耦合、可独立部署的服务集合而成,这导致微服务架构很难调试,系统中某一部分的小故障可能会导致大规模服务崩溃。很多时候不得不跳过某些正常服务来调试单个请求。EventBridge 事件分析可将全部链路微服务消息通过事件 ID 染色做有效追踪与排障,帮助微服务做可视化排障。 消息领域:在传统消息领域,消息 Schema 管理、消息内容检索一直是无法解决的难题,大部分情况下需要增加订阅者来对消息做离线分析。EventBridge 事件分析平台提供消息 Schema 管理与消息内容查询能力,为消息可视化提供更完全的解决方案。 云产品领域:云产品在极大程度降低了企业对基础设施建设的复杂性,但同样带来了诸多问题,以 ECS 为例,很多情况会因系统错误或云盘性能受损而触发故障类事件,这类事件通常会涉及到周边产品(比如 ACK 等),捕获全部云上事件做基础排障的挑战性比较大。EventBridge 支持全部云服务事件无缝接入,更大程度降低由云产品变更导致的运维故障。 EventBridge 提供更高效、通用的事件分析平台,基于该平台可以解决大部分场景对事件分析、事件查询、事件轨迹的诉求。 开箱即用 支持提供 Schema 管理,数值检索,可视化分析,多组态分析,事件轨迹,事件溯源等核心能力,无需额外部署,即开即用。 数值检索:提供基础数值检索能力,支持键入 key,value ,= ,!= , exists ,AND,OR 等参数,满足事件检索场景的基本诉求。 可视化分析:提供 GROUP BY,ORDER BY 等可视化分析能力,支持多组态,多图表,多维度分析能力。 链路追踪:提供事件轨迹能力,还原事件整体链路状态。帮助开发者快速排障,快速定位链路问题。 低成本接入 EventBridge 支持以事件总线(EventBus)形式接入,分为云服务事件总线和自定义事件总线。云服务总线支持几乎全部阿里云产品事件,无缝支持云服务事件接入事件分析平台;自定义事件总线支持 RocketMQ、Kafka 或其他自定义事件接入(当前版本仅支持少量云服务事件)。 整体接入流程较为简单,对原有业务入侵小,可随时关闭或开启事件分析,同时实现在线配置,且具备实时生效功能。 总结_ EventBridge 提供更便捷高效的事件分析工具,可以帮助开发人员简单定义查询条件,及时进行可视化的事件内容分析。
作者:肯梦
#技术探索 #生态集成

2021年12月11日

“全”事件触发:阿里云函数计算与事件总线产品完成全面深度集成
随着云原生技术的普及和落地,企业在构建业务系统时,往往需要依赖多个云产品和服务,产品互联、系统协同的需求越来越强。事件驱动架构将事件应用于解耦服务之间的触发和交互, 能够帮助用户很好实现产品、系统之间的互联互动。函数计算作为事件驱动架构的最佳选择,需要为用户提供丰富的事件源触发能力。 对于函数计算而言,事件源接入需要清晰地了解上游每一个事件源的诸多细节和鉴权要求,同时事件处理和系统错误追踪变得越加困难,集成效率成为阻碍产品能力的最大障碍。为了加速事件源集成的效率,函数计算需要找到一种统一标准的事件源接入方式,基于通用的接入层进行基础能力和可观测性的建设,为客户提供丰富的事件源触发选择。 在这样的背景和需求下,阿里云函数计算(Function Compute)和阿里云事件总线(EventBridge)产品完成全面深度集成。这意味着函数计算和阿里云生态各产品及业务 SaaS 系统有了统一标准的接入方式,意味着函数计算将具备接入 EventBridge 所有事件源的触发能力,Serverless 函数计算将实现触达阿里云全系产品服务的“最后一公里”,为基于阿里云生态产品提供重要的架构扩展能力。 为什么是 EventBridge? 阿里云事件总线(EventBridge)是一种无服务器事件总线,支持将用户的应用程序、第三方软件即服务(SaaS)数据和阿里云服务的数据通过事件的方式轻松的连接到一起,这里汇聚了来自云产品及 SaaS 服务的丰富事件,EventBridge 具备事件标准化和接入标准化的能力: 事件标准化:EventBridge 遵循业界标准的 CloudEvent 事件规范,汇聚了来自阿里云生态和 EventBridge 合作伙伴丰富事件源的各种事件,同时提供了完善的事件投递机制和消费策略,整个系统事件流转遵循统一的事件格式; 接入标准化:函数计算选择和 EventBridge 集成,无论是产品服务类型众多的阿里云官方事件源,还是第三方 SaaS 系统,EventBridge 都能够为函数计算和其它系统集成提供统一的集成界面,函数计算无需关注上游事件源的具体实现细节,只需要专注于事件处理,将事件的集成和投递全部交给 EventBridge 来处理; EventBridge  + Function Compute 的结合让事件驱动型应用程序的构建变得简单,因为它可以为您完成事件摄取和交付、安全保障、授权以及错误处理工作。允许您构建松散耦合和分布的事件驱动型架构,帮助提高开发人员敏捷性和应用程序弹性。函数计算系统提供了完善的函数创建, 发布和运行体系,灵活的构建能力结合极致的运行时弹性能力将帮助业务构建云原生时代最富显著特征的事件驱动型架构。 同时,EventBridge 能够提供来自事件源(例如 MQ、OSS、RDB等)的实时数据流,并将该数据路由到阿里云函数计算作为目标。您可以设置路由规则来确定发送数据的目的地,以便构建能够实时响应所有数据源的应用程序架构。 函数计算 + EventBridge 带来的变化? 提供 90+ 事件源接入 在和 EventBridge 集成之前, 函数计算已经实现了和阿里云部分核心系统的集成,随着函数计算 EventBridge 的深度集成,阿里云生态大量服务实现了和函数计算集成, 这些服务或产品的事件将作为事件源触发函数;目前函数计算触发器类型已经从原来的 15+ 增加到 90+,并随着 EventBridge 上游接入系统的增加而不断丰富; 控制台享受一站式服务 EventBridge 和函数计算控制台数据互通,用户在 EventBridge 控制台能够以事件为主体选择函数计算作为事件处理目标,在 EventBridge 控制台享受一站式服务;同样在函数计算控制台,用户能够根据不同触发器类型根据对应的事件类型编写函数;用户无需在函数计算控制台和事件总线控制台来回跳转; 保证数据一致性和稳定性 用户无论是在函数计算控制台上通过创建触发器的方式处理指定事件源的事件;还是在 EventBridge 控制台使用函数计算作为事件处理目标,提供统一的资源视图;同时在底层系统实现上,由于后端系统 API 的深度集成,能够保证上层业务逻辑采用统一的 API 及处理逻辑,从技术层面确保了多个入口功能实现的一致性,为客户系统稳定运行奠定坚实的基础; 简化数据消费投递的复杂度 对于数据消费场景,EventBridge 负责了上游系统的对接和数据消费,用户无需关心事件源系统数据具体消费方式,这部分工作统一由 EventBridge 完成;对于函数计算用户,只需要考虑数据投递的逻辑;用户可以直接选择 EventBridge 提供的下游 Target 实现数据投递,也可以在代码层面仅使用 EventBridge 提供的 SDK 实现数据的投递,大大简化了数据投递的复杂度。 触发器业务应用场景 下面就让我们一起探索, 实际的业务生产环境,我们如何利用这两把利器让这一切简单的发生: 自动化运营分析和展示 业务系统会产生大量动态指标数据,需要提取指标数据做运营分析和展示,通过 EventBridge 和 FC 异步化串联实现自动化运营分析和展示。传统方案需要基于实时计算或者离线计算产品做数据提取和分析,整个方案较重,配置复杂。数据分析结果需要做预定义的展示渲染和推送,需要手工对接业务系统,步骤繁琐。 采用新的 EDA 架构,采用 EventBridge 对接业务自定义事件数据,规则驱动过滤逻辑简单。采用 FC 可以轻量化实现常见的数据分析操作,代码编写调试更简单;同时利用EventBridge 丰富的推送能力,可以实现分析结果快速触达受众。 异步解耦 以交易引擎为例,交易系统引擎作为最核心的系统,每笔交易订单数据需要被几十几个下游业务系统关注,包括物品批价、发货、积分、流计算分析等等,多个系统对消息的处理逻辑不一致,单个系统不可能去适配每一个关联业务。结合 EventBridge 事件中心和函数计算灵活的逻辑扩展能力构建业务逻辑。 新零售大促场景 Serverless + EDA 整合 大型新零售场景会伴随不定期大促,平时流量不大的业务在大促场景也会产生系统流量突增,极致弹性和稳定解耦的架构至关重要。基于传统模式开发稳定可靠、高弹性的后台服务人力不足、工期紧张;大促场景保障峰值流量需要预留大量资源,平时低峰期资源闲置浪费。新零售大促场景利用函数计算 + EventBridge + API 网关搭建 Serverless 模式服务中台,支撑海量请求访问, 系统具备极致弹性,无需预留管理 IaaS 资源,极大程度降低闲置成本;同时函数计算提供敏捷开发结合 EventBridge 低代码异步驱动,业务迭代效率大幅提升。 总结 如果说事件背后的服务是阿里云生态服务的积木, 那么 Serverless 函数计算将是能够将这些积木通过轻巧的方式组合起来艺术化的最佳手段;你可以利用函数计算为这些积木涂上更绚丽的色彩,同时能够将他们串联起来,搭建一个具有无比想象空间的 SaaS/PaaS 服务艺术品。 EventBridge 触发器现已在阿里云函数计算控制台所有地域(Region)开放,欢迎大家点击进行使用体验! 关于触发器具体创建,配置,参考阿里云函数计算官方帮助文档:
作者:史明伟(世如)
#行业实践 #生态集成 #云原生

2021年11月17日

阿里云 EventBridge 事件驱动架构实践
_审核&校对:白玙、佳佳_ _编辑&排版:雯燕_ _本文内容整理自 中国开源年会 演讲_ 首先做一个自我介绍,我是 RocketMQ 的 PMC member 周新宇,目前负责阿里云 RocketMQ 以及 EventBridge 的产品研发。今天我的分享主要包括以下几部分: 消息与事件、微服务与事件驱动架构 阿里云 EventBridge:事件驱动架构实践 基于 RocketMQ 内核构建阿里云统一的事件枢纽 云原生时代的新趋势:Serverless+ 事件驱动 事件驱动架构的未来展望 消息与事件、微服务与事件驱动架构 首先,我们先讲一下消息跟事件的区别:大家都知道 RocketMQ 里面的消息,它是非常泛化的概念,是一个比事件更加抽象的概念。因为消息的内容体就是 Byte 数组,没有任何一个定义,是个弱 Data,所以它是非常通用的抽象。 与之相反的,事件可能是更加具象化的。一般情况下,它有一个 Schema 来精准描述事件有哪些字段,比如 CloudEvents 就对事件有一个明确的 Schema 定义。事件也往往代表了某个事情的发生、某个状态的变化,所以非常具象化。 从用途来讲,消息往往用于微服务的异步解耦的架构。但这一块的话,事件驱动跟消息是稍微类似的。消息的应用场景往往发生在一个组织内部,消息的生产方知道这个消息要将被如何处理。比如说在一个团队里,消息的生产者跟发送者可能是同一个团队同一块业务,对这个消息内容有一个非常强的约定。相比之下,事件更加松耦合,比如说事件发送方也不知道这个事件将被投递到什么地方,将被谁消费,谁对他感兴趣,对事件被如何处理是没有任何预期的。所以说,基于事件的架构是更加解耦的。消息的应用往往还是脱离不了同一个业务部门,即使一些大公司里最多涉及到跨部门合作。消息的使用通过文档进行约束,事件通过 Schema 进行约束,所以我们认为事件是比消息更加彻底解耦的方式。 接下来,微服务架构跟 EDA 架构有什么区别? 首先是微服务架构,微服务作为从单体应用演进而来的架构,比如说把一个单体应用拆成了很多微服务,微服务之间通过 RPC 进行组织和串联。过去一个业务可能是在本地编排了一堆 function,现在通过一堆 RPC 将之串起来。比如说用户去做一个前端的下单操作,可能后台就是好几个微服务进行订单操作,一个微服务去新建订单,一个微服务去对订单进行处理,处理完再调另一个微服务去把订单已完成的消息通知出去,这是一个典型的 RPC 架构。 但纯粹的 RPC 架构有很多问题,比如所有业务逻辑是耦合在一起的,只是把本地方法调用换成了远程调用。当业务增速达到一定阶段,会发现各个微服务之间的容量可能是不对等的,比如说短信通知可以通过异步化完成,却同步完成。这就导致前端有多大流量,短信通知也需要准备同样规模的流量。当准备资源不充足,上下游流量不对等时,就有可能导致某个微服被打挂,从而影响到上游,进而产生雪崩效应。 在这种情况下,大家一般就会引入消息队列进行异步解耦。这个架构已非常接近于事件驱动架构了,还是以用户前端创建一个订单举例,订单创建的事件就会就发到事件总线、event broker、 event bus 上,下游各个不同订阅方去对这个事件做监听处理。 不同之处在于消息订阅者基于消息中间件厂商提供 SDK 的去做消息处理,业务往往需要进行改造,也会被厂商提供的技术栈绑定;事件驱动架构中订阅者属于泛化订阅,即不要求订阅方基于什么样的技术栈去开发,可以是一个 HTTP 网关,也可以是一个function,甚至可以是历史遗留的存量系统。只要 event broker 兼容业务的协议,就可以把事件推送到不同订阅方。可以看到,泛化订阅的用途更加广泛,更加解耦,改造成本也最低。 阿里云 EventBridge:事件驱动架构实践 Gartner 曾预测, EDA 架构将来会成为微服务主流。在 2022 年它将会成为 60% 的新型数字化商业解决方案,也会有 50% 的商业组织参与其中。 同时, CNCF 基金会也提出了 CloudEvents 规范,旨在利用统一的规范格式来声明事件通信。EventBridge也是遵循这一标准。CloudEvents作为社区标准,解除了大家对于厂商锁定的担忧,提高了各个系统之间的互操作性,相当于说对各个系统约定了统一的语言,这个是非常关键的一步。 事件在开源社区有了统一的规范,但在云上,很多用户购买了云厂商很多云产品,这些云产品每天可能有数以亿计的事件在不停产生,这些事件躺在不同云服务的日志、内部实现里。用户也看不着,也不知道云产品实例在云上发生什么事情。各个厂商对事件的定义也不一样,整体是没有同一类标准。各个云服务之间的事件是孤立的,就是说没有打通,这不利于挖掘事件的价值。在使用开源产品时也有类似问题,用户往往也没有统一标准进行数据互通,想去把这些生态打通时需要付出二次开发成本。 最后,事件驱动在很多场景应用的现状是偏离线的,现在比较少的人把 EDA 架构用于在线场景。一方面是因为没有事件型中间件基础设施,很难做到一个事件被实时获取,被实时推送的同时,能被业务方把整个链路给追踪起来。所以,以上也是阿里云为什么要做这款产品的背景。 因此,我们对 EventBridge 做了定义,它有几个核心价值: 一、统一事件枢纽:统一事件界面,定义事件标准,打破云产品事件孤岛。 二、事件驱动引擎:海量事件源,毫秒级触发能力,加速 EDA/Serverless 架构升级。 三、开放与集成:提供丰富的跨产品、跨平台连接能力,促进云产品、应用程序、SaaS服务相互集成。 首先讲一下,EventBridge 基本模型,EventBridge 有四大部分。第一部分是事件源,这其中包括云服务的事件、自定义应用、SaaS应用、自建数据平台。 第二个部分就是事件总线,这是存储实体,事件过来,它要存在某个地方进行异步解耦。类似于说 RocketMQ 里面 topic 的概念,具备一定存储的同时,提供了异步能力。事件总线涵盖两种,一种默认事件总线,用于收集所有云产品的事件,另一种自定义事件总线就是用户自己去管理、去定义、去收发事件,用来实践 EDA 架构概念。第三部分就是规则,规则与 RocketMQ 的消费者、订阅比较类似,但我们赋予规则包括过滤跟转换在内的更多计算能力。第四部分就是事件目标即订阅方,对某事件感兴趣就创建规则关联这个事件,这其中包括函数计算、消息服务、HTTP 网关等等。 这里具体讲一下这个事件规则,虽然类似于订阅,但事件规则拥有事件轻量级处理能力。比如在使用消息时可能需要把这个消息拿到本地,再决定是否消费掉。但基于规则,可以在服务端就把这个消息处理掉。 事件规则支持非常复杂的事件模式过滤,包括对指定值的匹配,比如前缀匹配、后缀匹配、数值匹配、数组匹配,甚至把这些规则组合起来形成复杂的逻辑匹配能力。 另一个,就是转换器能力,事件目标泛化定义,其接受的事件格式可能有很多种,但下游服务不一定。比如说你要把事件推到钉钉,钉钉 API 已经写好了并只接受固定格式。那么,把事件推过去,就需要对事件进行转换。我们提供了包括: 完整事件:不做转换,直接投递原生 CloudEvents。 部分事件:通过 JsonPath 语法从 CloudEvents 中提取部分内容投递至事件目标。 常量:事件只起到触发器的作用,投递内容为常量。 模板转换器:通过定义模板,灵活地渲染自定义的内容投递至事件模板。 函数:通过指定处理函数,对事件进行自定义函数处理,将返回值投递至事件目标。 目前,EventBridge 集成了 80 多种云产品,约 800 多种事件类型,第一时间打通了消息生态,比如说 RocketMQ 作为一个微服务生态,我们去实践消息事件理念,就可以把 RocketMQ 的事件直接投递到 EventBridge,通过事件驱动架构去对这些消息进行处理,甚至 MQTT、KafKa 等消息生态,都进行打通集成。除了阿里云消息产品的打通,下一步也会把一些开源自建的消息系统进行打通。另一个生态就是 ISV 生态,为什么 ISV 需要 EventBridge?以钉钉 6.0 举例,其最近发布了连接器能力。钉钉里面要安装很多软件,这些软件可能是官方提供,也可能是 ISV、第三方开发者提供,这就造成数据的互通性差。因此,我们提供这个能力让 ISV 的数据流通起来。最后就是事件驱动生态,我们当前能够触达到大概 10 多种事件目标,目前也在持续丰富当中。 事件因相对消息更加解耦、离散,所以事件治理也更加困难。所以,我们制作了事件中心并提供三块能力: 事件追踪:对每一个事件能有完整的追踪,它从在哪里产生,什么时候被投递,什么时候被过滤掉了,什么时候被投递到某个目标,什么时候被处理成功了。使整个生命周期完全追踪起来。 事件洞察&分析:让用户从 EDA 编程视角变成用户视角,让用户更加迅速的了解 EventBridge 里面到底有哪些事件,并进行可视化分析。通过 EB 做到就近计算分析,直接把业务消息导入到事件总线中,对消息进行及时分析。 事件大盘:针对云产品,引导云产品对业务事件进行定义,让云产品更加开放,从而提供大盘能力。 基于 RocketMQ 内核构建阿里云统一的事件枢纽 EventBridge 一开始就构建在云原生的容器服务之上。在这之上首先是 RocketMQ 内核,内核在这个产品里扮演的角色有两种,一种就是事件存储,当成存储来用;另一方面是利用订阅能力,把订阅转化成泛化订阅。在 RocketMQ 内核之上就是 connect 集群。EventBridge 比较重要的能力是连接,所以 EventBridge 首先要具备 Source 的能力,把事件 Source 过来,然后再存下来;其核心是 Connect 集群,每个 Connect 集群有很多 Worker。每个 Worker 要负责很多事情,包括事件的摄入,事件过滤,事件转换,事件回放,事件追踪等,同时在 Connect 集群之上有 Connect 控制面,来完成集群的治理,Worker 的调度等。 在更上面一层是 API Server,一个事件的入口网关,EventBridge 的世界里,摄入事件有两种方式,一种是通过 Connect 的 Source Connector,把事件主动的 Source 过来,另一种用户或者云产品可以通过 API server,通过我们的 SDK 把事件给投递过来。投递的方式有很多种,包括有 OpenAPI,有多语言的官方 SDK,同时考虑 CloudEvents 有社区的标准,EventBridge 也完全兼容社区开源的 SDK,用户也可以通过 Webhook 将事件投递过来。 这个架构优点非常明显: (1)减少用户开发成本 用户无需额外开发进行事件处理 编写规则对事件过滤、转换 (2)原生 CloudEvents 支持 拥抱 CNCF 社区,无缝对接社区 SDK 标准协议统一阿里云事件规范 (3)事件 Schema 支持 支持事件 Schema 自动探测和校验 Source 和 Target 的 Schema 绑定 (4)全球事件任意互通 组建了跨地域、跨账户的事件网络 支持跨云、跨数据中心事件路由 云原生时代的新趋势:Serverless+ 事件驱动 我们认为 Serverless 加事件驱动是新的研发方式,各个厂商对 Serverless 理解各有侧重,但是落地方式大道趋同。 首先,Serverless 基础设施把底层 IaaS 屏蔽掉,上层 Serverless 运行时即计算托管,托管的不仅仅是微服务应用、K8s 容器,不仅仅是函数。 EventBridge 首先把这种驱动的事件源连接起来,能够触发这些运行时。因为 Serverless 最需要的就是驱动方,事件驱动带给他这样的能力,即计算入口。EventBridge 驱动 Serverless 运行时,再去连接与后端服务。目前,EventBridge 与 Serverless 结合的场景主要是松耦合场景,比如前端应用、SaaS 服务商小程序,以及音视频编解码等落地场景。 那么,Serverless 的 EDA 架构开发模式到底是怎样的呢?以函数计算为例,首先开发者从应用视角需要转换为函数视角,将各个业务逻辑在一个个函数中进行实现;一个函数代表了一个代码片段,代表了一个具体的业务,当这段代码上传后就变成了一个函数资源,然后 EventBridge 可以通过事件来驱动函数,将函数通过事件编排起来组成一个具体的应用。 这里面 function 还需要做很多事情,大家也知道 function 有很多弊端,它最受诟病的就是冷启动。因为 Serverless 需要 scale to zero 按量付费,在没有请求没有事件去触发时,应该是直接收到 0 的,从 0~1 就是一个冷启动。这个冷启动有些时候可能要秒级等待,因为它可能涉及到下载代码、下载镜像,涉及到 namespace 的构建,存储挂载,root 挂载,这里面很多事情,各个云厂商投入很大精力优化这一块。Serverless 价格优势很明显,它资源利用率特别高,因按量付费的,所以能做到接近百分百的资源利用率,也不需要去做容量规划。 举一个简单的例子,就是基于 Serverless 加 EDA 的极简编程范式,再举一个具体的例子,新零售场景下 EDA 架构对这个业务进行改造。首先来讲,业务中有几个关键资源,可能有 API 网关、函数计算,首先可以去打通一些数据,打通 rds 并把 rds 数据同步过来,兼容一些历史架构,同时去触发计算资源、function、网关。整个架构优势非常明显,所以具备极致弹性能力,不需要去预留资源。 事件驱动的未来展望 我们认为事件驱动的未来有两部分,一是要做好连接,做好云内、跨云的集成,让用户的多元架构更加高效。二是开源生态的集成,我们可以看到开源生态愈发蓬勃,所以也需要把这些开源生态中的数据集成好。此外,还有传统 IDC 计算能力、边缘计算能力这些生态都需要有连接性软件把它连接起来。 EventBridge 是云原生时代新的计算驱动力,这些数据可以去驱动云的计算能力,创造更多业务价值。 往期推荐
作者:周新宇
#行业实践 #事件驱动架构

2021年11月6日

消息队列RocketMQ应对双十一流量洪峰的“六大武器”
_审核&校对:岁月、明锻_ _编辑&排版:雯燕_ “ 4982 亿,58.3 万笔/秒 ”的背后 在新冠肺炎疫情催化下,数字化生活方式渐成新常态。“4982 亿,58.3 万笔/秒”是 2020 天猫双 11 全球狂欢节(简称:天猫双 11 )对数字经济的先发优势和巨大潜能的直观体现。 面对千万级并发、万亿级的流量洪峰,背后有力支撑的便是双十一交易核心链路的官方指定产品:消息队列 RocketMQ 。 双十一交易场景业务痛点 随着双十一的逐年升温,保障交易场景的稳定性已成为各企业在双十一业务中的关键,每年双十一活动的凌晨,是“万民狂欢”的日子,同时也是各企业交易系统备受考验的时候,保证核心交易系统的业务处理能力、有效应对每秒数十万笔的交易订单成为重中之重,若不能进行流量缓冲将直接引发这些系统的崩溃。避免系统崩溃的核心“秘诀”便是消息队列 RocketMQ。 消息队列 RocketMQ 是如何帮助各企业交易系统扛住瞬间千万级 TPS、万亿级流量洪峰的冲击,并保持各个应用之间的消息通畅的呢?下面为您介绍消息队列 RocketMQ 应对双十一流量洪峰的“六大武器”。 消息队列 RocketMQ 的“六大武器” 双十一的流量洪峰究竟会给用户和商家系统业务带来哪些问题?消息队列 RocketMQ 的“六大武器”是如何解决这些问题的呢?小编带您初探一二: 武器一:“异步解耦” 背景:双十一的夜晚,当用户在手机上“指点江山”时,可曾想,一个小小的购物 APP 背后其实是一个个庞大的系统,从用户选购商品的那一刻起,就要和成百个业务系统打交道,每一笔交易订单数据都会有几百个下游业务系统的关联,包括物流、购物车、积分、直充、流计算分析等等,整个系统庞大而且复杂,架构设计稍有不合理,将直接影响主站业务的连续性。 面对如此复杂且庞大的系统,避免系统业务之间相互耦合影响,便要用到消息队列 RocketMQ 的“异步解耦”功能,通过消息队列 RocketMQ 实现上、下游业务系统松耦合,松耦合可以降低系统的复杂度,缩短用户请求的响应时间(将原多个步骤的所需时间之和压缩到只需一条消息的时间),保证下游某个子系统的故障不影响整个链路。 武器二:“削峰填谷” 背景:在处理完交易业务背后庞大的系统所带来的耦合性问题后,从用户视角出发来看,双十一期间 0 点这个时间有成百上千万的用户在同时点击着购买页面,由于用户海量请求,导致流量激增,面对如此大量的访问流量,下游的通知系统可能无法承载海量的调用量,甚至会导致系统崩溃等问题而发生漏通知的情况。 为解决这些问题,就要用到消息队列 RocketMQ 的“削峰填谷”功能,可在应用和下游通知系统之间加入消息队列 RocketMQ,RocketMQ 支持高并发的消息低延迟写入,以及无限的堆积能力,可以避免超高流量的冲击,确保下游业务在安全水位内平滑稳定的运行。 武器三:“分布式事务消息” 背景:通过前面的介绍了解到,通过消息的异步解耦,可实现消息的分布式处理,在传统的分布式事务处理方式中,用户创建了一条新的订单信息,伴着这条订单信息的变更,在整个业务链条中的购物车、用户表、积分等都需要变更,系统需要借助分布式事务协调组件来保证多个业务调用的事务一致性。传统的分布式事务组件追求强一致性,性能吞吐低,系统复杂。那如何才能既实现分布式事务,同时又不使系统过于复杂? 这个时候消息队列 RocketMQ 的“分布式事务消息”的功能便起到了关键作用,通过原创的轻量级订单流转事务协调能力,只需发送一条消息,就可以实现消息最终一致性的分布式事务,同时确保订单状态持久化和下游调用一致。 武器四:“消息过滤” 背景:通过以上介绍会发现从客户下单到客户收到商品这一过程会生产一系列消息,按消息种类可以分为交易消息、物流消息、购物车消息等,如何保证各个种类的消息进行有效投递并被准确消费? 这时候就要用到消息队列 RocketMQ 的“消息过滤”功能,可以通过 Tag 给不同种类的消息定义不同的属性,根据消息属性设置过滤条件对消息进行过滤,只有符合过滤条件的消息才会被投递到消费端进行消费。比如给物流消息定义地域属性,按照地域分为杭州和上海: 订单消息 物流消息 物流消息且地域为杭州 物流消息且地域为上海 武器五:“定时消息” 背景:除了以上系统级别中可能出现的问题外,用户自己在购物过程中可能都遇到过一些小细节,比如在点击了购买按钮后,会出现“请您在 30 分钟内完成支付”的提示,如果超过 30 分钟未支付,订单就会自动关闭。 这个业务用到的是消息队列 RocketMQ 的“定时消息”功能,消息队列 RocketMQ 可以实现自定义秒级精度间隔的定时消息,通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息,最终实现海量订单状态变更超时的中心调度。 武器六:“顺序收发” 背景:在双 11 大促中,买家业务侧和交易系统本身会面临诸多问题,卖家侧也会遇到一些难点,比如,买家买了东西,卖家自己却看不到。 为了解决这个问题,一般需要使用消息队列的顺序消息同步能力将买家表的变更订阅同步到卖家表。此时依赖 RocketMQ 的无热点、高性能、高可靠顺序消息可以保障数据库变更的顺序同步,保证买卖家订单同步。 总结 通过以上介绍,带您了解了消息队列 RocketMQ 的六大武器在双十一“战场”上的威力,2021 年“双十一”开战在即,消息队列 RocketMQ 为您双十一的业务保架护航,同时铂金版可提供 99.99% 的服务可用性和 99.99999999% 的数据可靠性,联系我们,期待陪您的业务一起在 2021 双十一中“乘风破浪”。
作者:不周
#行业实践

2021年11月2日

基于消息队列 RocketMQ 的大型分布式应用上云最佳实践
_审核&校对:岁月、佳佳_ _编辑&排版:雯燕_ 前言 消息队列是分布式互联网架构的重要基础设施,在以下场景都有着重要的应用: 应用解耦 削峰填谷 异步通知 分布式事务 大数据处理 并涉及互动直播、移动互联网&物联网,IM 实时通信、Cache 同步、日志监控等多个领域。 而本文主要围绕着商业版本的消息队列 RocketMQ,和开源版本 RocketMQ 进行比较,并结合一些实践中的场景来展示大型分布式应用的上云最佳实践。 核心能力 商业版本消息队列 RocketMQ 相比较开源版本 RocketMQ 和其他竞品,主要有以下几点优势。 1. 开箱即用、功能丰富 2. 高性能、无限扩展能力 3. 可观测、免运维能力 4. 高 SLA 和稳定性保证 开箱即用、功能丰富 消息队列 RocketMQ 提供了定时、事务、顺序等多类型消息的支持,且支持广播、集群两种消费模式;另外在协议层面,提供 TCP/HTTP 多协议支持,还提供了 TAG/SQL 属性过滤功能,极大程度地拓宽了用户的使用场景。 高性能、无限拓展能力 消息队列 RocketMQ 经受了阿里核心电商历年双十一洪峰的考验,支持千万级 TPS 消息收发和亿级消息堆积的能力,并且能够为消息提供毫秒级端到端延迟保障,另外还提供分级存储,支持海量消息的任意保存时间。 可观测、免运维能力 消息队列 RocketMQ 提供了一个可观测性大盘,支持细粒度数据大盘,提供了消息全链路生命周期追踪和查询能力,对各个指标提供了相应的监控报警功能;此外,还提供了消息回溯和死信队列功能,能够保证用户的消息能够随时回溯消费。 高 SLA 和稳定性保障 消息队列 RocketMQ 的稳定性是我们一贯、持续、稳定投入的重要领域,提供了高可用部署和多副本写入功能;另外也支持同城多 AZ 容灾和异地多活。 产品剖面 接下来,我们会从以上的产品核心能力中挑选几个剖面,并且结合具体的场景和实践来做进一步的介绍。 多消息类型支持 高可用顺序消息 商业版本消息队列 RocketMQ 使用的顺序消息我们称之为高可用顺序消息。在介绍高可用顺序消息之前,首先简要介绍下开源版本 RocketMQ 的顺序消息。 顺序消息分为两种类型,全局顺序消息和分区顺序消息。 全局顺序消息:在 RocketMQ 存储层只会分配一个分区,也就是说全局顺序 Topic 的可用性跟单一副本的可用性强相关,且不具备可扩展的能力。 分区顺序消息:所有消息根据 Sharding Key 进行分区。同一个分区内的消息按照严格的 FIFO 顺序进行发布和消费。Sharding Key 是顺序消息中用来区分不同分区的关键字段。 下图是分区顺序消息的应用场景,order ID 即为此时顺序消息的 Sharding Key。 可以看到,无论是全局顺序消息还是分区顺序消息,都依赖了单一分区天然的 FIFO 特性来保证顺序,因此顺序性也只能在同一个分区内保证,当此分区所在的副本不可用时,顺序消息并不具备重试到其他副本的能力,此时消息的顺序性就难以得到保证。 为了解决这一问题,我们设计并实现了高可用顺序消息。 高可用顺序消息有以下几个特点: 一个逻辑顺序分区(PartitionGroup)下有多个物理分区。 其中任意一个物理分区是可写的,那么整个逻辑分区是可写且有序的。 我们基于 happenedbefore 的原则设计了一套基于分区位点的排序算法。 根据该算法,消费者在消费某一逻辑分区时,会从其所属的各个物理分区中拉取消息并进行合并排序,得出正确的消息顺序流。 通过这样的设计,高可用顺序消息解决了下列几点问题: 可用性问题:高可用顺序消息将具备与普通消息一致的可用性,在某副本不可用时,可快速重试至其它副本。 可扩展性问题:普通顺序消息,特别是普通全局顺序消息,不具备良好的扩展能力,只能固定在特定的副本中。高可用顺序消息的逻辑顺序分区可以将物理顺序分区分散在多个副本中。 热点问题:普通顺序消息根据 Key 将一类消息 Hash 至同一个分区中,热点 Key 会导致热点分区,高可用顺序消息具备横向扩展能力,可以为逻辑顺序分区添加多个物理分区来消除热点问题。 单点问题:普通全局顺序消息,仅包含单分区,极易出现单点故障,高可用顺序消息可以消除全局顺序消息的单点问题。 尤其需要注意的是热点问题,在阿里巴巴内部某电商业务大促时,因发送到顺序 Topic 的某一特定的 ShardingKey 数量过多,集群中一个副本接收到了大量该 ShardingKey 的消息,导致该副本超出其负荷上限,造成了消息的延迟和堆积,一定程度上影响了业务。在使用了高可用顺序消息之后,由于其在多物理分区中的负载均衡特性,提升了集群顺序消息的承载能力,从而避免了热点问题的出现。 秒级精准定时消息 定时消息,是指客户端当前发送但希望在未来的某个时间内收到的消息。定时消息广泛应用于各类调度系统或者业务系统之中。比如支付订单,产生一个支付消息,系统通常需要在一定时间后处理该消息,判断用户是否支付成功,然后系统做相应处理。 开源版本的 RocketMQ 只支持几个指定的延迟级别,并不支持秒级精度的定时消息。而面向集团内和云上多样化的需求,开源版本的定时消息并不能满足我们的需求,因此我们推出了秒级精准定时消息。 如下图所示,我们基于时间轮设计并实现了支持任意定时时间的秒级精准定时消息,同时满足以下特性: 任意定时时间 超长定时时间 海量定时消息 删除定时消息 高可用 高性能 内部某用户有这样的场景,期望在未来的某一分钟的 30s 时刻处理这样一个定时请求,开源版本的定时消息并不符合其需要,而秒级精准定时消息在保证高可用、高性能的同时,满足了其业务需求。 分布式事务消息 如下图所示,在传统的事务处理中,多个系统之间的交互耦合到一个事务中,造成整体的相应时间长,回滚过程复杂,从而潜在影响了系统的可用性;而 RocketMQ 提供的分布式事务功能,在保证了系统松耦合和数据最终一致性的前提下,实现了分布式事务。 消息队列 RocketMQ 提供的事务消息处理步骤如下: 发送方将半事务消息发送至消息队列 RocketMQ 版服务端。 消息队列 RocketMQ 版服务端将消息持久化成功之后,向发送方返回 Ack 确认消息已经发送成功,此时消息为半事务消息。 发送方开始执行本地事务逻辑。 发送方根据本地事务执行结果向服务端提交二次确认(Commit 或是 Rollback),服务端收到 Commit 状态则将半事务消息标记为可投递,订阅方最终将收到该消息;服务端收到 Rollback 状态则删除半事务消息,订阅方将不会接受该消息。 基于这样的实现,我们通过消息实现了分布式事务特性,即本地事务的执行结果会最终反应到订阅方是否能接收到该条消息。 消息队列 RocketMQ 的分布式事务消息广泛地应用于阿里巴巴核心交易链路中,通过分布式事务消息,实现了最小事务单元;交易系统和消息队列之间,组成一个事务处理;下游系统(购物车、积分、其它)相互隔离,并行处理。 分级存储 背景 随着云上客户的不断增多,存储逐渐成为 RocketMQ 运维的重要瓶颈,这包括并且不限于: 1. 内存大小有限,服务端不能将所有用户的数据全部缓存在内存中;在多租户场景下,当有用户拉取冷数据时,会对磁盘造成较大 IO 压力,从而影响共享集群的其他用户,亟需做到数据的冷热分离。 2. 云上有单租户定制化消息存储时长的需求。而 RocketMQ Broker 中所有用户的消息是放在一个连续文件中进行存储的,无法针对任何单一用户定制存储时长,即现有的存储结构无法满足这样的需求。 3. 如果能对海量数据提供更低成本的存储方式,可以大幅降低云上 RocketMQ 的磁盘存储成本。 基于以上现状,分级存储方案应运而生。 架构 分级存储的整体架构如下: 1. connector 节点负责将 broker 上的消息实时同步到 OSS 上 2. historyNode 节点将用户对冷数据的拉取请求转发至 OSS 上 3. 在 OSS 中是按照 Queue 粒度来组织文件结构的,即每个 Queue 会由独立的文件进行存储,从而保证了我们可以针对于租户定义消息的存储时长。 通过这样的设计,我们实现了消息数据的冷热分离。 使用场景 基于分级存储,我们进一步拓展了用户的使用场景: 1. 自定义存储时间:在消息数据的冷热分离之后,我们将冷数据存储到 OSS 这样的存储系统中,能够实现用户自定义的存储时间。 2. 消息审计:在消息的存储之间从数天扩展到自定义后,消息的属性从一个临时性的中转数据变成了用户的数据资产,而消息系统也从数据中枢转变成了数据仓库;用户能够基于数据仓库实现更多样的审计、分析、处理功能。 3. 消息回放:在流计算场景中,消息回放是非常重要的一个场景;通过拓展消息的存储时间之后,流计算能够实现更加丰富的计算分析场景。 稳定性 消息队列 RocketMQ 的稳定性是我们一贯、持续、稳定投入的重要领域。在介绍我们在稳定性的最新工作之前,首先带大家回顾下 RocketMQ 高可用架构的演进路线。 高可用架构演进路线 2012 年,RocketMQ 作为阿里巴巴全新一代的消息引擎问世,并随后开源至社区,第一代 RocketMQ 高可用架构也随之诞生。如下图所示,第一代高可用架构采取当时流行的 MasterSlave 主从架构,写流量经过 Master 节点同步至 Slave 节点,读流量也经过 Master 节点并将消费记录同步至 Slave 节点。当 Master 节点不可用时,整个副本组可读不可写。 2016 年,RocketMQ 云产品正式开始商业化,云时代单点故障频发,云产品需要完全面向失败而设计,因此 RocketMQ 推出了第二代多副本架构,依托于 Zookeeper 的分布式锁和通知机制,引入 Controller 组件负责 Broker 状态的监控以及主备状态机转换,在主不可用时,备自动切换为主。第二代架构是消息云产品规模化进程中的核心高可用架构,为云产品规模化立下了汗马功劳。 2018 年,RocketMQ 社区对 Paxos 和 Raft 引入分布式协议有极大的热情,RocketMQ 研发团队在开源社区推出了基于 Raft 协议的 Dledger 存储引擎,原生支持 Raft 多副本。 RocketMQ 高可用架构已经走过了三代,在集团、公有云和专有云多样场景的实践中,我们发现这三套高可用架构都存在一些弊端: 第一代主备架构只起到了冷备的作用,且主备切换需要人工介入,在大规模场景下有较大的资源浪费以及运维成本。 第二代架构引入了 Zookeeper 和 Controller 节点,架构上更加复杂,在主备切换做到了自动化,但故障转移时间较长,一般是 10 秒左右完成选主。 第三代 Raft 架构目前暂未在云上和阿里集团内大规模应用,且 Raft 协议就决定了需要选主,新主还需要被客户端路由发现,整个故障转移时间依然较长;另外,强一致的 Raft 版本并未支持灵活的降级策略,无法在可用性和可靠性之间做灵活的权衡。 为了应对云上日益增长的业务规模、更严苛的 SLA 要求、复杂多变的专有云部署环境,当前的消息系统需要一种架构简单、运维简单、有基于当前架构落地路径的方案,我们将其称作秒级 RTO 多副本架构。 新一代秒级 RTO 多副本架构 秒级 RTO 多副本架构是消息中间件团队设计实现的新一代高可用架构,包含副本组成机制、Failover 机制、对现有组件的侵入性修改等。 整个副本组有以下特点: Strong Leader/No Election:Leader 在部署时确定,整个生命周期内不会发生切换,但可在故障时被替换。 仅 Leader 支持消息写入:每一个副本组仅 Leader 接受消息写入,Leader 不可用时,整个副本组不可写入。 所有的副本支持消息读取:虽然 Leader 上拥有全量的消息,Follower 上的消息量不对等,但所有的副本都支持消息的读取。 灵活的副本组数量:可以基于可靠性、可用性和成本自由选择副本组的数量。 灵活的 Quorum 数量:最终所有的消息都会同步到整个副本组上,但副本组内可以灵活配置写成功最小副本数。例如 23 模式,3 副本情况下,2 副本成功即为写成功。同时,在副本不可用的情况下,Quorum 数量也可以动态自行降级。 在上述副本组的概念下,故障转移可以复用当前 RocketMQ 客户端的机制来完成。如下图所示: Producer 在主不可用时,灵活快速地切换至另一个副本组。 Consumer 在某个副本不可用时可快速切换至同副本组另一个副本上进行消息消费。 可观测性 健康大盘 我们在可观测性方面也做了大量的工作,为用户提供了一个消息系统的可观测性健康数据大盘。如下图所示,用户能够清晰的看到实例级别、topic 级别、group 级别的各种监控数据,能够全方面地监控、诊断问题。 消息链路追踪 另外我们还基于消息轨迹提供了消息全链路轨迹追踪功能。如下图所示,用户能够在控制台上看到完整的消息生命周期、从消息的发送、存储、到消费,整个链路都能被完整地记录下来。 应用场景 客户痛点:业务出现消费堆积的用户需要根据消息轨迹抽样数据,综合分析后才能大致判断引起问题原因,排查困难。 核心价值:提高线上运行问题排查的效率,和问题定位的准确性。直接在健康大盘上快速发现风险最高的 Topic 和 Group,并根据各个指标的变化情况快速定位原因。例如消息处理时间过长可以扩容消费者机器或优化消费业务逻辑,如果是失败率过高可以快速查看日志排除错误原因。 事件驱动 大家一定非常熟悉 Gartner,在2018年的一个评估报告里,Gartner 将 EventDriven Model,列为了未来10大战略技术趋势之一,并且,做出了两个预测: 2022年,超过 60% 的新型数字化商业解决方案,都会采用事件通知的软件模型。 2022年,超过 50% 的商业组织,将会参与到EDA生态系统当中去。 同一年,CNCF 基金会也提出了 CloudEvents,意在规范不同云服务之间的事件通讯协议标准。到目前为止,CloudEvents也已经发布了多个消息中间件的绑定规范。 可见事件驱动是未来业务系统的一个重要趋势,而消息天然具备和事件的亲近性,因此消息队列 RocketMQ,是坚决拥抱事件驱动的。 谈到消息和事件,这里做一个简单的阐述:消息和事件是两种不同形态的抽象,也意味着满足不同的场景: 消息:消息是比事件更通用的抽象,常用于微服务调用之间的异步解耦,微服务调用之间往往需要等到服务能力不对等时才会去通过消息对服务调用进行异步化改造;消息的内容往往绑定了较强的业务属性,消息的发送方对消息处理逻辑是有明确的预期的。 事件:事件相对于消息更加具像化,代表了事情的发送、条件和状态的变化;事件源来自不同的组织和环境,所以事件总线天然需要跨组织;事件源对事件将被如何响应没有任何预期的,所以采用事件的应用架构是更彻底的解耦,采用事件的应用架构将更加具备可扩展性和灵活性。 在2020年,阿里云发布了事件总线 EventBridge 这一产品,其使命是作为云事件的枢纽,以标准化的 CloudEvents 1.0 协议连接云产品和云应用,提供中心化的事件治理和驱动能力,帮助用户轻松构建松耦合、分布式的事件驱动架构;另外,在阿里云之外的云市场上有海量垂直领域的 SaaS 服务,EventBridge 将以出色的跨产品、跨组织以及跨云的集成与被集成能力,助力客户打造一个完整的、事件驱动的、高效可控的上云新界面。 而借助事件总线 EventBridge 提供的事件源功能,我们能够打通消息到事件的链路,使得消息队列 RocketMQ 具备事件驱动的动力,从而拥抱整个事件生态。接下来我们将借助一个案例,如下图所示,为大家展示这一功能。 创建消息队列 RocketMQ 主题 创建目标服务 我们基于容器服务快速创建一个事件驱动的服务,计算负载 Deployment 的 yaml 如下,该服务能够响应事件并将结果打印到标准输出中。 apiVersion: apps/v1 for versions before 1.8.0 use apps/v1beta1 kind: Deployment metadata: name: eventbridgehttptargetdeployment labels: app: eventbridgehttptarget spec: replicas: 2 selector: matchLabels: app: eventbridgehttptarget template: metadata: labels: app: eventbridgehttptarget spec: containers: name: ebhttptarget 下述镜像暴露了一个 HTTP 地址(/cloudevents)用于接收 CloudEvents,源码参考:https://github.com/aliyuneventbridge/simplehttptarget image: registry.cnhangzhou.aliyuncs.com/eventbridgepublic/simplehttptarget:latest ports: containerPort: 8080 前往容器服务控制台,进入服务与路由的服务页面,创建一个私网访问类型的 Service,并做好端口映射。 创建事件总线 EventBridge 自定义总线 我们来到事件总线 EventBridge 控制台,创建一个自定义总线 demowithk8s。 创建事件总线 EventBridge 自定义总线规则 我们为总线 demowithk8s 创建一个规则,并选择 HTTP 作为事件目标,选择专有网络类型,选中对应的 VPC、 VSwitch 以及安全组,并指定目标URL,如下图所示: 创建事件总线 EventBridge 事件源 我们为该自定义事件总线添加消息队列 RocketMQ 版的自定义事件源。 发送 RocketMQ 消息 接下来我们回到消息队列 RocketMQ 控制台,通过控制台的快速体验消息生产功能发送一条内容为 hello eventbridge 的消息到对应的主题中去。 接下来我们就可以发现,这条 RocketMQ 消息,以 CloudEvent 的形式被投递到了对应的服务中去,我们从而打通了消息到事件的链路。同时,基于我们上述提到的分级存储功能,消息队列 RocketMQ 转变成了一个能够源源不断提供事件的数据仓库,为整个事件生态提供了更加广阔的场景。 事件驱动是未来商业组织和业务系统的重要趋势,而消息队列 RocketMQ 会坚定地拥抱这一趋势,将消息融入到事件的生态中。 总结 我们选取了消息队列 RocketMQ 的几个产品剖面,从多消息类型、分级存储到稳定性、可观测性,再到面向未来的事件驱动,并结合与开源 RocketMQ 的对比,及具体应用场景的分析,为大家展示了基于消息队列 RocketMQ 的大型分布式应用上云最佳实践。
作者:绍舒
#行业实践

2021年10月28日

阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台
从“消息”到“消息、事件、流”的大融合 消息队列作为当代应用的通信基础设施,微服务架构应用的核心依赖,通过异步解耦能力让用户更高效地构建分布式、高性能、弹性健壮的应用程序。 从数据价值和业务价值角度来看,消息队列的价值不断深化。消息队列中流动的业务核心数据涉及集成传输、分析计算和处理等不同环节与场景。伴随着不断演进,我们可以预见消息队列势必在数据通道、事件集成驱动、分析计算等场景不断产生新价值,创造新的“化学反应”。 RocketMQ 诞生于阿里巴巴内部电商系统,发展至今日,其核心架构经历了多次关键演进: 早在 2007 年,淘宝电商系统做服务化拆分的时候,就诞生了第一代消息服务 Notify,这是 RocketMQ 最早雏形。Notify 采用了关系型数据库作为存储,使用推模式。在阿里淘宝这种高频交易场景中,具有非常广泛地应用。 在 20072013 年期间,随着阿里集团业务发展,不仅需要交易场景异步调用,同时需要支持大量传输埋点数据、数据同步。此时,内部衍生出 MetaQ 以及 RocketMQ3.0 版本,这两个版本开始探索自研存储引擎,采用了自研专有消息存储,支持了单机海量 Topic,并前瞻性地去除了 Zookeeper 等组件的外部依赖。在十年后的今天,我们看到去各种 keeper 已成为整个消息领域的发展主流。 经历了前三代的内部业务打磨后,阿里巴巴积极参与开源并将 RocketMQ3.0 贡献到开源社区,并于 2017 年从 Apache 孵化器毕业,成为中国首个非 Hadoop 生态体系的 Apache 社区顶级项目。此后,RocketMQ 也开始服务于阿里云企业客户。秉承开源、商业、内部三位一体发展策略,18 年发布的 4.x 版,在高可靠低延迟方面重点优化,构建了全新的低延迟存储引擎和多场景容灾解决方案、并提供了丰富的消息特性。这也使得 RocketMQ 成为金融级的业务消息首选方案。 上个月社区发布了 RocketMQ5.0preview 版,正式宣告 5.0 的到来。RocketMQ5.0 将不再局限于消息解耦的基本场景,更是通过统一内核、存储的优势,提供消息、事件、流一体化的处理能力。 回顾 RocketMQ 发展的十余年,良好的社区环境和商业支持使得大量企业开发者可以很方便的跟进业务特点和诉求进行选型和验证。在社区活跃影响力方面,RocketMQ 社区项目收获 15000+Star,活跃的贡献者有 400+ 位,多语言、生态连接等周边活跃项目 30+ 个,深受社区开发者欢迎。在应用规模方面,RocketMQ 作为金融级业务消息方案,积累了互联网游戏、在线教育、金融证券、银行、政企能源、汽车出行等众多行业数以万计的企业客户。同时,在阿里巴巴内部担负业务核心链路,每天流转万亿级消息流量,扛过了历届双十一的零点峰值。在行业评测方面,RocketMQ 也多次斩获大奖。 官宣:阿里云新一代 RocketMQ “消息、事件、流”融合处理平台 今天发布阿里云消息队列 RocketMQ 版 5.0,我们称之为一站式“消息、事件、流”融合处理平台。 新版本核心诞生两大新亮点,首先是消息核心场景的扩展和布局,RocketMQ 5.0 不再局限于消息解耦场景,将全新布局事件驱动和消息流式处理场景;其次则是一站式融合处理的技术架构和趋势。 “消息、事件、流”一站式融合处理的技术架构可以实现一份消息存储,支持消息的流式计算、异步投递、集成驱动多种场景,极大地降低业务人员运维多套系统的技术复杂度和运维成本。可以说,无论是微服务的指令调用、异步通知,还是 CDC 变更日志、行为埋点数据,亦或是资源运维、审计事件,统一的 RocketMQ5.0 产品栈都能统一处理。 重大发布一: RocketMQ 基础架构全新升级 首先,最重要的升级是阿里云 RocketMQ 的技术架构全面焕新。 全新的 RocketMQ5.0 版将通用的存储逻辑下沉,集中解决消息存储的多副本、低延迟、海量队列分区等技术问题,将上层的消息处理和剥离出完全的无状态计算层,主要完成协议适配、权限管理、消费状态、可观测运维体系支持。得益于存算分离的架构设计,从 SDK 接入到线上运维全链路带来全面提升: 1. 轻量版 SDK 的开放和全链路可观测系统的提升:同时支持 4.x 通信协议和全新的 gRPC 通信协议,并内置 OpenTelemetry 埋点支持,新版本 SDK 新增了 10 余个指标埋点。 2. 消息级负载均衡:新版本 SDK 不再参与实际存储队列的负载均衡,消息负载均衡将更加轻量,以单条消息为调度最小单元。 3. 多网络访问支持:新版本支持单一实例同时暴露公网、内网等访问形式,方便客户多网络接入访问。 4. 海量分级存储:新版本开放分级存储历史消息保存能力,消息低成本无大小限制,最长保存 30 天。冷热数据进行分离设计,极大降低消费历史消息对实例的性能影响。 重大发布二: RocketMQ Streaming 云上最佳实践——消息ETL 消息基础架构的能力提升之外,阿里云 RocketMQ 在 Streaming 流式处理场景推出了轻量级消息 ETL 功能。 用户在数据库变更、终端数据上报、后台埋点日志等场景产生的消息,典型的消费场景就是数据清洗转化,同时再存储到外部的存储和离线分析、在线分析系统中。传统实现方案需要搭建 Flink 等重量级实时计算服务或者自建消费应用做消息处理。而使用商业版 RocketMQ ETL 功能,简单控制台配置即可实现消息的清洗和转化。RocketMQ ETL 功能有三大优势: 1. 轻量无依赖:作为阿里云消息原生功能,使用时不需要部署外部计算服务或消费程序,方案更轻量。 2. 开发门槛低:内置常见清洗转化模板,满足绝大多数消息内容处理需求,并支持用户快速编写自定义函数来支持特殊的业务逻辑。整体开发成本非常低,1 小时即可完成业务上线。 3. Serverless 弹性:无需预先估算容量,采取 Serverless 无服务器模式,实现按需弹性伸缩。 重大发布三: EDA 云上最佳实践——事件中心 EventBridge 本次 RocketMQ 最后一个发布点是在事件驱动的业务场景的布局和演进。早在 2018 年,Gartner 评估报告将 EDA(EventDrivenArchitecture) 列为十大战略技术趋势之一,事件驱动架构将成为未来微服务主流。我们首先下一个定义: 事件驱动其本质是对消息驱动的再升级,是企业IT架构深度演进的下一个必然阶段。 事件驱动架构和消息驱动架构的区别和关联主要集中于以下三点: 1. EDA 更加强调深层次解耦:消息驱动是同一业务、组织系统内不同组件之间在技术架构层面的调用解耦,其信息封装和处理都是有预期、预定义的。事件驱动适配是更宽泛的业务、组织系统,基于事件的解耦上下游之间无需有预期和行为定义,上下游统一遵循标准化的规范,这是更深度的解耦。 2. EDA 更加强调连接能力:消息驱动更多是单一系统内的调用,而事件驱动往往会涉及到不同的地域、账户主体以及三方 SaaS 的协同,事件驱动的一大特征就是生态的强连接能力。 3. EDA 更加强调 Serverless 低代码开发:类比于消息和微服务的协同关系,未来业务架构 Serverless 化的大趋势会推动业务开发模式逐步转向低代码配置化。事件驱动的另一大特征就是低代码开发,基于丰富的工具能力,业务侧不需要像消息驱动一样编写大量的生产消费代码。 因此,阿里云统一事件中心 EventBridge 产品带来如下能力: 1. 统一标准化的事件集成生态:作为阿里云事件中心,集成 80 余款云产品的业务事件,支持 800 多种事件类型,用户使用 EventBridge 可以一次性管理所有云产品资源的变更、操作使用事件,避免对接多个产品接口的重复性劳动。 2. 全球事件互通网络:贯彻事件驱动强连接的属性能力,本次发布了全球事件互通网络,首批支持国内五大地域事件互通。企业客户简单配置即可实现跨账号、跨地域、跨网络的事件聚合和流转。 3. Serverless 低代码开发:内置十余种事件目标和处理模板,涵盖了大多数业务场景,客户简单配置、低代码,无需部署服务即可完成事件的驱动和处理。 面向未来: 坚定推动“消息、事件、流”大融合的发展 RocketMQ5.0 的发布标志着阿里云消息从消息领域正式迈向了“消息、事件、流”场景大融合的新局面。未来阿里云消息产品的演进也将继续围绕消息、事件、流核心场景而开展。消息基础架构本身也必将步伐不断,继续朝着 Serverless 弹性、强容灾能力、可观测免运维方向推进,给客户带来高性能、高可靠、强容灾的高 SLA 服务;并在 Streaming 的场景会基于客户业务诉求,联合生态产品持续推出更多的消息处理计算服务;打造面向未来的企业集成模式,联合生态伙伴和开源社区大力推动事件驱动进一步发展。
#技术探索

2021年10月17日

基于 RocketMQ 的基金数字化陪伴体系的架构实践
行业背景 基金公司的核心业务主要分为两部分,一部分是投研线业务,即投资管理和行业研究业务,它体现了基金公司核心竞争力。另一部分是市场线业务,即基金公司利用自身渠道和市场能力完成基金销售并做好客户服务。 博时基金管作为中国内地首批成立的五家基金管理公司之一,截至 2021 年 6 月 30 日,博时基金公司共管理 276 只公募基金,管理资产总规模逾 15482 亿元人民币,累计分红逾 1465 亿元人民币。 随着互联网技术发展,基金销售渠道更加多元化,线上成为基金销售重要渠道。相比传统基金客户,线上渠道具有客户基数大,水平参差不齐的特点。对于那些还不成熟的客户,我们需要做好陪伴,让他们理解风险,理解投资。 RocketMQ 在陪伴体系中的应用 1、陪伴场景概述 博时基金建立了一套全方位多层次陪伴体系,从用户层面、市场层面和产品层面为用户提供投前、投中、投后的有温度的投资陪伴体验。 每个陪伴场景的达成,需要公司多个部门不同团队协同配合来完成。依赖与投研、合规、运营、大数据等上下游多个系统。但这些系统可能采用不同技术架构,实现方式各异,如果采用同步调用方式来实现协同,耦合度太高,不利于未来扩展。 2、RocketMQ 解耦异构系统 RocketMQ 提供高效可靠的消息传递特性和发布订阅机制,非常适合用于这种上下游异构系统间的解耦。我们把原来基于文件、邮件的协作方式全部线上化、流程化和机制化,大大提升了陪伴输出效率。对于这种涉及多方系统的协作,需要对消息进行合理地归类,以便进行过滤和索引。RocketMQ 提供的 Topic 和 Tags 就是用来做这件事的。 3、Topic 和 Tags 最佳实践 Topic 与 Tag 作为业务上用来归类的标识,分别属于一级分类和二级分类,这种层次化的分类标识与企业组织架构比较类似,可以结合起来实现消息过滤。举个例子,对于陪伴系统的 Topic,运营系统订阅运营类消息,我们给这类消息打上 TagA 的标签,客服系统订阅客服类消息 TagB,陪伴编排系统订阅编排类消息 TagC,合规系统需要对运营和陪伴消息进行合规审查,因此它需要订阅 TagA 和 TagC,最后是数据中心,所有的消息都要处理,因此它需要监听所有 Tag。 RocketMQ 事务消息的金融应用场景 1、金融场景概述 接下来,我们讲解一下典型的金融场景优惠购。在博时基金 APP 上申购基金可以享受低至 0 折的费率优惠,具体业务怎么样实现?这里有有两种方式,第一种先充值博时钱包,底层是替客户购买了一笔货币基金,然后再用博时钱包购买目标基金。这种方式需要用户操作两次,比较繁琐,容易引起客单流失。另外一种方式就是优惠购,把两步购买基金封装成一次事务操作。对投资者来说,开启优惠购服务后,操作少一步,投资更简单! 2、领域事件理论模型 领域事件是指业务流程的一个步骤将导致进一步的业务操作,比方说登录事件,比方说基金购买事件等。在领域模型里面,领域事件事务采用的是最终一致性,区别于强一致性,它是弱一致性的一种。在领域模型映射到微服务系统架构时,微服务之间的数据不必要求强一致,因此领域事件可以解耦微服务。依据是否跨微服务,可以分为两种场景:  第一种场景:当领域事件发生在同一个微服务。由于大部分事件发生在同一个进程内,自身可以很好地控制事务。但如果一个事件需要同时更新多个聚合,按照 DDD 中一次事务只更新一个聚合的原则,就需要引入事件总线,就是 eventbus 这种模式。  第二种场景:跨微服务。领域事件发生在微服务之间的场景比较多,事件处理的机制也更加复杂。跨微服务的事件可以推动业务流程或者数据在不同的子域或微服务间直接流转,因此需要一个协调者来推进全局事务。跨微服务的事件机制要总体考虑事件构建、发布和订阅、事件数据持久化、消息中间件、分布式事务机制等,其中具备事务消息功能的消息中间件是这个解决方案的核心组件。 3、分布式事务方案对比 在博时基金的业务场景下,需要解决的问题是事务一致性与服务解耦度之间的矛盾,因此我们的目标是让主从事务解耦,保证核心逻辑稳定,同时不因为解耦而牺牲最终一致性。因此,当时做出了几种不同的解决方案:  第一种方案:最常见普通消息+异步对账,这个方案的问题是无法保证主事务的执行和入队同时成功,需要时效性低的对账补偿解决,一致性只是较高。 第二种方案:本地消息表,对比上一种做法,它由业务将写入消息表放到主事务中,把主事务和入队变成一个原子操作,然后业务读取入队记录,自己投递给从事务。它的缺点是主事务和消息表在存储上是耦合的,没有解耦度。 第三种方案:引入 XA 事务,是个两阶段提交的协议,实现难度较大。而且面临两个问题:一是这是一种同步阻塞协议,有锁占用导致并发不会太高,另外就是 XA 事务过程中,在参与者投赞成票后,如果协调者发生故障,节点不清楚应该提交还是中止,只能等待协调者恢复。这时候可能会出现业务中断。 第四种方案:TCC,专门处理分布式事务的 TCC,只侧重于一致性,无解耦度,也是不可行。 第五种方案:事务消息,它能同时兼顾解耦度和一致性,是最合适的模式。 最终我们选择了 RocketMQ 的事务消息作为分布式事务的解决方案。 4、RocketMQ 事务消息核心流程 基于 RocketMQ 的事务消息搭建事务中心,协调分布式事务的推进和回滚。以优惠购为例,核心流程如下: 第一阶段:Prepare 阶段 ,即业务系统将 RocketMQ 的半事务消息发送到事务中心,事务中心不做发布,等待二次确认。这个阶段 RocketMQ 的半消息在消费者端是感知不到的。 第二阶段:业务系统执行主事务,即购买货币基金。 第三阶段:主事务成功后 commit 到事务中心,由事务中心投递消息到从事务。如果主事务失败,就投递 rollback 给事务中心。这里需要两阶段提交的原因是:普通的入队操作无论放在主事务之前还是之后都无法保证最终一致。如果先执行主事务,再入队,那么可能在入队前,业务会宕机,就没有机会再入队了。如果先入队再执行主事务,那么可能主事务没有执行成功,但是从事务执行成功了,业务逻辑就会发生错乱。 由于网络抖动等原因,可能导致事务消息的二次确认丢失。此时需要依赖某种机制恢复整个分布式事务的上下文,RocketMQ 提供的反查机制正是为解决分布式事务中的超时问题而设计的。我们的事务中心的反查机制流程主要是,先检查事务中心的内部状态,再通过反查接口检查本地事务的执行结果,恢复事务上下文后,正常推进后续的流程。 5、RocketMQ 如何保证事务消息在消费端正常消费 消费端消费失败后,MQ 服务端需要进行一定次数的重试,我们需要制定合理的重试策略。因为有消费重试,这要求消费方接口需要实现幂等性;如果重试多次后仍失败,我们会把消息压入死信队列 DLQ,RocketMQ 提供了死信队列的功能,对进入死信队列的消息进行告警处理。   6、事务消息的适用场景 第一类场景:需要同步执行的领域事件,比如说领域事件逻辑失败概率大,业务要及时将返回码告知客户端,自然不能放在异步流程中。举个例子,做过支付系统的小伙伴都知道,支付扣款前要检查余额是否足够,如果余额不足,那在异步流程中重试多少次都是失败。  第二类场景:是事务不可重入场景,例如业务系统发送消息时没有确定一个唯一事务 ID,那后续的业务逻辑就无法保证幂等,假设其中一个事务是创建订单,如果不能保证幂等的话,重试多次就会产生多个订单;所以这里需要使用到事务消息,用来明确一个分布式事务的开始,生成一个唯一事务 ID,让后续的流程能以这个事务 ID 来保证幂等。 未来规划 目前,我们基于 RocketMQ 在客户陪伴体系上解耦了上下游的服务,提升了运营和陪伴的效率。同时,我们在 RocketMQ 事务消息的基础上,搭建了这样一个支持分布式事务的服务协调平台,也就是我们的事务中心,大大提升了对金融场景化的产品包装能力。未来,我们将围绕着事务中心,拓宽更多的金融应用场景,创造更大的业务价值。
作者:伍振河
#行业实践

2021年10月12日

EDA 事件驱动架构与 EventBridge 二三事
当下比较成功的企业已然认识到,要想最大限度提升运营效率和客户体验,务必将业务和技术两方面的举措紧密结合起来。运营事件或业务形势的变化是时下众多企业关注的焦点,这些变化能够为企业领导者带来切实有用的信息,而架构设计的主旨恰恰是从客户联系人、交易、运营等方面的信息中获取洞见,两者相辅相成。传统技术历来对企业从事件中获取洞见的速度有着诸多限制,比如用于记录、收集和处理此类事件的批处理 ETL(提取、转换、加载)。 事件驱动型架构 (EDA) 方兴未艾,作为一种 Serverless 化的应用概念对云原生架构具有着深远影响。当我们讨论到一个具体架构时,首当其冲的是它的发展是否具有技术先进性。这里从我们熟悉的 MVC 架构,SOA 架构谈起,聊一聊关于消息事件领域的历史与发展趋势。 消息事件领域的发展趋势 早在 2018 年,Gartner 评估报告将 EventDriven Model 列为 10 大战略技术趋势之一,事件驱动架构(EDA)将成为未来微服务的主流,并做出以下断言: 到 2022 年,事件通知的软件模型将成为超过 60% 的新型数字化商业的解决方案; 到 2022 年,超过 50% 的商业组织将参与到事件驱动的数字化商业服务的生态系统当中; George Santayana 在《 The Life of Reason》曾提到, Those who fail to learn History are doomed to repeat it.(不懂历史的人注定会重蹈覆辙)。我们以史为鉴,来看看为什么会架构会演进到事件驱动。 架构本身没有优劣之分,它本身就是一组技术决策,决定后续项目的所有功能开发(框架,编码规范,文档,流程….),这里聊聊为什么会引入某些框架,这个框架解决了软件开发中的什么问题。 单体架构:在单节点服务中,单体应用的所有模块都封装在单个进程运行,通信通过相同堆栈调用完成。这种模式下非常容易导致结构和关系不明确,难以对系统进行更改和重构。就像一个不透明的,粘稠的,脆弱的,僵硬的 Big Ball of Mud! 分层架构:在经典的分层架构中,层以相当谨慎的方式使用。即一个层只能知道它下方层的数据。在随后的实际应用中,更多的方式是一个层可以访问它下面的任何层。分层架构解决了单体架构的的逻辑分离问题,每一层都可以被等效替换,层区分也更加标准化,同时一个层可以被几个不同/更高级别的层使用。当然,层也有比较明显的缺点,层不能封装掉一切,比如添加到UI的某个字段,可能也需要添加到DB,而且额外多余的层会严重损害系统性能。 MVC 架构:MVC 架构产生的原因其实很简单,随着业务系统的复杂性增加,之前所谓“全栈工程师”已经不适用大部分场景。为了降低前端和后台的集成复杂性,故而开始推广 MVC 架构。其中,Model 代表业务逻辑,View 代表视图层比如前端UI的某个小组件,Controller 提供 View 和 Model 的协调比如将用户某项操作转为业务逻辑等。这里还有很多扩展架构,譬如 ModelViewPresenter ,ModelViewPresenterViewModel,ResourceMethodRepresentation,ActionDomainResponder 。 EBI 架构:即 Entity,Boundary(接口),Interactor(控制)。EBI架构将系统边界视为完整连接,而不仅仅是视图,控制器或接口。EBI 的实体代表持有数据并结束相关行为的实际实体,很类似阿里云的 POP API。EBI 主要还是后端概念,他是与 MVC 相辅相成的。 洋葱架构:洋葱架构是一种低耦合,高内聚的架构模型。所有的应用程序围绕独立的对象模型构建,内层定义接口外层实现接口,耦合方向向中心内聚,所有代码都可以独立与基础设施进行编译和运行。 SOA 架构:SOA 是 Service Orientated Architure 的缩写,即面向服务架构。表示每一个功能都是通过一个独立的服务来提供,服务定义了明确的可调用接口,服务之间的编排调用完成一个完整的业务。其实这个架构也是目前架构中最成熟的,日常使用最多的架构模式。 什么是 EDA 架构 我们聊完之前全部的架构趋势后,再回过头看看什么是 EDA 架构。 EDA 事件驱动架构( EventDriven Architecture ) 是一种系统架构模型,它的核心能力在于能够发现系统“事件”或重要的业务时刻(例如交易节点、站点访问等)并实时或接近实时地对相应的事件采取必要行动。这种模式取代了传统的“ request/response ”模型,在这种传统架构中,服务必须等待回复才能进入下一个任务。事件驱动架构的流程是由事件提供运行的。 上图其实很好的解释了 EDA 架构的模型,但是其实还不够明确。所以,这里我们和单体架构一起对比看看他们之间差异。 在如上对比图中,我们其实可以较为清楚看到它与传统架构的区别。在一般传统架构中,创建订单操作发生后,一系列的操作其实都是通过一个系统完成的。而事件驱动的概念则是将全部操作都转换为 “事件” 概念,下游通过捕获某个 “事件” 来决定调用什么系统完成什么样的操作。 总结来看,事件驱动其实是将比较重要的业务时刻封装成“事件”,并通过某个 EventBus 将事件路由给下游系统。 我们了解了 EDA 架构的整个处理过程,但是还没解决这个所谓的“EventBUS”到底是啥样。 上图就是事件驱动的核心逻辑架构。是不是非常像某个传统 MQ?别着急,下面我会讲到这个架构的复杂部分。讲完 EventBus,我们回过头来看“事件”,刚刚介绍中比较重要部分其实是将操作转换为某类事件进行分发。那这的事件我们怎么定义呢? 简单来看,其实事件就是状态的显著变化,当用户采取特定行动时触发。以 4S 店售卖汽车为例: 当客户购买汽车并且其状态从 For Sale 变为 Sold 是一个事件。 成功交易后,从帐户中扣除金额是一个事件。 单击预订试驾后,从将预约信息添加到指定用户就是一个事件。 每个事件都可能触发一个或多个选项作为响应。 关于事件其实云原生 CNCF 基金会在 2018 年托管了开源 CloudEvents 项目,该项目旨在用统一和规范的格式来描述事件,来加强不同的服务、平台以及系统之间的互操作性。在该项目定义下,通用的事件规范是这样的: 事件主要由 Json 体构成,通过不同字段描述发生的事件。 EDA 架构的落地实践思考 在开始介绍落地实践时,我们先来看一个经典的 EDA 架构模型: 这是一个非常经典 EDA 订单架构,该架构主要使用了 EventBridge 和 FC 函数计算(如果不太熟悉 FaaS 的同学可以把 FC 节点当作 ECS 或 K8s 的某个 POD 节点),通过事件驱动各个业务进行协作。 所以这块的中心节点(EventBridge)其实有三个比较重要的能力: 1. For Event Capturing(事件收集):具备采集事件的能力 2. For Routing(事件路由):通过事件内容将事件路由分发至于下游的能力的 3. For Event Processing(事件过滤/替换):对事件进行脱敏或初步过滤&筛选的能力 通常情况下,要实现这三个能力是比较困难的,比如:Event Capturing 可能需要熟悉 Dell Boomi, Snaplogic, MuleSoft, Dataflow, Apache Apex 等,Routing 部分可能通过 RocketMQ,RabbitMQ, ActiveMQ, Apache Kafka ,Event Processing 需要了解 Apache Storm, Apache Flink 。所以之前讲的逻辑架构其实非常理想,要想实现完成的 EDA 事件驱动还需要包括这些核心能力。   其实,从刚刚的架构中我们也能窥探到一些信息,EDA 架构其实看起来没有那么简单,那它有何优劣呢?下面我就简单罗列下 EDA 架构在实践中的优势: 松耦合:事件驱动架构是高度松耦合且高度分布式的架构模型,事件的创建者(来源)只知道发生的事件,并不知道事件的处理方式,也关心有多少相关方订阅该事件。 异步执行:EDA 架构是异步场景下最适合的执行工具,我们可以将需要事件保留在队列中,直到状态正常后执行。 可扩展性:事件驱动架构可以通过路由&过滤能力快速划分服务,提供更便捷的扩展与路由分发。 敏捷性:事件驱动架构可以通过将事件分发至任何地方,提供更敏捷高效的部署方案。 当然,劣势也很明显: 架构复杂:事件驱动架构复杂,路由节点多,系统结成复杂,功能要求多。 路由分发难:事件路由及分发难,灵活的事件路由需要依赖强大的实时计算能力,对整体分发系统要求较高。 无法追踪:事件追踪是整个 EDA 架构保证,EDA 架构中往往很难追踪到事件处理状态,需要大量的定制化开发。 可靠性差:事件驱动由于需要多系统集成,可靠性通常较差,且交付无法保障。   阿里云 EventBridge 如何解决 EDA 场景下的困境 针对 EDA 场景下面临的这些问题,阿里云推出了 EventBridge,一款无服务器事件总线服务,其使命是作为云事件的枢纽,以标准化的 CloudEvents 1.0 协议连接云产品和应用,应用和应用,提供中心化的事件治理和驱动能力,帮助用户轻松构建松耦合、分布式的事件驱动架构;另外,在阿里云之外的云市场上有海量垂直领域的 SaaS 服务,EventBridge 将以出色的跨产品、跨组织以及跨云的集成与被集成能力,助力客户打造一个完整的、事件驱动的、高效可控的上云体验。并针对 EDA 困境提供了针对性的解决方案。 架构复杂:提供业内通用的  Source ,Buses,Rules,Targets  模块管理能力,同时支持 EventBus 和 EventStream 两种模式。大幅度降低事件驱动架构难度。 路由分发:EventBridge 通过事件规则驱动,支持 8 大事件模式,4 重转换器,满足路由分发的全部诉求。 无法追踪:独家提供事件追踪能力,事件分析/查询能力。为用户完善整体事件链路。 可靠性差:支持 DLQ/ 重试机制,大幅度保证由于用户下游系统导致的事件故障与延迟。同时,在此基础上 EventBridge 支持 82 种阿里云产品,847 种事件类型。 阿里云 EventBridge 更多场景介绍 1. 经典 EDA 事件驱动:事件总线(EventBridge)最重要的能力是通过连接应用程序,云服务和 Serverless 服务构建 EDA(Eventdriven Architectures) 事件驱动架构,驱动应用与应用,应用与云的连接。 2. 流式 ETL 场景:EventBridge 另一个核心能力是为流式的数据管道的责任,提供基础的过滤和转换的能力,在不同的数据仓库之间、数据处理程序之间、数据分析和处理系统之间进行数据同步/跨地域备份等场景,连接不同的系统与不同服务。 3. 统一事件通知服务:EventBridge 提供丰富的云产品事件源与事件的全生命周期管理工具,您可以通过总线直接监听云产品产生的数据,并上报至监控,通知等下游服务。  目前事件总线免费公测,点击下方链接,立即体验!
作者:肯梦
#技术探索 #事件驱动架构

2021年7月30日

RocketMQ在搜狐的创新实践
MQ使用场景及选型 大多数的视频各部门中使用过的消息中间件,包括有 RedisMQ、ActiveMQ、RocketMQ、Kafka 等,本文将选取几个典型的业务介绍一下其使用场景及问题。 1、引入RocketMQ 最开始使用 RocketMQ 的是计数业务,计数业务需要将客户端的播放量实时计算并展示。当时采用 Redis 进行实时计数,再异步调用数据库进行计数。起初这种模式没什么问题,但是随着业务量变大,数据库压力也进一步增大。甚至有时候数据库机器的 CPU 快被打满了,另外当数据库迁移时,需要暂停写入,计数将面临数据丢失。 这时计数业务迫切需要一个可靠的,能实时消费,且能够堆积的 MQ 来改变这种状况. 当时我们考虑了 RocketMQ 和 Kafka,却最终选择了 RocketMQ,原因请参考下方。 2、放弃 Kafka 放弃 Kafka 投放业务需要将为用户推荐的内容投放到各个区域,但是推荐业务需要知道用户对于推荐内容的反馈,所以投放业务选择了使用 Kafka 来跟推荐业务交互。但是由于某次机器故障,导致 Kafka 集群发生故障转移,而不幸的是,这个集群的分区数过多,导致转移耗时几分钟才完成。 进而导致业务线程阻塞,服务进入无响应状态。而之后了解到 RocketMQ 即使某个 broker 宕机,消息会发送到其他 broker,不会产生整个集群阻塞情况,后来投放业务就将消息交互全部迁移到了 RocketMQ 上。 3、不可靠的 RedisMQ 之前视频基础服务使用了 RedisMQ,用来通知调用方,视频数据发生了变化,进行数据更新。而redis的消息推送基于 pub/sub 模式,虽然实时性很高,但是却不保证可靠,而且消息不会进行持久化。 这两个缺点就导致了某些情况下,调用方收不到通知,而且消息丢失时基本无据可查。 所以此业务最终放弃了 RedisMQ,转而投向 RocketMQ。RocketMQ 能够保证消息至少被投递一次,而且消息支持持久化,即使客户端重启,仍然可以从上次消费的地方继续消费。 4、低性能 ActiveMQ 用户视频基础服务之前使用了 ActiveMQ,主要用于通知依赖方数据变更,它的消息体里包含了变更的数据。遗憾的是,当消息量很大时,ActiveMQ 经常出现无法响应的情况,甚至消费者出现长时间接收不到消息的情况。而了解到 RocketMQ 单个 broker 可以承担几十万 TPS,亿级消息堆积时,此业务也迁移到 了RocketMQ 上。 目前使用 RocketMQ 的业务,包括视频基础服务,用户服务,直播业务,付费业务,审核等等业务系统。而 Kafka 大部分只用于日志相关的处理服务上,比如日志上报,业务日志收集等等。 另外,随着 RocketMQ 支持的客户端越来越丰富,也便于我们很多其他语言的业务接入,比如 AI 组使用 python 客户端,一些 GO 开发的业务,使用 GO 客户端等。 运维之痛 初期,我们运维 RocketMQ 基本靠命令行和 RocketMQConsole。业务方经常来询问的问题包括如下: 我有哪些机器在往这个topic发送消息? 发送消息怎么超时了? 发送失败能通知我吗? 消费失败了能通知我吗? 消息体是啥样的? RocketMQ集群不可用了能不能降级隔离? 我消费我的topic为啥导致别的业务消费混乱? 为啥还需要我自己序列化? 问题很多,而且千奇百怪! 而作为运维人员,除了调查解答业务方的问题之外,在命令行运维 RocketMQ,更让我们小心翼翼。生怕脑子一时糊涂,敲错一个命令,造成大面积故障。随着运维的深入,我们总结了一篇又一篇的使用规范,最佳实践,命名约定,操作步骤等等的文章。但是,随之发现,这些文章对生产效率的提升并不明显。所以与其写文档不如将经验和实践转换为产品,能够更好的服务于业务,因此 MQCloud 应运而生。 MQCloud 诞生 先看一下 MQCloud 的定位: 它是集客户端 SDK,监控预警,集群运维于一体的一站式服务平台。MQCloud 的系统架构如下: 接下来分别说明一下 MQCloud 如何解决上面提到的痛点。 1、业务端和运维端分离,使业务用户只聚焦于业务数据 为了实现这个目的,引入了用户,资源两大维度。针对用户和资源加以控制,使不同的用户只聚焦于自己的数据。 对于生产方来说,他关心的是 topic 配置,消息的发送数据,谁在消费等等问题,这样只对他展示相应的数据即可; 对于消费者来说,只关心消费状况,有没有堆积,消费失败等情况; 对于管理员来说,可以进行部署,监控,统一配置,审批等日常运维; 2、清晰明了的操作 通过对不同角色展示不同的视图,使用户可以进行的操作一目了然。 3、规范和安全 为了保障集群操作的安全性和规范性,所有的操作都会以申请单的形式进入后台审批系统,管理员来进行相关审批,安全性大大提升。 4、多维的数据统计和监控预警 MQCloud 核心功能之一就是监控预警,目前支持如下预警: 生产消息异常预警 消费消息堆积预警(broker 角度) 消费客户端阻塞(客户端角度) 消费失败预警 消费偏移量错误预警 消费订阅错误预警 消费落后预警(超出内存阈值,从硬盘拉数据) 死消息预警(消费失败太多,消息进入死信队列) 消息流量异常预警 消息存储耗时过长预警(broker 存储消息耗时) broker&NameServer 宕机预警 服务器宕机预警 服务器 cpu,内存,网络流量等指标预警 要想做监控,必须先做统计,为了更好的知道 RocketMQ 集群的运行状况,MQCloud 做了大量的统计工作(大部分依赖于 broker 的统计),主要包括如下几项: 每分钟 topic 的生产流量:用于绘制 topic 生产流量图及监控预警。 每分钟消费者流量:用于绘制消费流量图及监控预警。 每10分钟 topic 生产流量:用于按照流量展示 topic 排序。 每分钟 broker 生产、消费流量:用于绘制 broker 生产消费流量图。 每分钟集群生产、消费流量:用于绘制集群的生产流量图。 每分钟生产者百分位耗时、异常统计:以 ip 维度绘制每个生产者的耗时流量图及监控预警。 机器的 cpu,内存,io,网络流量,网络连接等统计:用于服务器的状况图和监控预警。 下面捡一两点进行一下说明: 1、生产异常耗时统计: 由于 RocketMQ 并没有提供生产者的流量统计(只提供了 topic,但是并不知道每个生产者的情况),所以 MQCloud 实现了对生产者数据进行统计(通过 RocketMQ 的回调钩子实现): 主要统计如下信息: 客户端 ipbroker ip 发送消息耗时 消息数量 发送异常 统计完成后,定时发送到 MQCloud 进行存储,并做实时监控和展示。 关于统计部分有一点说明,一般耗时统计有最大,最小和平均值,而通常 99% (即 99% 的请求耗时都低于此数值)的请求的耗时情况才能反映真实响应情况。99% 请求耗时统计最大的问题是如何控制内存占用,因为需要对某段时间内所有的耗时做排序后才能统计出这段时间的 99% 的耗时状况。而对于流式数据做这样的统计是有一些算法和数据结构的,例如 tdigest,但是 MQCloud 采用了非精确的但是较为简单的分段统计的方法,具体如下: 1、创建一个按照最大耗时预哈希的时间跨度不同的耗时分段数组: 第一段:耗时范围 0ms~10ms,时间跨度为 1ms。 第二组:耗时范围 11ms~100ms,时间跨度 5ms。 第三组:耗时范围 101ms~3500ms,时间跨度 50ms。 _优点:此种分段方法占用内存是固定的,比如最大耗时如果为3500ms,那么只需要空间大小为96的数组即可缺点:分段精度需要提前设定好,且不可更改。_ 2、针对上面的分段数组,创建一个大小对应的AtomicLong的计数数组,支持并发统计: 3、耗时统计时,计算耗时对应的耗时分段数组下标,然后调用计数数组进行统计即可,参考下图: 例如某次耗时为18ms,首先找到它所属的区间,即归属于[16~20]ms之间,对应的数组下标为12。 根据第一步找到的数组下标12,获取对应的计数数组下标12。 获取对应的计数器进行+1操作,即表示18ms发生了一次调用。 这样,从计数数组就可以得到实时耗时统计,类似如下: 4、然后定时采样任务会每分钟对计数数组进行快照,产生如下耗时数据: 5、由于上面的耗时数据天然就是排好序的,可以很容易计算 99%、90%、平均耗时等数据了。 _另外提一点,由于 RocketMQ 4.4.0 新增的 trace 功能也使用 hook 来实现,与 MQCloud 的统计有冲突,MQCloud 已经做了兼容。Trace 和统计是两种维度,trace 反映的是消息从生产存储消费的流程,而 MQCloud 做的是针对生产者状况的统计,有了这些统计数据,才可以做到生产耗时情况展示,生产异常情况预警等功能。_ 2、机器统计 关于集群状况收集主要采用了将nmon自动放置到/tmp目录,定时采用ssh连接到机器执行nmon命令,解析返回的数据,然后进行存储。 上面这些工作就为监控和预警奠定了坚实的数据基础。 一、单独定制的客户端 针对客户端的一些需求,mqclient 在 rocketmqclient 的基础上进行了开发定制: 1、多集群支持 MQCloud储存了生产者、消费者和集群的关系,通过路由适配,客户端可以自动路由到目标集群上,使客户端对多集群透明。 2、透明的trace集群 通过搭建单独的trace集群和定制客户端,使trace数据能够发往独立的集群,防止影响主集群。 3、序列化 通过集成不同的序列化机制,配合MQCloud,客户端无需关心序列化问题。 目前支持的序列化为protobuf和json,并且通过类型检测支持在线修改序列化方式。 4、流控 通过提供令牌桶和漏桶限流机制,自动开启流控机制,防止消息洪峰冲垮业务端,也为需要精准控制流速的业务提供了方便。 5、隔离降级 针对生产消息使用hystrix提供了隔离api,使业务端在broker故障时可以避免拖累。 6、埋点监控 通过对客户端数据进行统计,收集,在MQCloud里进行监控,使客户端任何风吹草动都能及时得知。 7、规范问题 通过编码保障,使某些约定,规范和最佳实践得以实现。包括但不限于: 命名规范 消费组全局唯一,防止重复导致消费问题 重试消息跳过 安全关闭等等 更完善的重试机制 二、近乎自动化运维 1、部署 手动部署一台 broker 实例没什么问题,但是当实例变多时,手动部署极易出错且耗时耗力。 MQCloud 提供了一套自动化部署机制,包括停止写入,上下线,本地更新,远程迁移(包含数据校验): 支持一键部署: 另外,broker 作为 RocketMQ 的核心,其配置有百项之多,而且好多涉及到性能调优,调整时往往需要根据服务器的状况谨慎调整,MQCloud 开发了配置模板功能来支持灵活的部署项: 2、机器运维 MQCloud 提供了一整套机器的运维机制,大大提升了生产力。 3、可视化的集群拓扑 三、安全性加固 1、开启管理员权限 RocketMQ 从 4.4.0 开始支持 ACL,但是默认没有开启,也就是任何人使用管理工具或 API 就可以直接操纵线上集群。但是开启 ACL 对现有业务影响太大,针对这种情况 MQCloud 进行专门定制。 借鉴 RocketMQ ACL 机制,只针对 RocketMQ 管理员操作加固权限校验: 并且支持自定义和热加载管理员请求码,使得非法操作 RocketMQ 集群成为不可能,安全性大大提升。 2broker 通信加固 broker 同步数据代码由于没有校验,存在安全隐患,只要连接 master 监听的 slave 通信端口,发送数据大于 8 个字节,就可能导致同步偏移量错误,代码如下: MQCloud 通过验证数据首包的策略,保障了通信的安全性。 if ((this.byteBufferRead.position() this.processPostion) = 8) {  int pos = this.byteBufferRead.position() (this.byteBufferRead.position() % 8);  long readOffset = this.byteBufferRead.getLong(pos 8);  this.processPostion = pos;  HAConnection.this.slaveAckOffset = readOffset;  if (HAConnection.this.slaveRequestOffset < 0) {      HAConnection.this.slaveRequestOffset = readOffset;      log.info("slave[" + HAConnection.this.clientAddr + "] request offset " + readOffset);  }  HAConnection.this.haService.notifyTransferSome(HAConnection.this.slaveAckOffset); } 开源之路 目前 MQCloud 运维规模如下: 服务器:50台+ 集群:5个+ topic:800个+ consumer:1400+ 生产消费消息量/日:4 亿条+ 生产消费消息大小/日:400G+ MQCloud 在充分考虑和吸收实际业务的需求后,以各个角色聚焦为核心,以全面监控为目标,以满足各业务端需求为己任,在不断地发展和完善。 在 MQCloud 逐渐成熟之后,秉承着服务于社区和吸收更多经验的理念,我们开放了源代码。经过设计和拆分,MQCloud 于 18 年开源了,从第一个版本 release 到现在已经过去两年了,期间随着更新迭代大大小小一共 release 了 20 多个版本。其中不但包含功能更新、bug 修复、wiki 说明等,而且每个大版本都经过详细的测试和内部的运行。之后很多小伙伴跃跃欲试,来试用它,并提出一些建议和意见,我们根据反馈来进一步完善它。 我们将一直遵循我们的目标,坚定的走自己的开源之路: 为业务提供可监控,可预警,可满足其各种需求的稳定的 MQ 服务。 积累 MQ 领域经验,将经验转化为产品,更好的服务业务。
#行业实践

2021年6月30日

同程旅行网基于 RocketMQ 高可用架构实践
背景介绍 为何选择 RocketMQ 我们在几年前决定引入 MQ 时,市场上已经有不少成熟的解决方案,比如 RabbitMQ , ActiveMQ,NSQ,Kafka 等。考虑到稳定性、维护成本、公司技术栈等因素,我们选择了 RocketMQ : 纯 Java 开发,无依赖,使用简单,出现问题能 hold ; 经过阿里双十一考验,性能、稳定性可以保障; 功能实用,发送端:同步、异步、单边、延时发送;消费端:消息重置,重试队列,死信队列; 社区活跃,出问题能及时沟通解决。 使用情况 主要用于削峰、解耦、异步处理; 已在火车票、机票、酒店等核心业务广泛使用,扛住巨大的微信入口流量; 在支付、订单、出票、数据同步等核心流程广泛使用; 每天 1000+ 亿条消息周转。 下图是 MQ 接入框架图 由于公司技术栈原因,client sdk 我们提供了 java sdk ;对于其他语言,收敛到 http proxy ,屏蔽语言细节,节约维护成本。按照各大业务线,对后端存储节点进行了隔离,相互不影响。 MQ 双中心改造 之前单机房出现过网络故障,对业务影响较大。为保障业务高可用,同城双中心改造提上了日程。 为何做双中心 单机房故障业务可用; 保证数据可靠:若所有数据都在一个机房,一旦机房故障,数据有丢失风险; 横向扩容:单机房容量有限,多机房可分担流量。 双中心方案 做双中心之前,对同城双中心方案作了些调研,主要有冷(热)备份、双活两种。(当时社区 Dledger 版本还没出现,Dledger 版本完全可做为双中心的一种可选方案。) 1)同城冷(热)备份 两个独立的 MQ 集群, 用户流量写到一个主集群,数据实时同步到备用集群,社区有成熟的 RocketMQ Replicator 方案,需要定期同步元数据,比如主题,消费组,消费进度等。 2)同城双活 两个独立 MQ 集群,用户流量写到各自机房的 MQ 集群,数据相互不同步。 平时业务写入各自机房的 MQ 集群,若一个机房挂了,可以将用户请求流量全部切到另一个机房,消息也会生产到另一个机房。 对于双活方案,需要解决 MQ 集群域名。 1)若两个集群用一个域名,域名可以动态解析到各自机房。此方式要求生产、消费必须在同一个机房。假如生产在 idc1 ,消费在 idc2 ,这样生产、消费各自连接一个集群,没法消费数据。 2)若一个集群一个域名,业务方改动较大,我们之前对外服务的集群是单中心部署的,业务方已经大量接入,此方案推广较困难。 为尽可能减少业务方改动,域名只能继续使用之前的域名,最终我们采用一个 Global MQ 集群,跨双机房,无论业务是单中心部署还是双中心部署都不影响;而且只要升级客户端即可,无需改动任何代码。 双中心诉求 就近原则:生产者在 A 机房,生产的消息存于 A 机房 broker ; 消费者在 A 机房,消费的消息来自 A 机房 broker 。 单机房故障:生产正常,消息不丢。 broker 主节点故障:自动选主。 就近原则 简单说,就是确定两件事: 节点(客户端节点,服务端节点)如何判断自己在哪个 idc; 客户端节点如何判断服务端节点在哪个 idc。 如何判断自己在哪个 idc? 1) ip 查询 节点启动时可以获取自身 ip ,通过公司内部的组件查询所在的机房。 2)环境感知 需要与运维同学一起配合,在节点装机时,将自身的一些元数据,比如机房信息等写入本地配置文件,启动时直接读写配置文件即可。 我们采用了第二个方案,无组件依赖,配置文件中 logicIdcUK 的值为机房标志。 客户端节点如何识别在同一个机房的服务端节点? 客户端节点可以拿到服务端节点的 ip 以及 broker 名称的,因此: ip 查询:通过公司内部组件查询 ip 所在机房信息; broker 名称增加机房信息:在配置文件中,将机房信息添加到 broker 名称上; 协议层增加机房标识:服务端节点向元数据系统注册时,将自身的机房信息一起注册。 相对于前两者,实现起来略复杂,改动了协议层, 我们采用了第二种与第三种结合的方式。 就近生产 基于上述分析,就近生产思路很清晰,默认优先本机房就近生产; 若本机房的服务节点不可用,可以尝试扩机房生产,业务可以根据实际需要具体配置。 就近消费 优先本机房消费,默认情况下又要保证所有消息能被消费。 队列分配算法采用按机房分配队列 每个机房消息平均分给此机房消费端; 此机房没消费端,平分给其他机房消费端。 伪代码如下: Map mqs = classifyMQByIdc(mqAll); Map cids = classifyCidByIdc(cidAll); Set< result = new HashSet<; for(element in mqs){ result.add(allocateMQAveragely(element, cids, cid)); //cid为当前客户端 } 消费场景主要是消费端单边部署与双边部署。 单边部署时,消费端默认会拉取每个机房的所有消息。 双边部署时,消费端只会消费自己所在机房的消息,要注意每个机房的实际生产量与消费端的数量,防止出现某一个机房消费端过少。 单机房故障 每组 broker 配置 一主两从,一主一从在一机房,一从在另一机房;某一从同步完消息,消息即发送成功。 单机房故障 消息生产跨机房;未消费消息在另一机房继续被消费。 故障切主 在某一组 broker 主节点出现故障时,为保障整个集群的可用性,需要在 slave 中选主并切换。要做到这一点,首先得有个broker 主故障的仲裁系统,即 nameserver(以下简称 ns )元数据系统(类似于 redis 中的哨兵)。 ns 元数据系统中的节点位于三个机房(有一个第三方的云机房,在云上部署 ns 节点,元数据量不大,延时可以接受),三个机房的 ns 节点通过 raft 协议选一个leader,broker 节点会将元数据同步给 leader, leader 在将元数据同步给 follower 。 客户端节点获取元数据时, 从 leader,follower 中均可读取数据。 切主流程 若 nameserver leader 监控到 broker 主节点异常, 并要求其他 follower 确认;半数 follower 认为 broker 节点异常,则 leader 通知在 broker 从节点中选主,同步进度大的从节点选为主; 新选举的 broker 主节点执行切换动作并注册到元数据系统; 生产端无法向旧 broker 主节点发送消息。 流程图如下 切中心演练 用户请求负载到双中心,下面的操作先将流量切到二中心回归双中心切到一中心。确保每个中心均可承担全量用户请求。 先将用户流量全部切到二中心 流量回归双中心,并切到一中心 回顾 全局 Global 集群 就近原则 一主二从,写过半消息即及写入成功 元数据系统 raft 选主 broker 主节点故障,自动选主 MQ 平台治理 即使系统高性能、高可用,倘若随便使用或使用不规范,也会带来各种各样的问题,增加了不必要的维护成本,因此必要的治理手段不可或缺。 目的 让系统更稳定 及时告警 快速定位、止损 治理哪些方面 主题/消费组治理 申请使用 生产环境 MQ 集群,我们关闭了自动创建主题与消费组,使用前需要先申请并记录主题与消费组的项目标识与使用人。一旦出现问题,我们能够立即找到主题与消费组的负责人,了解相关情况。若存在测试,灰度,生产等多套环境,可以一次申请多个集群同时生效的方式,避免逐个集群申请的麻烦。 生产速度 为避免业务疏忽发送大量无用的消息,有必要在服务端对主题生产速度进行流控,避免这个主题挤占其他主题的处理资源。 消息积压 对消息堆积敏感的消费组,使用方可设置消息堆积数量的阈值以及报警方式,超过这个阈值,立即通知使用方;亦可设置消息堆积时间的阈值,超过一段时间没被消费,立即通知使用方。 消费节点掉线 消费节点下线或一段时间无响应,需要通知给使用方。 客户端治理 发送、消费耗时检测 监控发送/消费一条消息的耗时,检测出性能过低的应用,通知使用方着手改造以提升性能;同时监控消息体大小,对消息体大小平均超过 10 KB 的项目,推动项目启用压缩或消息重构,将消息体控制在 10 KB 以内。 消息链路追踪 一条消息由哪个 ip 、在哪个时间点发送,又由哪些 ip 、在哪个时间点消费,再加上服务端统计的消息接收、消息推送的信息,构成了一条简单的消息链路追踪,将消息的生命周期串联起来,使用方可通过查询msgId或事先设置的 key 查看消息、排查问题。 过低或有隐患版本检测 随着功能的不断迭代,sdk 版本也会升级并可能引入风险。定时上报 sdk 版本,推动使用方升级有问题或过低的版本。 服务端治理 集群健康巡检 如何判断一个集群是健康的?定时检测集群中节点数量、集群写入 tps 、消费 tps ,并模拟用户生产、消费消息。 集群性能巡检 性能指标最终反映在处理消息生产与消费的时间上。服务端统计处理每个生产、消费请求的时间,一个统计周期内,若存在一定比例的消息处理时间过长,则认为这个节点性能有问题;引起性能问题的原因主要是系统物理瓶颈,比如磁盘 io util 使用率过高,cpu load 高等,这些硬件指标通过夜鹰监控系统自动报警。 集群高可用 高可用主要针对 broker 中 master 节点由于软硬件故障无法正常工作,slave 节点自动被切换为 master ,适合消息顺序、集群完整性有要求的场景。 部分后台操作展示 主题与消费组申请 生产,消费,堆积实时统计 集群监控 踩过的坑 社区对 MQ 系统经历了长时间的改进与沉淀,我们在使用过程中也到过一些问题,要求我们能从深入了解源码,做到出现问题心不慌,快速止损。 新老消费端并存时,我们实现的队列分配算法不兼容,做到兼容即可; 主题、消费组数量多,注册耗时过长,内存 oom ,通过压缩缩短注册时间,社区已修复; topic 长度判断不一致,导致重启丢消息,社区已修复; centos 6.6 版本中,broker 进程假死,升级 os 版本即可。 MQ 未来展望 目前消息保留时间较短,不方便对问题排查以及数据预测,我们接下来将对历史消息进行归档以及基于此的数据预测。 历史数据归档 底层存储剥离,计算与存储分离 基于历史数据,完成更多数据预测 服务端升级到 Dledger ,确保消息的严格一致
作者:阿里云云原生
#行业实践 #高可用