前文
项目开发过程中需要一个框架,可以实现异步队列,将整个项目解耦。由于项目主体是Python写的,Python里celery作为异步非常的广泛,但是celery的缺点是可视化不足,稳定性也不行,当线上量大的时候,容易出现不可知异常导致失败;
对于分布式框架,需求它轻量易接入,同时可以直接用redis做队列,而不需要再引入第三方组件如 MQ、kafka;Python这块相关的的确比较乏力,而golang高并发的性质在这块可以支撑很多,可选如下:
评估
针对三者区分如下:
方案 | 优势 | 劣势 |
---|---|---|
asynq | 1.轻量,代码架构相对简单;2.功能充分:定时任务、重试失败任务、支持redis集群和哨兵、支持web ui、支持命令行查看参数、优先级队列;3.google员工开发,且持续在更新 | 暂无 |
machinery | 1.功能充分(同上) | 1.比较重,代码架构复杂2.不支持webui可视化页面 |
goworker | 1.轻量,架构相对简单;2.支持生产者由其他程序输入,只负责消费 | 1.功能不够充分;2.不支持webui |
三者的优缺点比较明显,但根据需求来,主要是asynq比较符合需求;它的几个功能点:提供可视化web ui界面,支持自动重试和优先级队列,且依托于redis也无须纳入第三方队列组件;
测试
本地基于github搭建了一套,无论是内存的消耗,还是队列的消费速度,都非常快;同时压测上百万个任务进队列,可以在10min左右消费完毕。
关于asynq就是典型的生产-消费结构,client负责推送任务到队列,worker负责消费任务。
其功能特性非常多,具体如下:
其搭建可以参考readme轻松搭建,这里看下可视化ui: