目录
在翻workerman项目时发下了这个组件,自己项目中也用了一个类似的, 还算熟悉,就研究下区别。
主要阅读文件 workerman/redis-queue Client.php
$client->subscribe
一开始以为是 【Pub/Sub】,其实不是。很有迷惑性。
workerman/redis-queue 支持异步队列和异步延迟队列。因此它是2种方案结合。
异步延迟队列
redis运用
结构 |
增加 |
拉取 |
sortSet |
add |
zrevrangebyscore |
流程
- zadd 增加消息
- 利用Timer循环获取,1秒一次
- 获取后推到异步队列
异步队列
redis运用
结构 |
增加 |
拉取 |
list |
lpush |
brpop |
流程
- lpush 增加消息
- brpop 阻塞等待消息
- 获取后运行
异常处理
文档说明
消费失败是指业务抛出异常Exception或者Error。
消费失败后消息会放到延迟队列等待重试,重试次数由 max_attempts控制,
重试间隔由retry_seconds和max_attempts共同控制。比如max_attempts为5,
retry_seconds为10,第1次重试间隔为110秒,第2次重试时间间隔为210秒,
第3次重试时间间隔为3*10秒,以此类推直到重试5次。
如果超过了max_attempts设置测重试次数,
则消息放入失败队列(key为redis-queue-failed)
也就是说这个一个配置是作用于整个clinet,和队列无关。
个人感觉
- 需要多套失败重试方案时,似乎不太好用
如果有一个消息没有对应的消费者, 可能要悲剧。
if (!isset($this->_subscribeQueues[$redis_key])) {
$this->_redisSend->rPush($redis_key, $package_str);
}
这里并不会悲剧,因为
$this->_redisSubscribe->brPop(\array_keys($this->_subscribeQueues), 1, $cb);
多套失败重试代码
想好了,有空来补充