|
1 | 1 | # delay-queue
|
2 |
| -延迟队列, 参考[有赞延迟队列设计](http://tech.youzan.com/queuing_delay)实现 |
| 2 | +基于Redis实现的延迟队列, 参考[有赞延迟队列设计](http://tech.youzan.com/queuing_delay)实现 |
3 | 3 |
|
| 4 | +## 应用场景 |
| 5 | +* 订单超过30分钟未支付,自动关闭 |
| 6 | +* 订单完成后, 如果用户一直未评价, 5天后自动好评 |
| 7 | +* 会员到期前15天, 到期前3天分别发送短信提醒 |
| 8 | + |
| 9 | +## 猜想 |
| 10 | +支付宝异步通知时间间隔是如何实现的(通知的间隔频率一般是:2m,10m,10m,1h,2h,6h,15h) |
| 11 | + |
| 12 | +订单支付成功后, 生成通知任务, 放入消息队列中. |
| 13 | +任务内容包含Array{0,0,2m,10m,10m,1h,2h,6h,15h}和通知到第几次N(这里N=1, 即第1次). |
| 14 | +消费者从队列中取出任务, 根据N取得对应的时间间隔为0, 立即发送通知. |
| 15 | + |
| 16 | +第1次通知失败, N += 1 => 2 |
| 17 | +从Array中取得间隔时间为2m, 添加一个延迟时间为2m的任务到延迟队列, 任务内容仍包含Array和N |
| 18 | + |
| 19 | +第2次通知失败, N += 1 => 3, 取出对应的间隔时间10m, 添加一个任务到延迟队列, 同上 |
| 20 | +...... |
| 21 | +第7次通知失败, N += 1 => 8, 取出对应的间隔时间15h, 添加一个任务到延迟队列, 同上 |
| 22 | +第8次通知失败, N += 1 => 9, 取不到间隔时间, 结束通知 |
| 23 | + |
| 24 | + |
| 25 | +## 实现原理 |
| 26 | +> 利用Redis的有序集合,member为JobId, score为任务执行的时间戳, |
| 27 | +每秒扫描一次集合,取出执行时间小于等于当前时间的任务. |
| 28 | + |
| 29 | +## 依赖 |
| 30 | +* Redis |
4 | 31 |
|
5 | 32 | ## 下载
|
6 |
| -[v0.1](https://github.com/ouqiang/delay-queue/releases/tag/v0.1) |
| 33 | +[v0.2](https://github.com/ouqiang/delay-queue/releases/tag/v0.1) |
7 | 34 |
|
8 | 35 |
|
9 | 36 | ## 源码安装
|
|
13 | 40 |
|
14 | 41 |
|
15 | 42 | ## 运行
|
16 |
| -`./delay-queue -c delay-queue.conf` |
| 43 | +`./delay-queue -c delay-queue.conf` |
17 | 44 | > HTTP Server监听`0.0.0.0:9277`, Redis连接地址`127.0.0.1:6379`, 数据库编号`1`
|
18 |
| - |
19 | 45 |
|
20 | 46 | ## HTTP接口
|
21 | 47 |
|
@@ -51,12 +77,16 @@ URL地址 `/push`
|
51 | 77 | | 参数名 | 类型 | 含义 | 备注 |
|
52 | 78 | |:-------:|:-----------:|:------------:|:-----------------:|
|
53 | 79 | | topic | string | Job类型 | |
|
54 |
| -| id | string | Job唯一标识 | | |
| 80 | +| id | string | Job唯一标识 | 需确保JobID唯一 | |
55 | 81 | | delay | int | Job需要延迟的时间, 单位:秒 | |
|
56 | 82 | | ttr | int | Job执行超时时间, 单位:秒 | |
|
57 | 83 | | body | string | Job的内容,供消费者做具体的业务处理,如果是json格式需转义 | |
|
58 | 84 |
|
59 |
| -### 长轮询ready queue是否有任务, 有任务立即返回或等待180秒后超时返回 |
| 85 | +### 轮询队列获取任务 |
| 86 | +服务端会Hold住连接, 直到队列中有任务或180秒后超时返回, |
| 87 | +任务执行完成后需调用`finish`接口删除任务, 否则任务会重复投递, 消费端需能处理同一任务的多次投递 |
| 88 | + |
| 89 | + |
60 | 90 | URL地址 `/pop`
|
61 | 91 | ```json
|
62 | 92 | {
|
@@ -115,4 +145,3 @@ URL地址 `/finish`
|
115 | 145 | | 参数名 | 类型 | 含义 | 备注 |
|
116 | 146 | |:-------:|:-----------:|:------------:|:-----------------:|
|
117 | 147 | | id | string | Job唯一标识 | |
|
118 |
| - |
|
0 commit comments