平安保险基于 SPI 机制的 RocketMQ 定制化应用

简介:本文讲讲述平安保险为何选择 RocketMQ,以及在确定使用消息中间件后,又是如何去选择哪款消息中间件的。

作者:孙园园|平安人寿资深开发

为什么选用 RocketMQ

首先跟大家聊聊我们为什么会选用 RocketMQ,在做技术选型的过程中,应用场景应该是最先考虑清楚的,只有确定好了应用场景在做技术选型的过程中才有明确的目标和衡量的标准。像异步、解耦、削峰填谷这些消息中间件共有的特性就不一一介绍了,这些特性是决定你的场景需不需要使用消息中间件,这里主要讲述下在确定使用消息中间件后,又是如何去选择哪款消息中间件的。

同步双写,确保业务数据安全可靠不丢失

我们在搭建消息中间件平台时的定位是给业务系统做业务数据的传输使用,对业务数据的很重要的一个要求就是不允许丢数据,所以选用 RocketMQ 的第一点就是他有同步双写机制,数据在主从服务器上都刷盘成功才算发送成功。同步双写条件下,MQ 的写入性能与异步刷盘异步赋值相比肯定会有所下降,与异步条件下大约会有 20% 左右的下降,单主从架构下,1K 的消息写入性能还是能达到 8W+ 的 TPS,对大部分业务场景而言性能是能完全满足要求的,另外对下降的这部分性能可以通过 broker 的横向扩招来弥补,所以在同步双写条件下,性能是能满足业务需求的。

多 topic 应用场景下,性能依旧强悍

第二点,业务系统的使用场景会特别多,使用场景广泛带来的问题就是会创建大量的 topic,所以这时候就得去衡量消息中间件在多 topic 场景下性能是否能满足需求。我自己在测试的时候呢,用 1K 的消息随机往 1 万个 topic 写数据,单 broker 状态下能达到2W左右的 TPS,这一点比 Kafka 要强很多。所以多 topic 应用场景下,性能依旧强悍是我们选用 topic 的第二个原因。这点也是由底层文件存储结构决定的,像 Kafka、RocketMQ 这类消息中间件能做到接近内存的读写能力,主要取决于文件的顺序读写和内存映射。RocketMQ 中的所有 topic 的消息都是写在同一个 commitLog 文件中的,但是 Kafka 中的消息是以 topic 为基本单位组织的,不同的 topic 之间是相互独立的。在多 topic 场景下就造成了大量的小文件,大量的小文件在读写时存在一个寻址的过程,就有点类似随机读写了,影响整体的性能。

支持事务消息、顺序消息、延迟消息、消息消费失败重试等

RocketMQ 支持事务消息、顺序消息、消息消费失败重试、延迟消息等,功能比较丰富,比较适合复杂多变的业务场景使用。

社区建设活跃,阿里开源系统

另外,在选用消息中间件时也要考虑下社区的活跃度和源码所使用的开发语言,RocketMQ 使用 Java 开发,对 Java 开发人员就比较友好,不管是阅读源码排查问题还是在 MQ 的基础上做二次开发都比较容易一点。社区里同学大都是国内的小伙伴,对大家参与 RocketMQ 开源贡献也是比较亲近的,这里呢也是希望更多的小伙伴能参与进来,为国内开源项目多做贡献。

SPI 机制简介及应用

介绍完为什么选用 RocketMQ 后,接下来给大家介绍下我们是如何基于 SPI 机制应用 RocketMQ 的。SPI 全称为 (Service Provider Interface) ,是 JDK 内置的一种服务提供发现机制,我个人简单理解就是面向接口编程,留给使用者一个扩展的点,像 springBoot 中的 spring.factories 也是 SPI 机制的一个应用。如图给大家展示的是 RocketMQ 中 SPI 的一个应用。我们基于 SPI 机制的 RocketMQ 客户端的应用的灵感也是来自于 MQ 中 SPI 机制的应用。RocketMQ 在实现 ACL 权限校验的时候,是通过实现 AccessValidator 接口,PlainAccessValidator 是 MQ 中的默认实现。权限校验这一块,可能因为组织架构的不一样会有不同的实现方式,通过 SPI 机制提供一个接口,为开发者定制化开发提供扩展点。在有定制化需求时只需要重新实现 AccessValidator 接口,不需要对源码大动干戈。

接下来先给大家介绍下我们配置文件的一个简单模型,在这个配置文件中除了 sendMsgService、consumeMsgConcurrently、consumeMsgOrderly 这三个配置项外其余的都是 RocketMQ 原生的配置文件,发送消息和消费消息这三个配置项呢就是 SPI 机制的应用,是为具体实现提供的接口。可能有的同学会有疑问,SPI 的配置文件不是应该放在 META-INF.service 路径下么?这里呢我们是为了方便配置文件的管理,索性就跟 MQ 配置文件放在了一起。前面也提到了,META-INF.service 只是一个默认的路径而已,为了方便管理做相应的修改也没有违背SPI机制的思想。

我们再看下这个配置文件模型,这里的配置项呢囊括了使用 MQ 时所要配置的所有选项,proConfigs 支持所有的 MQ 原生配置,这样呢也就实现了配置与应用实现的解耦,应用端只需呀关注的具体的业务逻辑即可,生产者消费者的实现和消费者消费的 topic 都可以通过配置文件来指定。另外该配置文件也支持多 nameserver 的多环境使用,在较复杂的应用中支持往多套 RocketMQ 环境发送消息和消费多套不同环境下的消息。消费者提供了两个接口主要是为了支持 RocketMQ 的并发消费和顺序消费。接下来呢给大家分享下如何根据这个配置文件来初始化生产者消费者。首先给大家先介绍下我们抽象出来的客户端加载的一个核心流程。

客户端核心流程详情

图中大家可以看到,客户端的核心流程我们抽象成了三部分,分别是启动期、运行期和终止期。首先加载配置文件呢就是加载刚刚介绍的那个配置文件模型,在配置与应用完全解耦的状态下,必须先加载完配置文件才能初始化后续的流程。在初始化生产者和消费者之前应当先创建好应用实现的生产者和消费者的业务逻辑对象 供生产者和消费者使用。在运行期监听配置文件的变化,根据变化动态的调整生产者和消费者实例。这里还是要再强调下配置与应用的解耦为动态调整提供了可能。终止期就比较简单了,就是关闭生产者和消费者,并从容器中移除。这里的终止期指的生产者和消费者的终止,并不是整个应用的终止,生产者和消费者的终止可能出现在动态调整的过程中,所以终止了的实例一定要从容器中移除,方便初始化后续的生产者和消费者。介绍完基本流程后,接下来给大家介绍下配置文件的加载过程。

如何加载配置文件

配置文件加载这一块的话,流程是比较简单的。这里主要讲的是如何去兼容比较老的项目。RocketMQ 客户端支持的 JDK 最低版本是 1.6,所以在封装客户端时应该要考虑到新老项目兼容的问题。在这里呢我们客户端的核心包是支持 JDK1.6 的,spring 早期的项目配置文件一般都是放在在 resources 路径下,我们是自己实现了一套读取配置文件的和监听配置文件的方法,具体的大家可以参考 acl 中配置文件的读取和监听。在核心包的基础上用 springBoot 又封装了一套自动加载配置文件的包供微服务项目使用,配置文件的读取和监听都用的 spring 的那一套。配置文件加载完之后, 配置文件中应用实现的生产者和消费者是如何与 RocketMQ 的生产者和消费者相关联的呢?接下来给大家分享下这方面的内容。

如何将生产消费者与业务实现关联

首先先看下消费者是如何实现关联的,上图是 MQ 消费者的消息监听器,需要我们去实现具体的业务逻辑处理。通过将配置文件中实现的消费逻辑关联到这里就能实现配置文件中的消费者与 RocketMQ 消费者的关联。消费者的接口定义也是很简单,就是去消费消息。消费消息的类型可以通过泛型指定,在初始化消费者的时候获取具体实现的参数类型,并将MQ 接受到的消息转换为具体的业务类型数据。由客户端统一封装好消息类型的转换。对消费消息的返回值大家可以根据需要与 MQ 提供的 status 做一个映射,这里的 demo 只是简单显示了下。在获取具体的应用消费者实例的时候,如果你的消费逻辑里使用了 spring 管理的对象,那么你实现的消费逻辑对象也要交给 spring 管理,通过 spring 上下文获取初始化好的对象;如果你的消费逻辑里没有使用 spring 进行管理,可以通过反射的方式自己创建具体的应用实例。

与消费者不一样的是生产者需要将初始化好的 producer 对象传递到应用代码中去,而消费者是去获取应用中实现的逻辑对象,那如何将 producer 传递到业务应用中去呢?

业务代码中实现的生产者需要继承 SendMessage,这样业务代码就获得了 RmqProducer 对象,这是一个被封装后的生产者对象,该对象对发送消息的方法进行的规范化定义,使之符合公司的相应规范制度,该对象中的方法也会对 topic 的命名规范进行检查,规范 topic 有一个统一的命名规范。

如何动态调整生产消费者

首先谈到动态调整就需要谈一下动态调整发生的场景,如果没有合适的使用场景的话实现动态调整就有点华而不实了。这里我列举了四个配置文件发生变化的场景:

nameserver发生变化的时候,需要重新初始化所有的生产者和消费者,这个一般是在 MQ 做迁移或者当前 MQ 集群不可用是需要紧急切换 MQ;

增减实例的场景只要启动或关闭相应的实例即可,增加应用实例的场景一般是在需要增加一个消费者来消费新的 topic 的,减少消费者一般是在某个消费者发生异常时需要紧急关闭这个消费者,及时止损。

调整消费者线程的场景中我们对源码进行了一点修改,让应用端能获取到消费者的线程池对象,以便对线程池的核心线程数进行动态调整。这个的应用场景一般是在当某个消费者消费的数据比较多,占用过多的 CPU 资源时,导致优先级更高的消息得不到及时处理,可以先将该消费者的线程调小一些。

应用的优点

原文链接

本文为阿里云原创内容,未经允许不得转载。

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

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

相关文章

Redis 内存优化神技,小内存保存大数据

作者 | 码哥呀来源 | 码哥字节这次跟大家分享一些优化神技,当你面试或者工作中你遇到如下问题,那就使出今天学到的绝招,一招定乾坤!❝如何用更少的内存保存更多的数据?我们应该从 Redis 是如何保存数据的原理展开&…

SchedulerX 如何帮助用户解决分布式任务调度难题?

简介:本文分别对任务调度平台的资源定义、可视化管控能力、分布式批处理能力进行了简述,并基于 SchedulerX 的能力结合实际业务场景提供了一些基础参考案例。希望通过上述内容能让大家方便地熟悉任务调度平台接入使用概况,对于现有用户也可结…

如何做“健康码”的性能压测

简介:随着无线设备的普及和 5G 的大力建设,越来越多的线上系统、小程序成为了人们生活中必不可少的工具。对于这些工具,都会面对一个问题:系统能承受多少用户同时访问,面对突发的流量洪峰,能否保证系统无故…

对话 MySQL 之父:一个优秀程序员可抵5个普通程序员

【CSDN 编者按】MySQL之父Monty有着四十多年的编程经验,从儿时的兴趣到长大后的深耕,他在编程领域不断钻研,最终成为编程大师。《新程序员004》带你走进Monty的程序人生,谈谈他在编程方面的最新感悟以及对未来的预测。作者 | 郭露…

服务网格 ASM 年终总结:最终用户如何使用服务网格?

简介:本文不打算回顾 Istio 或是阿里云服务网格 ASM 的变化或趋势,我们来聊一聊阿里云 ASM 服务网格,它的最终用户是如何使用服务网格的。 作者:叶剑宏 背景 阿里云服务网格 ASM 于 2020 年 2 月公测,近 2 年的时间…

使用 nginx 轻松管理 kubernetes 资源文件

作者 | 江小南来源 | 江小南和他的小伙伴们引言nginx在传统的使用中,一般是作为反向代理或者负载均衡。但是它还有一个很优秀的能力常被人们所忽略。在kubernetes部署应用的过程中,会有大量的yaml等资源需要维护。集群内部维护起来不太方便,特…

Dubbo-go 优雅上下线设计与实践

简介:在分布式场景下,微服务进程都是以容器的形式存在,在容器调度系统例如 k8s 的支持下运行,容器组 Pod 是 K8S 的最小资源单位。随着服务的迭代和更新,当新版本上线后,需要针对线上正在运行的服务进行替换…

华为鸿蒙网络,这回真翻脸了?被谷歌“除名”,官宣鸿蒙手机版,华为:走着瞧...

与电脑系统类似,手机操作系统如今也已经被安卓和苹果的iOS瓜分殆尽,根据数据,安卓和iOS已经占据了手机操作系统99%以上的市场份额。不过由于iOS是苹果自研的封闭系统,所以在智能手机这么多年发展下来,也就自然地形成了…

SaaS服务的私有化部署,这样做最高效|云效工程师指北

简介:为了能够有效且高效地同时管理SaaS版本和私有化版本的发布过程,云效团队也结合云原生的基础设施和标准化工具(比如helm)进行了一系列的探索和实践,并将其中一些通能的能力进行了产品化。本文从问题本身出发&#…

阿里 BladeDISC 深度学习编译器正式开源

简介:随着深度学习的不断发展,AI模型结构在快速演化,底层计算硬件技术更是层出不穷,对于广大开发者来说不仅要考虑如何在复杂多变的场景下有效的将算力发挥出来,还要应对计算框架的持续迭代。深度编译器就成了应对以上…

浪潮“源”AI大模型如何求解数学应用题

编辑 | 宋慧 供稿 | 浪潮 “源1.0”大模型是浪潮信息发布的中文巨量模型,参数量高达2457亿,在中文语言能力理解和生成评测基准CUGE总榜中取得榜首,并获得语言理解(篇章级)、语言生成、对话交互、多语言、数学推理等5…

Quick BI产品核心功能大图(五)移动端:让数据在更多业务场景中流通

简介:将数据更好的融入日常工作中,一个重要的前提条件就是多端多渠道的数据触达和办公协同能力。 Quick BI凭借移动端交互体验,帮助用户随时随地便捷查看报表,并通过在线协同方式,追踪策略的执行落地。让数据在企业中流…

html5点击切换选项卡,简单纯js实现点击切换TAB标签实例

一个不需要jQuery实现的tab选项卡切换效果,代码简洁易用。默认是鼠标悬停显示tab效果,可将其中的onmouseover 修改为 onclick 点击效果使用方法:1、将附件中的index.html中的css样式以及代码部分拷贝到你需要的地方即可相关链接:几…

Dataphin产品核心功能大图(六)发布中心:生产和开发隔离模式下的保护伞

简介:Dataphin,用中台方法论打造企业级好数据。Dataphin是阿里巴巴集团OneData数据治理方法论内部实践的云化输出,一站式提供数据采、建、管、用全生命周期的大数据能力,以助力企业显著提升数据治理水平,构建质量可靠、…

当英特尔 OpenVINO 遇上微软 Azure,AI在边云协同的新方案

作者 | 宋慧 出品 | CSDN云计算 数字化浪潮下,越来越多的终端 IoT 设备接入网络,边缘的数据量与分析需求也随之增加。根据 Eclipse 对边缘负载的分析显示,人工智能是边缘计算中占比最高的负载之一,高于控制逻辑、数据分析等负载所…

工程设计论——如何写好工程代码

简介:设计是在对需求的认知不完整的情况下,对被设计对象进行求解的一个过程。这就迫使我们需要一边认识被设计对象,一边进行求解。为了并行化地进行这一过程,也为了使得对被设计对象地认识有初步的研究工具和基础,我们…

阿里云能耗宝即将发布,助力中小企业绿色升级,参与碳中和万亿市场

阿里云能耗宝新品发布会由阿里云-企业云服务-能耗云团队主办,将于2022年2月23号举行,本期发布会将为企业呈现“双碳”背景下的一站式服务。通过阿里云能耗宝,企业如何更加高效便捷地核算碳排放量、制定节能降碳方案、规划碳中和路径。 2020年…

鸿蒙关键技术研究,鸿蒙内核源码分析(静态链接篇) | 完整小项目看透静态链接过程 | 百篇博客分析HarmonyOS源码 | v54.02...

百篇博客系列篇.本篇为:下图是一个可执行文件编译,链接的过程.本篇将通过一个完整的小工程来阐述ELF编译,链接过程,并分析.o和bin文件中各区,符号表之间的关系.从一个崭新的视角去看中间过程,阅读之前建议先看准备工作先得有个小工程,麻雀虽小,但五脏俱全,标准的文件夹和Makefi…

敏捷研发项目,我们该如何度量?

简介:作为项目负责人,我们如何及时获悉当前项目的最新进展和问题,了解项目的整体状况?作为项目管理人员,我们如何跟进和推进项目的正常进行?如何借助云效效能洞察平台 Insight,帮助项目管理者及…

iofsstat:帮你轻松定位 IO 突高,前因后果一目了然 | 龙蜥技术

简介:磁盘被打满到底是真实的业务需求量上来了呢?还是有什么野进程在占用 IO? iofsstat 帮你精准定位。 编者按:sysAK(system analyse kit),是龙蜥社区系统运维 SIG 下面的一个开源项目&#x…