Worker调度管理器原理解析

本文详细解释了Pulsar中的Worker角色特别是SchedulerManager如何进行任务调度和重平衡,涉及任务分配逻辑、leader/follower机制以及源码解析,重点展示了Function实例的创建、更新和生命周期管理过程。

引言

Pulsar Function中最重要的角色是Worker,而Worker中最核心的类就是调度管理器SchedulerManager,本篇博客就专门对它进行剖析

一、正文

SchedulerManager职责有以下两点

  1. 任务调度
  2. 重平衡

任务调度是SchedulerManager最重要的逻辑,咱们通过 pulsar-admin functions create xxx 启动一个function实例时,Pulsar 如何决定在哪台worker所在节点启动这个function实例,这就是任务调度要做的事情,除此之外任务调度还包含function更新、删除以及任务的生命周期管理。而重平衡是稳定性相关的,当咱们的function实例分布不均衡时,可能会导致涝的涝死,旱的旱死,因此需要咱们做function实例的重新分配,这也是SchedulerManager要做的事情

二、任务调度

在开始讲解任务调度之前,咱们先看看下面这张图
在这里插入图片描述

图中的上下方分别是两个worker进程实例,在咱们通过 bin/pulsar functions-worker 启动worker进程时服务内部会启动consumer并以failover方式来在Broker进行消息订阅消费,failover机制保证同一时间内只有一个Consumer能进行订阅,因此Worker通过这个机制来进行选主,成功订阅的worker晋升为leader负责任务的派发,未成功订阅的worker变为follwer并通过Reader监听Broker中的任务。其中Leader和Follwer的主要逻辑分别如下

worker-leader

通过Consumer-failver机制成为leader后,会立马启动一个Producer负责往Broker中发送任务消息,每当有新建启动function请求进来,就会往Broker中写入一条对应的任务消息。除此之外Leader还会通过Consumer消费Broker中保存的元数据,并以Map数据结构存在内存中作为Leader的元数据管理的数据来源,这里的数据有Function信息、Instance信息等,在接受到我不请求是也会同步更新这里,同时也会定期的根据元数据检查来排查出异常的Function、Instance等。

worker-follwer

在worker成为follower后,会启动Reader监听Broker中的任务,当监听到有新任务时会调用任务管理器进行处理,例如在有新增启动Function时,如果是配置的线程级别则以线程方式启动Instance,如果是配置的进程级别则会拉起一个独立的Instance进程进行Function任务的执行。

源码解析

调度逻辑的主要入口在SchedulerManager的invokeScheduler方法

  1. 获取所有Function 以及Instance
  2. 删除所有不存在的Function/Instance的分配器,同时更新分配器的信息
  3. 通过元数据比较获取需要新增的Instance并包装成Assignment,通过内部Topic发送这条新增Instance给Worker
  4. 获取还未启动的Instance实例,并通过RoundRobinScheduler的schedule方法派发到对应的Worker节点进行启动
  5. 循环通过FunctionRuntimeManager.processAssignment启动Instance
   void invokeScheduler() {
   
   
        long startTime = System.nanoTime();

        //获取当前worker集群中可用的worker节点信息
        Set<String> availableWorkers = getCurrentAvailableWorkers();

        //获取所有Function
        List<FunctionMetaData> allFunctions = functionMetaDataManager.getAllFunctionMetaData();
        //获取所有Instance
        Map<String, Function.Instance> allInstances =
                computeAllInstances(allFunctions, functionRuntimeManager.getRuntimeFactory().externallyManaged());
        //获取当前每个 workerId->(InstanceId—>任务)
        Map<String, Map<String, Assignment>> workerIdToAssignments = functionRuntimeManager
                .getCurrentAssignments();

        // 初始化调度状态记录器
        SchedulerStats schedulerStats = new SchedulerStats(workerIdToAssignments, availableWorkers);

        //delete assignments of functions and instances that don't e
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏洛克·林

有钱的捧个钱💰场或人场~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值