春

春夏秋冬平平安安

A text-focused Halo theme

  • 首页
  • 关于
主页 RocketMQ proxy
文章

RocketMQ proxy

发表于 26天前 更新于 22天前
作者 Administrator
17~21 分钟 阅读

RocketMQ proxy 是什么

为了向云原生演进,提高资源利用和弹性能力,RocketMQ 在 5.0 进行了架构的调整与升级,先来看新特性之一,增加了 Proxy 层。

  1. 增加 Proxy 代理层
    计算存储分离
    计算存储分离是一种分层架构,将计算层与存储层分开。
    计算层指的是一些消耗计算资源的功能模块比如协议解析、消费管理等,存储指的是数据存储层,比如数据的存储格式、存储设计等与数据存储相关的功能。

  2. 应用通信协议
    应用通信协议一般会包含协议头和协议体两部分。
    协议头:主要是一些通用的信息,比如协议版本、请求标识、客户端信息等;
    协议体:本次通信具体的数据内容,规定了数据的传输格式,比如数据是字符串、JSON格式数据或者二进制数据等;

RocketMQ 5.0 以前架构
RocketMQ 5.0以前使用自定义的Remoting协议底层基于Netty进行网络通信,计算存储是一体的,都在Broker中,生产者和消费者从NameServer中拉取到路由信息,之后直接与Broker交互进行消息的生产与消费:



存在问题
(1)计算层和存储层都在 Broker 中,没有进行分离,不利于在云原生环境下实现弹性调度;
(2)Remoting 协议是私有协议,每支持一种新的语言,一些基础的工作(比如网络通信、编解码)都需要重新开发,开发和维护成本高;

RocketMQ 5.0 架构
5.0 以后引入了弹性无状态的代理模式,对 Broker 的职责进行了拆分,将客户端协议适配、权限管理、消费管理等计算逻辑进行了抽离,放入 Proxy 层,Broker 专注数据的存储,以便更好的适应云原生环境,实现资源弹性调度,并且 5.0 以后增加了 gRPC(Google Remote Procedure Call)协议的支持,它是 Google 开源的高性能 RPC 框架,基于 Protobuf 序列化。


从架构上来看,增加 Proxy 代理层后,生产者和消费者不再直接与 Broker 通信,而是与 Proxy 层通信,Proxy 层再与 NameServer 和 Broker 交互进行消息的发送和消费,如果需要提高计算层的能力,只需要增加 Proxy 层,如果需要提高存储层的能力,增加 Broker 的部署即可。

gRPC 协议是公有协议,底层已经实现了网络通信、编解码等基础框架,提供了各个语言的开发库,使用非常轻便,在 RocketMQ 新增语言支持时可以省去繁杂重复的工作。

部署方式

Apache RocketMQ 5.0 版本完成基本消息收发,包括 NameServer、Broker、Proxy 组件。 在 5.0 版本中 Proxy 和 Broker 根据实际诉求可以分为 Local 模式和 Cluster 模式,一般情况下如果没有特殊需求,或者遵循从早期版本平滑升级的思路,可以选用Local模式。

在 Local 模式下,Broker 和 Proxy 是同进程部署,只是在原有 Broker 的配置基础上新增 Proxy 的简易配置就可以运行。
在 Cluster 模式下,Broker 和 Proxy 分别部署,即在原有的集群基础上,额外再部署 Proxy 即可。

1. Local 模式

由于 Local 模式下 Proxy 和 Broker 是同进程部署,Proxy本身无状态,因此主要的集群配置仍然以 Broker 为基础进行即可。需要先启动 nameserver 集群。
这里面分两种配置方法,
第一种,在原有 broker 的启动命令后添加 --enable-proxy ,同时需要用 -n 指定 nameserver 的地址,proxy 需要从 nameserver 发现 broker,默认使用 8081 作为 grpc 的端口。

sh ./mqbroker -n basic-service-rocketmq-namesrv:9876 -c broker.properties autoCreateTopicEnable=true --enable-proxy

第二种,修改 proxy 的配置文件 rmq-proxy.json 更加灵活的定制组件。

sh ./mqbroker -c broker.properties autoCreateTopicEnable=true --enable-proxy
cat rmq-proxy.json
{
  "rocketMQClusterName": "DefaultCluster",                 // 集群名称
  "grpcServerPort": 9878,                                  // grpc 端口
  "remotingListenPort": 8080,                              // remoting 协议的端口
  "namesrvAddr": "basic-service-rocketmq-namesrv-hl:9876", // nameserver 的地址
}

Cluster 模式部署

在 Cluster 模式下,Broker 与 Proxy 分别部署,我可以在 NameServer 和 Broker 都启动完成之后再部署 Proxy。
在 Cluster 模式下,一个 Proxy 集群和 Broker 集群为一一对应的关系,可以在 Proxy 的配置文件 rmq-proxy.json 中使用 rocketMQClusterName 进行配置

apiVersion: apps/v1
kind: Deployment
metadata:
  name: basic-service-rocketmq-proxy
  namespace: basic-service-rocketmq
spec:
  replicas: 1
  selector:
    matchLabels:
      app: basic-service-rocketmq-proxy
  template:
    metadata:
      labels:
        app: basic-service-rocketmq-proxy
    spec:
      containers:
        - name: basic-service-rocketmq-proxy
          image: apache/rocketmq:5.3.0
          command: ["sh","mqproxy"]
          env:
            - name: TZ
              value: Asia/Shanghai
            - name: NAMESRV_ADDR
              value: basic-service-rocketmq-namesrv-0.basic-service-rocketmq-namesrv-hl:9876
            - name: JAVA_OPT_EXT
              value: "-server -Xms512m -Xmx1024m -Xmn256m"
          ports:
            - name: grpc
              containerPort: 9878
          volumeMounts:
            - name: time
              mountPath: /etc/localtime
              readOnly: true
            - name: logs
              mountPath: /home/rocketmq/logs
            - name: store
              mountPath: /home/rocketmq/store
            - name: proxy-conf
              mountPath: /home/rocketmq/rocketmq-5.3.0/conf/rmq-proxy.json
          startupProbe:
            tcpSocket:
              port: 9878
            failureThreshold: 30
            periodSeconds: 10
          livenessProbe:
            tcpSocket:
              port: 9878
      volumes:
        - name: time
          hostPath:
            path: /etc/localtime
            type: File
        - name: logs
          hostPath:
            path: /data/rocketmq/broker/logs
            type: DirectoryOrCreate
        - name: store
          hostPath:
            path: /data/rocketmq/broker/store
            type: DirectoryOrCreate
        - name: proxy-conf
          hostPath:
            path: /data/rocketmq/rmq-proxy.json
            type: File
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - topologyKey: kubernetes.io/hostname
              labelSelector:
                matchLabels:
                  app: basic-service-rocketmq-proxy

rmq-proxy.json 的配置与 Local 部署方式一致

{
  "rocketMQClusterName": "DefaultCluster",                 // 集群名称
  "grpcServerPort": 9878,                                  // grpc 端口
  "remotingListenPort": 8080,                              // remoting 协议的端口
  "namesrvAddr": "basic-service-rocketmq-namesrv-hl:9876", // nameserver 的地址
}

许可协议:  CC BY 4.0
分享

相关文章

下一篇

凝思操作系统开启系统日志

上一篇

达梦数据库主备集群搭建

最近更新

  • kafka Kraft模式k8s集群搭建
  • 达梦数据库主备集群搭建
  • RocketMQ proxy
  • 凝思操作系统开启系统日志
  • kubernetes学习记录

热门标签

Halo

目录

©2025 春夏秋冬平平安安. 保留部分权利。

使用 Halo 主题 Chirpy