4. 主路由及应用状态
Scalebox应用是由主路由模块驱动的分布式应用程序,其状态管理是其中的关键技术。状态管理通过状态保持、状态迁移来实现。
主路由模块,又称为路由模块,应用的主控程序。
4.1 主路由模块
多main-router实例设置
将所有相关信号量模块放到一个main-router中。
task-dist-mode设定为SLOT-BOUND
task add过程中,在task-headers中设定to_slot
可用不同程序语言实现。
bash
golang
python
4.1.1 优化设计
主路由模块从设计上看,是单个串行模块。但可按不同来源消息部署为多个独立模块,实现并行处理。
减少路由相关的输入任务数量;(粗粒度的控制消息)
减少全系统的信号量数量;(粗粒度信号量)
4.1.2 高效实现
在主路由中,单次处理多个任务(一次操作读取多个任务,并批量处理后续任务生成、信号量修改等)
后续任务生成的批量操作(减少数据库操作次数)
信号量处理的批量生成(减少数据库操作次数)
4.1.3 状态管理
状态保持
状态迁移
信号量是scalebox中用于任务间同步、状态管理的重要概念,在复杂应用逻辑场景下,集中管理全系统的运行状态,使得计算模块无状态。信号量通常仅在main-router中被读写,以避免并发导致的问题。 而在普通算法模块中可以读取相应值。
4.2 状态保持
:以状态变量形式,存储应用模块的当前状态。
全局变量
共享变量
信号量
状态保存(semaphore/variable/global/……)
4.2.1 信号量(semaphore)
信号量创建
scalebox semaphore create ${sema_name}
信号量读取
scalebox semaphore get ${sema_name}
信号量增一
scalebox semaphore increment ${sema_name}
信号量减一
scalebox semaphore decrement ${sema_name}
信号量增减
scalebox semaphore increment-n {sema_name} ${n}
信号量组操作(semagroup)
4.2.2 共享变量(variable)
普通变量通常为字符串类型。
变量创建
scalebox variable create ${var_name}
变量读取
scalebox variable get ${var_name}
变量写入
scalebox variable set ${var_name} ${value}
4.2.3 全局变量
跨应用的共享变量
全局配置参数
4.3 状态转移
4.3.1 任务头状态传递
主路由的任务头信息传递
任务头以下划线
_开头,标识为待传递任务头传递路径:主路由 -> 算法模块 -> 主路由
单次传递,需人工维护状态
4.3.2 vtask状态保持
通过任务头传递实现vtask状态保持
任务头以下划线
_vtask_开头,标识为vtask任务头属性vtask属性的保持:横跨vtask的各个模块
vtask头属性:跨vtask生命周期,自动维护
4.4 vtask管理
vtask作为节点本地计算编程模型的基本单元,通过参数设计,简化本地计算在应用程序中的流控、容错等的实现;
vtask跨越输入加载、计算、结果回写的整个过程,基于vtask的容错简单、直接。
vtask标识一种跨越多个模块的虚拟task,是基于计数的流控机制,分为全局计数(global_vtask)、分组计数(group_vtask)、节点计数(host_vtask)等三类。
4.4.1 vtask主要功能
任务管理:跨模块的任务(task)组成vtask,可简化任务管理,并支持状态管理,进而支撑节点本地计算模型;
计数准入控制:以配合HPC计算资源的动态调度,实现超长任务计算;
粗粒度容错;实现细粒度检查点功能,自动容错。
4.4.2 vtask模块结构
前置任务队列(wait-queue):尚未绑定计算资源。全局容错的基本单元。
vtask头模块(vtask-head):vtask起始标识模块。为vtask分配计算资源(单节点/资源组),单节点模式使用HOST-BOUND,直接运行在计算节点上;资源组模式使用SLOT-BOUND,多个slot需部署在单节点(通常为头节点)上。
vtask算法模块(vtask-core):vtask核心处理模块,针对资源组模式,通常用hostname前缀来标识;可以为多个模块,通过pod实现模块间本地分发。
vtask尾模块(vtask-tail):vtask结束标识模块,通常部署在头节点上。任务体(task-body)与vtask-head保持一致。
4.4.3 vtask模式分类
task_dist_mode设置
| 全局模式 | 单节点模式 | 资源组模式 | |
|---|---|---|---|
| wait-queue | |||
| vtask-head | HOST-BOUND | SLOT-BOUND | |
| vtask-core | HOST-BOUND | HOST-BOUND | |
| vtask-tail |