quart net 的节点或者任务的高可用实现的问题
1、首先是支持3种模式的TASK
单次订阅(比如订阅mq、redis的,要求保证类不被执行完毕,不能回收订阅对象)
定时执行(定时XX 秒、分、小时、毫秒)来执行
cron表达式执行,通过表达式来执行,可能不确定的执行时间
A:任务类型分布式执行接管
1️⃣、考虑到单个任务的分布式执行
即任务1在A节点运行过,那么就不再B节点运行,并且应该是保证A节点运行过,在下一次应该执行的时候才在A/B等节点中选择一个运行。
那么问题是:
单次订阅类型?应该在他一旦运行失败,数据消亡,备用节点执行的任务就应该启动,如果用缓存或者分布式锁的话,缓存的时间是多久,1秒刷新一次?
理论上,如果是订阅类型要支持分布式,应该是 多端争抢MQ的方式,即多个订阅对象抢一个队列的消息,每个线程都可以抢到唯一的一条数据,这种应该是要允许多端同时运行的,这个是可以运行重复运行的任务的。
定时任务类型?这个是最好解决的,分布式锁的时间就是执行间隔。
判断缓存的内容不是本次节点的名称(POD中的名字或者同一主机中的进程号),那么就可以处理,当A节点不运行之后,B节点可以接管这个任务。
但是缓存的时效一般是S级别,遇上ms级别的TASK,如何处理?
表达式类型?如果按照定时任务类型的来讲,他应该要解析表达式下一次执行时间,然后采用2中的问题,或者有其他办法?
B:节点类型分布式执行接管
这个是比较好处理的,同时运行多个节点,但是某一个节点还有心跳,备用节点不接管。
这里出现的问题是:
1、几个任务不被执行的问题,如何处理和解决,万一只是这个节点不能执行这几个任务呢?
2、怎么保证每个节点都是同样的代码呢,比如我的是插件式任务,怎么确保每个节点一开始的环境和版本都一样?
3、在pod中发现redis的连接数不足,经常连接失败,导致刷新异常,如果出现这一类的心跳异常,又怎么确定是节点不行还是心跳异常?
C:通过K8S的健康检查来实现节点的检测来实现单点有效监控?
还有分布式的问题:
分布式则是指TASK可以在A/B等多个节点中来回启用。
这个就是高可用中的TASK任务高可用类似的一种了。