How RocketMQ Proxy Startup?
本文分享RocketMQ Proxy是如何启动的,代码基于
https://github.com/apache/rocketmq/tree/release-5.0.0
一、RocketMQ Proxy是什么,代码架构如何?
RocketMQ Proxy是一个RocketMQ Broker的代理服务,支持客户端用GRPC协议访问Broker。
RocketMQ Proxy主要解决了4.9.X版本客户端多语言客户端(c/c++, golang, csharp,rust,python, nodejs)实现Remoing协议难度大、复杂、功能不一致、维护工作大的问题。
RocketMQ Proxy使用业界熟悉的GRPC协议, 各个语言代码统一、简单,使得多语言使用RocketMQ更方便、容易。
RocketMQ Proxy代码架构如下:
这个代码架构和Broker的代码结构非常接近, 下面对代码包进行简单说明
- common
存放一些通用工具, 通用接口,错误码,上下文定义等
- config
存放Proxy配置,包含最主要配置ProxyConfig定义
- grpc
定义了grpc服务端,grpc拦截器定义
- processor 定义了rocketmq各种请求的处理器,比如DefaultMessagingProcessor定义和实现了发送消息、查询订阅关系等功能
- service 处理grpc网络请求服务,元数据同步管理服务等
- CommandLineArgument 命名行启动Proxy时传递的参数值定义,主要包含:
namesrvAddr:namesrv地址
brokerConfigPath:broker配置地址
proxyConfigPath:Proxy配置文件地址,名字叫rmq-proxy.json,一般放在${ROCKET_HOME}/rmq-proxy.json
proxyMode:Proxy启动模式,主要包含本地和集群模式
- ProxyMode:proxy模式枚举,包含:LOCAL,CLUSTER
- ProxyStartup:和BrokerStartup一样,是Proxy的启动入口类
二、RocketMQ Proxy是如何启动的?
一般我们通过以下命令启动一个RocketMQ Proxy。
sh bin/mqbroker -n localhost:9876 --enable-proxy
笔者在本地启动了一个Namesrv、一个Proxy、一个Dashboard, 通过jps可以看到如下:
启动后,我们发现没有Broker进程, 但是有一个Broker可以注册到Namesrv:
这是为什么呢, 我们带着问题去看看Proxy是如何启动的吧。
启动入口类是 : org.apache.rocketmq.proxy.ProxyStartup, 入口main如下非常简单,笔者把整个过程分为4个小段,具体介绍如下。
第一,初始化命令行参数。将命令行参数转化为配置对象,包含Proxy配置、环境变量、日志配置、延迟级别配置。
第二,初始化GRPC Server线程池和线程池监控。
第三,初始化一个业务处理器、GRPC Server,并添加到PROXY_START_AND_SHUTDOWN列表中统一管理。
如果是本地模式,这里面会引用Broker模块,使用BrokerStartup启动一个内嵌Broker。(Proxy和Broker同进程)
MessagingProcessor就是一个处理器接口,里面定义了Pop消息方法、发送消息方法等。
第四,启动全部服务,包含GRPC Server,注册JVM Shutdown Hook。
三、RocketMQ Proxy是如何处理请求的呢?
RocketMQ Proxy处理请求主要分为两步。
第一步, 客户端通过grpc协议访问RocketMQ Proxy。这个是由既定的协议确认的, 接口定义在 https://github.com/apache/rocketmq-apis/tree/main/apache/rocketmq/v2
第二步,Proxy内部封装调用。从GrpcMessagingApplication到XXXXX Service。这里面是典型的接口实现方式,代码也非常简单。
第三步,XXXXX Service调用Broker。
如果Proxy启动Local模式, 则是通过BrokerController对象调用Broker的方法实现发送、消费等业务;
如果Proxy启动Cluster模式,则是通过RemotingClient访问Broker实现发送、消费等业务。
相关文章
- iPad 建模 | 三维形象创意指南
- 万千星辉,百般精彩!斗罗大陆创意设计大赛获奖作品展示!
- 腾讯云 CODING 首批加入信通院云上软件工程社区汽车云工作组,加速车企软件质量效能双重变革
- 2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串。 返回s
- RTSP、RTMP播放器拉到的视频图像角度不对怎么办?
- 掌握 Jetpack Compose 中的 State,看这篇就够了
- RouterOS 使用CloudFlare动态更新 DDNS脚本
- postimages
- vue重置data
- SpringBoot Security密码加盐
- Spring中@Conditional通过条件来控制bean的注册
- 代码挑战画 魔法圣诞树
- AiFlow大数据框架应用简介
- SAP UI5 里 FlexBox 的使用方法
- SAP UI5 加载本地并不存在的 PDF 文件的错误处理
- SAP Product Lifecycle Costing 里的 Costing Sheet 成本核算表
- SAP ERP 里的 Costing Sheet 成本核算表
- SAP UI5 Smart control 的 Page Variant Management
- SAP UI5 Smart Chart 功能介绍
- 世界杯已开赛,哪些看球设备让你觉得身临其境?