第一次尝试为Apache顶级开源项目贡献代码

简介: 第一次尝试为Apache顶级开源项目贡献代码

本文首先先再次回到上述几篇关于公司升级ACL这个事情上来,通常涉及到服务器版本的升级,一旦涉及到版本的升级,兼容性测试是一个必不可少的工作。


RocketMQ客户端版本众多,并且RocketMQ的多语言生态逐渐完善,客户端目前已支持C++、.Net、Go、Python等主流编程语言,服务端版本的升级,其兼容性如何能充分考虑现有情况呢?


结合公司的实际,公司主要的技术栈以Java为主,但Python,Go等技术栈在某些部门也有使用,那如何通过技术手段获取待升级集群所有的客户端连接方式就显得非常重要

通过细心留意RocketMQ提供的运维命令,我们可以得知官方提供了如下两个命令用于查看客户端的连接信息:


  • producerConnection
    用于查看消息发送者的客户端连接信息
  • consumerConnection
    用于查看消息消费者的客户端连接信息


温馨提示:我们可以通过如下命令获取RocketMQ支持的所有运维命令,每一个运维命令使用 -h 即可获取该命令的帮助指南。

sh ./mqadmin   // 该命令会罗列所支持的运维命令列表即概要说明,如下图所示:

47c46268b1aaea0cb9d0f809666c5dc9.png


1、官方命令及其缺陷


看到曙光了,接下来先简单介绍一下官方提供的命令与使用详解。


1.1 producerConnection概述


da55123d8ac030a7fdf7542d16808e8b.png

其参数说明如下:


  • -n name server 服务器地址
  • -g
    生产者组名称
  • -t
    topic名称,值得说明的是这个topic的作用并不是必须传入生产者组对应的消息发送topic,而是用于路由寻址,即该命令需要发送到哪些Broker上执行。


基本的使用示例如下:

c6d1c3920db7e70504b5601c232a9830.png

输出列依次为序号、客户端ID(clientId)、客户端IP与端口号、客户端语言、客户端版本。


上述功能非常实用,但在实际的使用过程中,特别是开源版本的MQ,生产者组的概念比较弱化,在运维层面也不向消费者组这样可管控,故这个命令中的 -g 参数,其实在实际过程中要统一采集就变的非常困难,而且RocketMQ并没有提供一个获取所有生产者组的功能,从而无法通过脚本化语言迅速提取相关信息。


在介绍如何解决该问题后,我们继续看一下获取消费组相关的信息。


1.2 consumerConnection概述


通过consumerConnection可以获取消费组的相关信息,其使用示例如下:

2d7ea066208c3fc463ea839b1f26b86e.png

由于消费组在实际生产中都会加以控制,并且是可运维的(可以关闭自动创建消费组,项目组只有申请后才可使用),并且尽管rocketmq同样没有提供获取消费组列表的命令,但提供了对应的API。


可以通过rocketmq-console中提供的命令,获取所有的消费组列表,然后遍历并依次通过命令提取消费组的详情,从而可以得知当前集群所有的客户端连接方式,对兼容性缩写测试范围打下坚实基础。


2、解决方案


通过上面的介绍得知由于开源版本的RocketMQ弱化了生产者组(Producer Group)的概念,目前只有在事务消息时会被使用到,故在实际生产实践过程中发现无法实现对生产者组进行强管控,比较难获取集群中当前所有的生产者信息。


为了解决版本升级需要进行兼容性测试缩写测试范围的问题,我们希望能够有一个运维命令,能够获取当前集群中所有的客户端连接信息。


那我们能否定制化一个运维命令实现获取所有生产者的连接信息,既然官方提供了producerConnection命令获取单个生产者组信息,服务端应该是会存储所有生产者组的连接信息,只是官方没有提供相关的命令而已,为了验证,我们可以去看一下producerConnection命令在服务端的处理逻辑。

f6360bc5a8bce696b1b2061d3d0b490f.png


从服务端代码可知,在服务端会使用一个Map存储所有的生产者客户端连接,其键为生产者组名称,其值为Map键值对(通道对象(Channel),客户端信息(ClientChannelInfo)),其中客户端信息就包含了客户端ID,客户端使用的语言以及版本等信息。


经过上面分析,实现一个获取全部生产者连接信息将变得非常简单。


本文由于篇幅问题,不展示全部代码,主要总结一下开发一个RocketMQ的几个核心步骤,代码已提交到github仓库:


链接:https://github.com/apache/rocketmq/pull/2940


首先我们看一下该命令在IDEA中的测试效果,运行命令如下:

2ef514fa2d046af30393f7cd1aa181ea.png

命令运行输出为:

a1419f1b74d90dfced3bb888a511811d.png

打包部署后命令的使用说明如下:

1f60e2c96828adb3b85fbaae1ecb4286.png

其中-b broker地址与-c cluster集群名称两个参数二选一,主用用于路由。

编写一个RocketMQ运维命令通常具备如下几个要点:


  • 创建自己的命令处理类,并在MQAdminStartup中调用initCommand初始化命令。
  • 定义命令请求CODE,RocketMQ为每一个请求定义了对应的RequestCode。
  • 在Broker端的AdminBrokerProcessor中添加对该请求Code的处理逻辑


为了更加形象完整的展示开发一个运维命令,我将本次提交记录截图展示给大家:

f0050ddce011e5aee54e27f112be678d.png


相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
6月前
|
消息中间件 Kafka Apache
Apache Flink 是一个开源的分布式流处理框架
Apache Flink 是一个开源的分布式流处理框架
775 5
|
11天前
|
消息中间件 监控 数据可视化
Apache Airflow 开源最顶级的分布式工作流平台
Apache Airflow 是一个用于创作、调度和监控工作流的平台,通过将工作流定义为代码,实现更好的可维护性和协作性。Airflow 使用有向无环图(DAG)定义任务,支持动态生成、扩展和优雅的管道设计。其丰富的命令行工具和用户界面使得任务管理和监控更加便捷。适用于静态和缓慢变化的工作流,常用于数据处理。
Apache Airflow 开源最顶级的分布式工作流平台
|
15天前
|
Java Apache C++
别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码
Thrift 是一个轻量级、跨语言的远程服务调用框架,由 Facebook 开发并贡献给 Apache。它通过 IDL 生成多种语言的 RPC 服务端和客户端代码,支持 C++、Java、Python 等。Thrift 的主要特点包括开发速度快、接口维护简单、学习成本低和多语言支持。广泛应用于 Cassandra、Hadoop 等开源项目及 Facebook、百度等公司。
别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码
|
15天前
|
存储 SQL Apache
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
Apache Doris 是一个基于 MPP 架构的高性能实时分析数据库,以其极高的速度和易用性著称。它支持高并发点查询和复杂分析场景,适用于报表分析、即席查询、数据仓库和数据湖查询加速等。最新发布的 2.0.2 版本在性能、稳定性和多租户支持方面有显著提升。社区活跃,已广泛应用于电商、广告、用户行为分析等领域。
Apache Doris 开源最顶级基于MPP架构的高性能实时分析数据库
|
1月前
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
35 0
|
3月前
|
关系型数据库 MySQL 应用服务中间件
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
这篇文章介绍了如何在Windows 7系统上搭建PHP、MySQL和Apache环境,并部署ECShop项目,包括安装配置步骤、解决常见问题以及使用XAMPP集成环境的替代方案。
56 1
win7系统搭建PHP+Mysql+Apache环境+部署ecshop项目
|
2月前
|
Apache
多应用模式下,忽略项目的入口文件,重写Apache规则
本文介绍了在多应用模式下,如何通过编辑Apache的.htaccess文件来重写URL规则,从而实现忽略项目入口文件index.php进行访问的方法。
|
3月前
|
Java 应用服务中间件 Apache
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
本文介绍了在IntelliJ IDEA中修改Web项目访问路径的步骤,包括修改项目、模块、Artifacts的配置,编辑Tomcat服务器设置,以及解决Apache Tomcat控制台中文乱码问题的方法。
218 0
使用IDEA修改Web项目访问路径,以及解决Apache Tomcat控制台中文乱码问题
|
3月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
104 0
|
3月前
|
关系型数据库 Linux 网络安全
"Linux系统实战:从零开始部署Apache+PHP Web项目,轻松搭建您的在线应用"
【8月更文挑战第9天】Linux作为服务器操作系统,凭借其稳定性和安全性成为部署Web项目的优选平台。本文以Apache Web服务器和PHP项目为例,介绍部署流程。首先,通过包管理器安装Apache与PHP;接着创建项目目录,并上传项目文件至该目录;根据需要配置Apache虚拟主机;最后重启Apache服务并测试项目。确保防火墙允许HTTP流量,正确配置数据库连接,并定期更新系统以维持安全。随着项目复杂度提升,进一步学习高级配置将变得必要。
331 0

推荐镜像

更多