2017 年 3 月 25 日,又拍云在广州举行了 Open Talk 唯品会专场“如何打造高性能高可用的电商平台”。唯品会架构师薛珂带来了《 Saturn:弹性任务调度系统的探索与演进》的精彩演讲,分享唯品会弹性任务调度系统 Saturn 的探索与演进过程。
任务调度系统可以拆分为任务+调度+系统。
任务是实现某个业务功能的代码集合,比如刷新缓存任务,计算库存任务,数据比对任务等,它可以由任何一种语言实现,但必须触发才可执行,通常有时间触发和事件触发两种机制。
调度有两层含义:一是将任务与它的触发规则之间建立绑定关系,比如每天晚上 11 点 0 分 0 秒触发一个刷新库存的任务;二是将任务进行并行分解成为一个个的可执行分片,将可执行分片与执行资源之间建立绑定关系,即资源调度。
一、唯品会所追求的任务调度系统
唯品会业务开发团队希望能有一个公共的任务调度平台,业务团队将业务逻辑封装成任务,发布到这个公共平台,然后进行任务及资源的配置,任务的控制和管理,任务执行状态监控,异常任务展现和告警等。而资源的调度,任务的触发,分片的划分,以及高可用,负载均衡,超时控制等功能的实现由任务调度平台解决。
这个平台还需要支持多种作业类型( Java,PHP,Shell,HTTP 服务),以及支持多种触发规则(定时触发,消息触发),接入和版本升级简单,开发任务简捷,不会额外引入其它第三方依赖包等。在此背景下,弹性任务调度系统 Saturn 诞生。
Saturn 任务调度系统特性
任务负荷,动态均衡
Saturn 给每个任务的每个分片一个负荷值,即权重。比如任务 A 每个分片的权重都是 30,任务 B 每个分片的权重都是 10,在进行资源调度的时候,Saturn 可以根据分配给不同机器的总负荷值,来做一个均衡。比如说机器 1 的负荷值是 60,机器 2 的负荷值也是 60,虽然机器 1 只负责了两个任务分片,机器 2 却负责了四个任务分片,通过任务负荷来达到资源均衡的效果。
优先列表
资源自动分配时存在一个问题,若任务非常重要如唯品会的双订单任务,或者订单处理的问题非常重要,这时机器应该如何处理?
对此唯品会引入了优先列表概念,开发和运维人员可以给某些任务分配一些优先运行的机器列表,当优先机器任务存在的时候,只会在这些机器运行,只有当这些机器全部不在了,任务才会被迁移到其他的机器上运行,满足订单部门提出的场景化需求。
本地模式
有些情况下,任务的分配是不可预知的,比如唯品会在商品售卖前,会全量扫描在售商品图片,这个任务要进行大量的图片处理,这时通常就不会让这个任务跟其他任务共享资源。另外 Saturn 支持容器化,可以在高峰期自动扩展到 150 个节点去执行某个任务,然后在低谷期自动缩回到 20 个节点,这就是 Saturn 本地模式的一种场景。
任务执行频率自定义
Saturn 系统采用容器技术开发,上图是 Saturn 目前能够做到的任务频率图,从1 天 1 次、1 小时 1 次,10 分钟 1 次、1 秒1 次,甚至每秒 N 次,均可自行定义。对于高品质的任务,比如 5 秒以内,或者是 1 秒中多次执行的任务,怎么做?这种任务 Saturn 会采用线程方式执行,但只支持 Java。
二、唯品会任务调度系统探索与演进
1. Saturn 产生的价值
唯品会任务调度系统也经过了长期的探索, 2012 年之前采用 Crond 服务,2014 年开始使用 Quartz、 Spring Batch 和各团队的个性化方案,但会遇到任务没法监控,任务出问题了不知道和成本高昂等情况,因此唯品会在 2016 年开始实行全部定时任务,并统一到 Saturn 平台。
到目前为止唯品会已经形成了任务调度的生态链。上图所示,开发完成任务,发到开发的仓库,测试完成之后到生产仓库,进行监控、配置等工作,不用太关心任务调度情况。
目前 Saturn 产生的价值是:有 66 个业务应用系统在使用,包括订单、支付、库存、用户、财务等售卖相关的核心系统,每天有 350 个执行节点执行任务,每天执行任务 2000 万多次,相当于网站的全部的流量。这表明 Saturn 并不是一个纸上谈兵的产品,它已经承受住了唯品会大规模使用场景的考验。
2. Saturn开源现状及策略
唯品会主要的技术栈是 Java ,使用 Java 语言最大的优势之一就是庞大的开源力量。Saturn 也是以开源的 Elastic Job 为原型进行开发的,开源产品能大大节省开发成本,当 Saturn 经受了唯品会大规模长时间的考验,达到一定的成熟度之后,也想回馈开源社区,把好的东西拿出来与大家分享。开源之后收到了 star 330 多次,安装 400 多次,包括 YY、掌贝等公司正在使用。
Saturn 开源策略分成两块,一个是开源,一个是 VIP,全部核心功能都在 Saturn Open Source 上。唯品会使用是依赖公网的版本,如果选择 Saturn,其实你使用的版本和唯品会使用的版本在功能上完全一样。
3. Saturn 2017演进方向
Saturn 2017 年演进的方向,第一个是 Submit 的支持,它可以把任务通过不同的子系统在公共资源池执行,其次可以在公共资源池做资源分析、智能告警等事情,另外还想在 Saturn 上进一步引入异步维服务和更进一步的任务编排,最终目标是实现 FAAS 平台,希望打造中国的开源 FAAS 平台。