运维系统有这样一个需求, 简述一下就是: 执行任务A后执行B和C.B和C都执行完毕后执行任务D.
由于以前用celery做任务调度, 很自然的查看是不是在celery中能够通过canvas实现(http://docs.celeryproject.org/en/latest/userguide/canvas.html).同时celery支持任务重试,也可以通过flower方便的查看任务执行状态. 貌似, 一切都是好的.
可是后来在涉及到任务链回退的时候遇到了一些麻烦, 而且有任务竞争的问题. 开始反思是不是celery在任务流这种场景下是不是不合适, 是不是有更好的实现.
刚开始想到自己实现一个, 大概会用到python的自省, 图(有序无环图)等, 但是工作量有些大了(其实是有些胆怯, 怕写不好哈哈), 最后决定现在找一下有没有现成的轮子.
在大致查看了一下现有的轮子后, 这篇文章( https://medium.com/@jimbobhickville/be-one-with-the-taskflow-129e05a92bd4 )说服了我.
taskflow是openstack下的一个工作流引擎, 支持线性流, 无序流, 图流, 而且任务定义和回退方式也很灵活方便.
这里并不是说celery和taskflow哪个更好, 而是相比下, celery在分布式队列场景是很适合的, 而任务流的场景中, taskflow看上去更胜一筹, 当然2种工具结合起来用也是可以的.