简介
taskpool是一个任务池,它提供了一种类库的方式来实现分布式的任务队列。相比于一些消息队列框架,taskpool的目标不是高吞吐量的消息生产和消费场景,而是提供一种分布式的任务池“对象”,它更像是一个数据结构封装类。
应用场景
taskpool适用于对性能要求不高,需要保证事务的应用场景。比如
- 异步任务,保证不重复执行
API说明
- put 把任务放入任务池
- get 从任务池获取任务
- update(token) 更新任务执行进度
- commit(token) 提交任务修改结果
一致性保证
一致性主要是任务抢占的一致性和任务提交的一致性。
任务抢占的一致性
taskpool通过状态status和可用时间avail_time来判断任务是否可用。如果avail_time小于当前时间而且status为可用状态,那么taskpool会尝试更新这条任务,通过数据库的乐观锁来保证并发一致性,抢占成功之后,taskpool会更新avail_time和holder两个字段。
任务提交的一致性
当任务消费者成功抢占到任务之后,会获得一个token信息,包含了任务的id和holder,消费者在任务完成之后提交的时候,taskpool会检查id对应的任务holder是否被抢占。
如果holder不变,则把status置为1,并且把结果更新进去。
与用户线程隔离
taskpool的所有任务操作都是在独立的线程池里执行的,距离来说,put操作