2011shenlin commented on issue #134: URL: https://github.com/apache/rocketmq-eventbridge/issues/134#issuecomment-1694957038
## 问题背景 当订阅规则增加时,单个运行时worker无法支持,需要添加更多worker同时提供服务。这里有几个关键问题: - 现有系统需要多少Worker? - 如何管理这些worker的生命周期? - 如何给Worker分配任务才能最大化性能? - 如何实现弹性伸缩? - 如何实现不同任务之间的隔离? - …… ## 整体架构设计  ## 引入 Runner Task 当在规则中创建一个Target订阅时,EventBridge会为每个任务创建一个Target Runner,用来描述当前这个Target订阅的运行态信息,详细信息可以参考表 event_target_runner:  但是目前的方式存在几个问题: - 所有的Target Runner 默认都运行在一个Worker节点上; - 无法实现不同Worker,运行不同的Target Runner; - 无法支持同一个Target Runner,在多个Worker上同时运行; 为了解决这个问题,我们在DB中,以声明的方式,引入表:event_runner_task  其中cluster_id、worker_id 指名了当前runner_name运行的集群信息和Worker信息: ## 虚拟Cluster 管理 Cluster 是一个虚拟的概念,用来标注同一类Worker,这类Worker拥有相同的资源配置,镜像版本等。引入Cluster的目的主要包括: - 资源隔离:不同的Cluster管理不同规模的Worker,同一个Target Runner只能分配到一个Cluster中的一个或多个Worker上; - 方便Worker管理:Worker的生命周期管理,以Cluster为粒度,我们可以Cluster方便的升级该Cluster下所有的Worker;也可以通过Cluster来控制Worker的数量; 为此,我们需要在DB中,同样以声明的方式,引入一张表 event_cluster:  ## Worker管理 Worker和Runtime的区别是:Runtime代表软件的运行时,而Worker是Runtime运行时的资源节点。这个关系类似进程和系统之间的关系。理论上,一个Worker可以包含多个Runtime,但是为了简化模型,常常一个Worker只包含一个Runtime进程。 为了方便worker的管理,我们在DB中引入一张表event_worker:  ## 如何创建Worker #### 方式1: 直接注册物理Node到event_worker表中 - 当有新的Node加进来时,只需要注册到event_worker表,配置IP地址; - 前提条件:新增的Node和现有集群在同一个网络中; #### 方式2: 通过K8S创建资源节点 - 创建Depolyment, 默认replica为1:  ## Worker如何获取被分配的Runner Task Runtime支持文件、API的方式加载Task配置,对应的我们有几种方式让Worker获取被分配的Runner Task: - 方式1:Manager主动将Task 配置分发给Worker - 比如通过K8S configMap,将Task配置以文件的形式挂载到Pod某个文件目录 - 方式2: 通过Manager与Worker的通信 ## 如何升级Worker的镜像版本 方式1: 如果是Node直接注册的Worker,则由客户自己管理和维护Worker的镜像 方式2: 如果是通过K8S创建的Worker,则由系统负责worker的镜像升级 - event_images  发布流程: - 镜像发布时,在connect_images添加新发布的镜像版本,通过upper_limit限制本次发布更新的cluster数量; - conductor定时JOB,每隔1分钟,扫描connect_cluster表,判断当前cluster是否需要更新: - 首先,判断当前cluster指定了expect_image_id,如果指定了,则优先更新到此镜像版本。 - 否则,镜像更新到最新版本,但是必须同时满足: - 当前cluster对应的imageId不是最新的; - 当前cluster的升级优先级高于其他cluster; - upper_limit为达到上限; 如果都满足,则更新当前cluster下的worker到最新镜像。 # -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@rocketmq.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org