[5.0] 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代码架构如下:


image.png


这个代码架构和Broker的代码结构非常接近, 下面对代码包进行简单说明:

  • common:存放一些通用工具, 通用接口,错误码,上下文定义等
  • config:存放Proxy配置,包含最主要配置ProxyConfig定义
  • grpc:定义了grpc服务端,grpc拦截器定义
  • processor:定义了rocketmq各种请求的处理器,比如DefaultMessagingProcessor定义和实现了发送消息、查询订阅关系等功能
  • service:处理grpc网络请求服务,元数据同步管理服务等
  • CommandLineArgument:命名行启动Proxy时传递的参数值定义,主要包含:
  • 6.1 namesrvAddr:namesrv地址
  • 6.2 brokerConfigPath:broker配置地址
  • 6.3 proxyConfigPath:Proxy配置文件地址,名字叫rmq-proxy.json,一般放在${ROCKET_HOME}/rmq-proxy.json
  • 6.4 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可以看到如下:

image.png

启动后,我们发现没有Broker进程, 但是有一个Broker可以注册到Namesrv:

image.png


这是为什么呢, 我们带着问题去看看Proxy是如何启动的吧。

启动入口类是 : org.apache.rocketmq.proxy.ProxyStartup, 入口main如下非常简单,笔者把整个过程分为4个小段,具体介绍如下。


image.png


  • 第一,初始化命令行参数。将命令行参数转化为配置对象,包含Proxy配置、环境变量、日志配置、延迟级别配置。
  • 第二,初始化GRPC Server线程池和线程池监控。
  • 第三,初始化一个业务处理器、GRPC Server,并添加到PROXY_START_AND_SHUTDOWN列表中统一管理。 如果是本地模式,这里面会引用Broker模块,使用BrokerStartup启动一个内嵌Broker。(Proxy和Broker同进程)。

MessagingProcessor就是一个处理器接口,里面定义了Pop消息方法、发送消息方法等。

image.png

  • 第四,启动全部服务,包含GRPC Server,注册JVM Shutdown Hook。



三、RocketMQ Proxy是如何处理请求的呢?

image.png

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实现发送、消费等业务。





相关实践学习
消息队列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
相关文章
|
11月前
|
消息中间件 Java Apache
RocketMQ5.0 搭建 Name Server And Broker+Proxy 同进程部署、搭建RocketMQ控制台图形化界面
RocketMQ5.0 搭建 Name Server And Broker+Proxy 同进程部署、搭建RocketMQ控制台图形化界面
1224 0
|
3月前
|
消息中间件 网络协议 RocketMQ
消息队列 MQ产品使用合集之broker开启proxy,启动之后producer生产消息始终都只到一个broker,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 网络安全 开发工具
消息队列 MQ产品使用合集之使用grpc proxy,生产者心跳并没有发送至Default中,如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 RocketMQ Apache
消息队列 MQ产品使用合集之如何修改proxy的端口
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
4月前
|
消息中间件 Kubernetes Java
MQ产品使用合集之RocketMQ发消息失败了,proxy报connect to null failed如何解决
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
564 2
MQ产品使用合集之RocketMQ发消息失败了,proxy报connect to null failed如何解决
|
3月前
|
消息中间件 Java Shell
消息队列 MQ产品使用合集之启动broker&proxy的时候会报错,该怎么办
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 存储 RocketMQ
消息队列 MQ产品使用合集之Remoting协议是否可以直接和proxy交互的吗
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
3月前
|
消息中间件 存储 对象存储
消息队列 MQ产品使用合集之对于RocketMQ Proxy GRPC消息重发,该怎么解决
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
4月前
|
消息中间件 监控 Java
在RocketMQ中,Proxy的gRPC参数调优是一项重要的性能优化工作
在RocketMQ中,Proxy的gRPC参数调优是一项重要的性能优化工作【1月更文挑战第10天】【1月更文挑战第46篇】
79 2
|
消息中间件 网络安全 RocketMQ
这个错误可能是由于RocketMQ Proxy的配置或者运行状态出现了问题
这个错误可能是由于RocketMQ Proxy的配置或者运行状态出现了问题
192 1

热门文章

最新文章