golang实现延时队列

github源码地址:https://github.com/hackssssss/delay_queue

参考了有赞延时队列的设计思路,自己写了一个延时队列,基本原理是利用redis的list实现队列,利用redis的zset实现按照时间排序功能。

大体流程如下图所示:

golang实现延时队列

流程解读:

1. 调用方调用Push接口,将data、ttr(time to return)、notify_url传入。

2. 生成唯一id,将id与对应的data放到pool中(图中未列出),将id放到zset中,ttr作为score。

3. detector是后台goroutine,每秒轮询zset,将前n个最小score的id取出,判断score <= time.Now,那么push到ready queue中。最终将push成功的id从zset中删除。

4. publisher也是后台goroutine,阻塞式的轮询ready queue,如果队列中有数据,则pop出来,启动一个goroutine,根据notify_url发送post请求。

 

-- 源码不断更新,可能有新特性这里不会列出,可以关注一下github。