首页 > 没时间解释了,两周肝出来的新项目asyncjob,快上车
头像
开心果若冰
编辑于 2023-07-31 22:27
+ 关注

没时间解释了,两周肝出来的新项目asyncjob,快上车

hi,牛客网的同学们,大家好,我是社长。

一个半月前,在牛客网上分享了一个go方向的练手项目osproxy,目前github上的star已有150+,一起参与讨论的人也有100+,其中大部分都是今年的应届生,有几个同学参与了pr共建并表示学到了很多,在这里感谢各位的支持,也非常开心能帮助到大家。

在和大家的交流过程中,也有同学反馈说项目比较复杂,难上手。osproxy这个项目是我自己练手实践golang顺手搞出来的,为了用到更多的技术,里面难免有冗余、过度设计的问题,但整体来说还是一个多角度实践golang的完整练手项目。

现在已经8月份,离正式校招的时间点越来越近了。为了更好的帮助喜欢golang、转方向到golang的同学,降低上手难度,这两周我把osproxy里面的异步任务,独立并扩展成了一个新项目asyncjob,这个项目已于上周六完全开源在GitHub。

asyncjob是一个基于golang,Redis和Lua实现的原子调度异步任务的管理项目,它既支持cron语法的周期任务,也支持定时/延时任务的投递。使用场景也比较广泛,比如邮件/短信的异步通知,订单到期未支付的通知,图片的异步压缩任务等。

整体来看,asyncjob上手比较容易,只依赖的postgresql和redis。其中pg只用来生成分布式ID,看过osproxy的同学应该知道,osproxy是基于雪花算法生成的id,这次换了一种方案,基于Leaf-segment方案来实现,同样是一个高性能的分布式ID生成器。另外,可以学到redis的zset,hash等数据结构的使用,及加深对lua脚本原子执行的理解。更多的实现细节不再展开,可以看github上的源码来了解。

这里罗列下实现的功能。

  • 支持原子化调度,避免任务重复消费
  • 支持任务的投递,查询,终止,恢复,删除
  • 支持分钟级周期任务和cron语法
  • 支持超时重试
  • 允许存在一定的时间误差,(默认test_msg类型,10s发送1w条消息)
  • 基于Leaf-segment方案实现分布式自增id生成器
  • 支持Docker一键部署,水平扩展保证高可用
  • ...

下面是项目中的技术点。

  • 状态转移,从period -> pending -> ready -> running
  • golang多协程的通信,数据交互,信号传递,优雅退出
  • redis中zset,hash的使用
  • lua脚本的实践,组合命令的原子执行
  • round-robin实现消息的均衡投递,每个bucket四个timer,保证消息的及时调度
  • ...

最后是项目架构和状态转移图。

如果你正在学习Go语言,并且该项目给你的学习带来了一些帮助,欢迎star,欢迎交流。

全部评论

(2) 回帖
加载中...
话题 回帖