05.rocketmq源码分析后的一些整理

news2025/1/16 19:51:34

经过近3年的打磨,我们自研的企业基础应用框架基本成型,并且在多家规模企业中全面落地,从最新的统计数据来看,经过一年的上线应用,某省港集团在平台中管理的运营流程接近600/审批事项接近73w,业务消息量就更多了,整个体系以微应用的形式存在,形成了16大微应用集群来支撑整个系统的运转。这其中大量的服务协同就是由消息中间件转发完成。

rocketmq作为阿里开源的java版消息平台,确实值得抽时间分析下源码,不管怎样,转入了java方向后,有更多的组件在对我们开放,给了我们深入理解基础原理的机会。

rocketmq具体说明请参照源码中携带的doc项目,里边有完整的概念/架构/使用用例等内容。由于我们的平台当前集成的是rabbitmq,后续希望改造成可插拔式的集成方案,能根据客户的实际情况启用不同的消息中间件,最起码需要先集成rabbitmq与rocketmq。

基于我们的需求,我们将需要对相关组件的基本概念进行梳理:

    • rabbitmq:

1.1集群实现:

rabbitmq支持普通集群与镜像集群两种模式,具体内容请自行查找相关的具体方案。

1.2基本概念:

本章将以我们内部使用的概念为中心进行分析,详细概念请自行查阅相关内容。

1.2.1简单模型(主题模式)

1.2.2概念说明

  1. 生产者:生成消息应用,一般是业务系统,在需要发送相关消息时,调用rabbitmqsdk发送消息到rabbitmq 服务器。

  1. 消息主题:在发送消息时,消息模型中携带的主题信息。

  1. 交换机:当消息达到rabbitmq服务器后,将消息提交到交换机中,由交换机基于消息主题订阅绑定信息投递到相应的消息队列中。绑定的消息主题支持通配符,使相关的队列能分层接收相应主题的消息。

  1. 消息队列:基于消费者的订阅信息,形成不同的消息存储区域,保证消息的先进先出。一个消息队列可以基于主题的通配符能力,形成分级的消息主题订阅模式。

  1. 基于消息的应用场景:在我们的产品中,存在两类需要消息来驱动的事项,业务消息构建消息/业务编排消息。业务消息构建消息是为消息中心数据生成服务的,我们的平台采用了分布式业务消息构建,业务平台不直接关联消息中,而是作为消息生产者发送消息到消息中间件,再由消费者完成业务数据的填充后形成最终的业务消息存储到消息中心。业务编排消息是业务平台的一个分布式业务集成扩展点,当具体的业务需要基于业务编排消息驱动时,可以开发一个消息消费插件订阅相应的消息,实现业务平台的无感知平行延展.

  1. 消费者:基于相应的业务需要,订阅不同的消息主题与不同层次的消息主题,并实现具体的业务处理。在平台中我们构建了标准的消息消费插件,主要是用于生成业务消息的待办/已办/发起/通用消息的消费者标准插件。在业务推广过程中,如果需要基于业务编排消息完成事项驱动,将面向具体的业务定制相关的消费者插件。

  1. 数据存储:数据按照队列进行存储。

  1. 多库支持:采用虚拟路径来区域不同的存储库。

1.3我们的具体使用:

我们在业务平台中开放了业务消息与业务编码消息的发送工序,最终形成了标准消息消费插件+业务定制消费插件。完成了消息中心数据生成/流程流转过程中业务分布式集成方案。工作流库终于完全独立,正面向企业统一流程平台发展。

    • rocketmq:

2.1集群实现:

rocketmq在大数据需求下诞生,原始架构中就支持集群部署。

命名服务+代理服务的组合模式,让消息存储形成了天然分区存储,需要的时候可以平行扩展代理服务来支撑更大的数据处理需求。

2.2基本概念

2.2.1架构图

2.2.2概念说明

  1. 生产者:业务系统,当需要发送消息时,调用Rocketmq客户端发送消息到broker中。在我们的产品中主要时工作流平台/业务服务平台。

  1. 消息者:基于消息的驱动插件,根据业务系统的需求,对消息的消费并驱动业务推进。在我们的产品中主要是标准服务组件/定制服务组件等。消息者有消费模式,用于是集群消费还是广播消费。

  1. 消息主题:用于区分消息的内容,rocketmq中主要用主题来区分消息。

  1. 消息Tags:消息的一个扩展,可以用于控制特定主题消息队列下的特定范围消费。消息主题与消息tags的组合可以实现Rabbitmq的消息主题通配符能力。

  1. 命名空间:类似于Rabbitmq的虚拟路径,用于对消息进行隔离。

  1. NameServer:

  1. Broker Server:消息服务节点,

  1. IndexFile:

  1. CustumeQueueIndex: 特定消费主题队列索引,Rabbitmq为了节省消息存储空间,消息采用了标准块存储,对外使用采用索引文件进行管理。

  1. Store:

2.3我们可能应用

基于我们的需要,我们可能需要在Rabbitmq的基础上进行一定的调整,这种调整主要是rocketMQ的topic不支持通配符订阅,但提供了Tags的过滤方案。其他的内容基本一致,整体来看引入成本并不太高。重新开放与定义我们的消息基础spi,再基于不同的消息中间件进行适配即可。

    • 使用对比

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

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

相关文章

SSM02 Spring 注解开发 AOP Spring整合-事务

19-注解开发定义bean3.2 注解开发定义bean在上述环境的基础上&#xff0c;我们来学一学Spring是如何通过注解实现bean的定义开发?步骤1:删除原XML配置将配置文件中的<bean id"bookDao" class"com.itheima.dao.impl.BookDaoImpl"/>标签删除掉步骤2:D…

麒麟操作系统iso文件中的img文件的解压与压缩

近日考虑到要制作适用PXE的引导麒麟系统&#xff0c;所以需要对iso中的img文件做适当调整。本文将介绍如何解压压缩麒麟系统的img文件。 一、了解vmlinuz和initrd.img文件 vmlinuz&#xff1a;系统内核文件&#xff0c;编译而成。initrd.img&#xff1a;是一个小的文件系统&a…

【redis6】第四章(配置文件)

自定义目录&#xff1a;/etc/redis.conf Units单位 配置大小单位,开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit&#xff0c;大小写不敏感。 # Redis configuration file example. # # Note that in order to read the configuration file, Re…

D3.js基础教程

D3: Data-Driven Documents D3 (或D3.js)是一个JavaScript库&#xff0c;用于使用Web标准可视化数据。 D3帮助您使用SVG&#xff0c;Canvas和HTML使数据栩栩如生。 D3将强大的可视化和交互技术与数据驱动的DOM操作方法相结合&#xff0c;为您提供现代浏览器的全部功能&#xf…

【owt-server】RtpTransportControllerSend的创建和使用

owt-server 5.0 【owt-server】librtcadapter: VideoSendAdapterImpl 视频发送侧及mia 调用分片发送H264帧只是简单的发送发送侧必须有一套传输控制机制这套机制还需要接收测联动。发送侧 NonPacedSender bool VideoSendAdapterImpl::init() 创建 需要首先创建m_transportCont…

如何判断一个数据库是不是出问题了?

我在前面文章中,和你介绍了主备切换流程。通过这些内容的讲解,你应该已经很清楚了:在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。 主备切换有两种场景,一种是主动…

Linux系统编程——线程

守护进程 守护进程: daemon进程。通常运行与操作系统后台&#xff0c;脱离控制终端。 一般不与用户直接交互。 周期性的等待某个事件发生或周期性执行某一动作。 不受用户登录注销影响。 通常采用以a结尾的命名方式。守护进程创建步骤; fork子进程&#xff0c;让父进程终止。…

年轻人的颜值担当,当下正流行的开关面板设计,你pick哪一款?

在颜值即正义的时代 越来越多的年轻人选择产品时 除了关注产品的功能外 也愈加愿意为产品的颜值买单近年来&#xff0c;鸿雁从大自然和生活中汲取灵感 以年轻、新鲜、现代的设计风格 赋予开关面板更有格调的外形 引领了墙面上的家居美学 下面&#xff0c;小雁带大家一起从鸿雁热…

微服务调用组件Feign的原理及高级功能实战

目录 一、Fegin的原理 二、Spring Cloud 整合Feign 三、Spring Cloud整合Dubbo 微服务调用组件Feign的原理及高级功能是我们今天分享的主题&#xff0c;此组件可以说是微服务必用的&#xff0c;服务远程调用&#xff0c;属于RPC远程调用的一种&#xff0c;RPC 全称是 Remote …

如何划分子网(例题讲解)

44(12分)设某ISP拥有一个网络地址块201.123.16.0/21,现在该ISP要为A、B、C、D四个组织分配IP地址,其需要的地址数量分别为985、486、246以及211,而且要求将低地址段的 IP 地址分配给 IP 地址需求量大的组织。请给出一个合理的分配方案以满足该需求。要求将各组织所获得的子网地…

2023年,推荐10个让你事半功倍的CSS在线生产力工具

谈到 CSS&#xff0c;您总是必须编写许多代码行&#xff0c;才能使您的项目在样式方面看起来美观大方。当然&#xff0c;专注于为前端编写好的 CSS 很重要&#xff0c;但这个过程可能会花费很多时间。作为 Web 开发人员&#xff0c;CSS 是我们开展项目时必不可少的语言之一。我…

从GPT到chatGPT(一):GPT1

GPT1 文章目录GPT1前言正文模型架构无监督学习有监督学习处理不同特定任务实验训练细节实验结果分析预训练层参数转移的影响zero-shot的表现消融实验总结前言 GPT1&#xff0c;出自于OpenAI的论文《Improving Language Understanding by Generative Pre-Training》&#xff0c…

Serverless介绍

Serverless架构应该是采用FaaS&#xff08;函数即服务&#xff09;和Baas&#xff08;后端即服务&#xff09;服务来解决问题的一种设计 狭义Serverless FaaS BaaS BaaS: Bakend as a Service 负责存储后端即服务&#xff1a;Serverless把后端架构工作包揽下来&#xff0c;硬…

CIO如何控制老板提需求?CIO PLUS

老板乱提需求&#xff0c;员工苦不堪言&#xff0c;职场中经常听到吐槽老板的言论&#xff0c;这个话题很有意思。因为一般老板这个角色基本上是不会管公司具体业务的&#xff0c;公司运营一般都是由专业的职业经理人就是CEO来管理&#xff0c;所以作为公司的老板就更不可能亲自…

Web(五)

JavascriptDOM* 功能&#xff1a;控制html文档的内容* 获取页面标签(元素)对象&#xff1a;Element* document.getElementById("id值"):通过元素的id获取元素对象* 操作Element对象&#xff1a;1. 修改属性值&#xff1a;明确获取的对象是哪一个&#xff1f;查看API文…

【SpringCloud06】SpringCloud Eureka 服务注册与发现

1.Eureka基础知识 1.1什么是服务治理&#xff1f; Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理 在传统的rpc远程调用框架中&#xff0c;管理每个服务与服务之间依赖关系比较复杂&#xff0c;管理比较复杂&#xff0c;所以需要使用服务治理&#xff0…

Linux - top命令详解

目录top启动参数基础字段说明第一行&#xff0c;系统任务统计信息&#xff1a;第二行&#xff0c;进程统计信息&#xff1a;第三行&#xff0c;CPU统计信息&#xff1a;第四行&#xff0c;内存统计信息&#xff1a;第五行&#xff0c;swap交换分区统计信息&#xff1a;第六行&a…

堆和栈详解js

认识堆和栈学习编程的时候&#xff0c;经常会看到stack这个词&#xff0c;它的中文名字叫做"栈"。理解这个概念&#xff0c;对于理解程序的运行至关重要。容易混淆的是&#xff0c;这个词其实有几种含义在理解堆与栈这两个概念时&#xff0c;需要放到具体的场景下去理…

基于java SSM图书管理系统简单版设计和实现

基于java SSM图书管理系统简单版设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源码联系方式…

软件测试/测试开发 | Jenkins通过什么方式报警?

在工作中&#xff0c;一般是没有时间一直看着 Jenkins 直到它运行结果出现的。所以采用了配置 Email 的方式&#xff0c;可以及时将结果通知给我们。 所需要用到的Jenkins插件 需要下载的 Email 插件名称&#xff0c;这两个插件的作用是帮助用户方便的设置格式化邮件&#xf…