任务管理器要解决的问题
上文说到含水层上的任务管理器控制的任务是元控制的工作的子任务,那任务管理器它自己具体解决什么问题呢?在星云图中任务管理器主要解决了以下2个问题:
-
<李>将之前通过HTTP的传送方式改为RPC(节俭)
一般用户在搭建集群时,知道极高之间通信使用节俭协议,会为节俭所需端口开放防火墙,但是可能意识不到星云图还需要使用HTTP端口,我们遇到过多次社区用户实践忘记开放HTTP端口的事情。 <李>含水层对于任务有调度能力
这块内容将在本文下面章节展开讲述。
任务管理器体系中的元
在任务管理器体系中,metad (JobManager)的任务是根据graphd中传过来的一个工作要求,选出对应的蓄能主机,并拼组出任务请求发给对应的蓄能。不难发现,体系中元接受工作要求,拼组任务请求,发送任务请求及接受任务返回结果,这些逻辑的套路是稳定的。而如何拼组TaskRequest,将任务请求发给哪些蓄能则会根据不同的工作有所变化.JobManager用 <代码>模板策略> 代码+ <代码>简单工厂> 代码以应对未来的扩展。
任务管理器的调度控制
高并发执行任务
任务管理器将系统资源中自己持有的线程称之为Worker.Task经理有一个现实中的模拟原型——银行的营业厅。想象一下,我们去银行办业务时会有以下几步:
-
<李>场景1:在门口的排号机拿一个号李>
<李>场景2:在大厅找个位置,边玩手机边等叫号李>
<李>场景3:等叫到号时,到指定窗口办理李>
同时,你还会碰到这样那样的问题:
-
<李>场景4:贵宾可以插队李>
<李>场景5:你可能排着队,因为某些原因,放弃了本次业务李>
<李>场景6:你可能排着排着队,银行就关门了李>
那么,整理一下,这也就是任务管理器的基本需求
-
<李>任务按FIFO顺序执行:不同的任务有不同的优先级,高优先级的可以插队李>
<李>用户可取消一个排队中任务的李>
<李>蓄能随时关闭李>
<李>一个任务,为了使其尽可能高的并发,会被拆分为多个子任务、子任务是每个工人真正执行的任务李>
<李>任务管理器是全局唯一实例,要考虑多线程安全性李>
于是,有了如下实现:
-
<李>实现1:用节俭结构中的JobId和TaskId,确定一个任务,称为任务处理。李>
<李>实现2:TaskManager会有一个阻塞队列,负责让任务的处理排队执行(排号机),而阻塞队列本身线程安全。李>
<李>实现3:阻塞队列同时支持不同的优先级,高优先级先出队(VIP插队的功能)。