一个Job可以是一个Task,也可以是多个Task。
- 增加一个域名
- 分发配置文件到CDN节点(ocdn_config)
- 节点reload(ocdn_config)
- 反向代理检测(ocdn_proxy)
- 修改DNS记录(ocdn_dns)
- 删除一个域名
- 修改DNS记录(ocdn_dns)
- 删除配置文件(ocdn_config)
- 节点Roload
- 擦除Cache(ocdn_purge)
- 擦除Cache(ocdn_purge)
- 节点流量采集(ocdn_flow)
- 节点健康状态检测(ocdn_heartbeat)
- ocdn_timer 建立一个timer的表,把需要执行的模块和参数放入其中,然后让timer模块来轮询并且触发。
- ocdn_purge 用于刷新缓存<->节点purge
- dns_mode 用于DNS记录变化<->dns服务器或者dnspod等dns服务
- ocdn_config 用户配置文件变更<->节点配置文件
- ocdn_cfg_check(定时) 用户配置文件版本检查<->节点配置文件版本信息(如果有问题则调用ocdn_config进行同步或者调用ocdn_node进行节点排查)注:如果有问题不反复重试,等待定时器的下次检查。
- ocdn_node(定时) 用于检测节点<->节点
- ocdn_flow 流量收集模块(不直接连外网,通过ocdn_node拉取传递过来)
- OpenCDN中基本执行单元都是Task,一个Job可以包含一个或多个Task。
- 每个Job都有一个Json文件来描述所有Task执行流程以及Task之间的数据传输。
- 每一种Task都有一个队列,队列的消费者是一启动就存在的。
比如执行一个增加域名的Job,那么有几个Task组成一个有向图(DAG),通过下面来执行。
注:所有Task都已经运行,每个Task都有自己一个队列,所做的就是消费队列中的任务。
{ 'TaskName' : 'ADD_DOMAIN', #Task名字 'Description' : 'add a Domain' # Job所描述 'TaskList' : ['OCDN_PUSH_CONF','OCDN_RELOAD','OCDN_PROXY','OCDN_DNS'], #Job所有Task列表 'CurrentTask': 'OCDN_PUSH_CONF', #当前要执行的Task, 'TimeOut' : 10 #10秒, 'RunTimesLimit': #Task运行最大次数 { 'AlreadyRunTimes': 0, #当前执行该Task次数 'MaxRunTimes' : 10 #最多执行该Task次数 }, 'Parameters': #参数 { 'Domain':'www.firefoxbug.com', 'Node':'192.168.1.1' } }
三个问题大家可以讨论下:
-
如果上面的任意一个Task失败了,怎么确保之前已经成功的Task不重做,并且又能让这次Task重新调度,以及还要保证这个Task不是一个死循环(每次都是失败就有问题了)
解决方案:引入了RunTimesLimit这个配置,如果Task执行失败,可以重新调度,AlreadyRunTimes加1,直到超过MaxRunTimes后就判定Task为失败。
-
任务堆积功能考虑,对于cdn节点,挂掉是常态,而这个会导致任务的不一致性。一种是采用队列进行堆积任务,可能数据会太热。有些节点挂几个月,就会占用很多的热存储资源。另一种是等节点重新起来之后再去找哪些任务没做过,然后拉出来做。这个会导致编程的逻辑过于复杂。我考虑的一种方案是,在本地建一个虚拟节点,所有的配置文件数据全部旁路传一份到虚拟节点。然后一旦一个节点挂掉了的话,从虚拟节点rsync(或者类似的原理)一份到实体节点,然后就迅速追回到最新状态开始工作。