产品中心
A06B-6114-H109
A06B-6114-H109分布式单实例容灾
出于容灾的目的,我们希望Daemon具有容灾能力。换言之若有Daemon实例异常挂起或退出,其他机器的实例进程可以继续执行任务。但同时我们又希望同一时刻只需要一个实例运行,即“分布式单实例”。所以我们完整的需求可以归纳为 “分布式单实例容灾部署” 。
实现这一目标,方式有很多种,例如:
接入“调度中心”,由调度中心来负责调度各个机器;
各节点在执行任务前先分布式抢锁,只有成功占用锁资源的节点才能执行任务;
各节点通过通信选出“master"来执行逻辑,并通过心跳包持续通信,若“master”掉线,则备机取代成为master继续执行。
主要从开发成本,运维支撑两方面来考虑,选取了基于chubby分布式锁的方案来实现单实例容灾部署。这也使得我们真正执行业务逻辑的机器具有随机性。
5. 可靠交付
这是一个核心问题,如何保证任务的通知满足At-least-once的要求?
我们系统主要通过以下两种方式来保证。
1.任务达到时即存入tablekv持久化存储,任务成功通知业务方才设置过期(保留一段时间后删除),故而所有任务都是落地数据,保证事后可以对账。
2.引入可靠事件中心。在这里使用的是事件中心的普通消息,而非事务消息。实质是当做一个高可用性的消息队列。
这里引入消息队列的意义在于:
将任务调度和任务执行解耦(调度服务并不需要关心任务执行结果)。
异步化,保证调度服务的执行,调度服务的执行是以ms为单位。
借助消息队列实现任务的可靠消费。
事件中心相比普通的消息队列还具有哪些优点呢?
某些消息队列可能丢消息(由其实现机制决定),而事件中心本身底层的分布式架构,使得事件中心保证的可用性和可靠性,基本可以忽略丢消息的情况。
事件中心支持按照配置的不同事件梯度进行多次重试(回调时间可以配置)。
事件中心可以根据自定义业务ID进行消息去重。
事件中心的引入,基本保证了任务从Scheduler到Notifier的可靠性。
当然,为完备的方式,是增加另一个异步Daemon作为兜底策略,扫出所有超时还未交付的任务进行投递。这里思路较为简单,不再详述。
A06B-6114-H109