消息队列 与 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
;