消息队列 与 MySql
- 有一个任务
- $delay 时间之后开始
- $expire 时间之后失效
- 预计 $timeout 时间之内可以完成
- 最多尝试 $max_retries 次
- 每次尝试间隔 $sleep 时间
add-task \
-delay $delay \
-expire $expire \
-retries $max_retries \
-timeout $timeout
一个概念上很类似的 Linux 命令是 lockfile
lockfile -l locktimeout -r retries -sleeptime
基于 MySql 的基础实现
MySql 增加消息
INSERT INTO tasks
SET start_time = NOW()+$delay,
expire_time = NOW()+$expire,
retires = $max_retries
MySql 处理消息
SELECT id, * FROM tasks
WHERE start_time < NOW()
AND expire_time > NOW()
AND status = 'todo'
LIMIT 1
;
UPDATE tasks
SET status = 'work'
WHERE id = $id
;
1. 消息处理成功
UPDATE tasks
SET status='done'
2. 消息处理失败
UPDATE tasks
SET status = 'fail',
retries = retries - 1
3. 消息处理超时
并发处理
TODO
UPDATE tasks
SET start_time = start_time + $timeout
WHERE id = $id
;