Redis消息队列组件 redis-queue 大批量失败
问题出现场景:
一次性插入20000条消费信息 , 消息队列 进程100 , 队列处理接近8000-10000 的条数的时候 , 就会出现报错
错误如下:
/data/web/webman/vendor/workerman/redis/src/Client.php:305
Stack trace:
#0 /data/web/webman/vendor/workerman/workerman/Events/Select.php(232): Workerman\Redis\Client->Workerman\Redis\{closure}()
#1 /data/web/webman/vendor/workerman/workerman/Events/Select.php(281): Workerman\Events\Select->tick()
#2 /data/web/webman/vendor/workerman/workerman/Worker.php(2430): Workerman\Events\Select->loop()
#3 /data/web/webman/vendor/workerman/workerman/Worker.php(1554): Workerman\Worker->run()
#4 /data/web/webman/vendor/workerman/workerman/Worker.php(1384): Workerman\Worker::forkOneWorkerForLinux(Object(Workerman\Worker))
#5 /data/web/webman/vendor/workerman/workerman/Worker.php(1358): Workerman\Worker::forkWorkersForLinux()
#6 /data/web/webman/vendor/workerman/workerman/Worker.php(542): Workerman\Worker::forkWorkers()
#7 /data/web/webman/start.php(156): Workerman\Worker::runAll()
#8 {main}Workerman\Redis\Exception: Workerman Redis Wait Timeout (10 seconds) in /data/web/webman/vendor/workerman/redis/src/Client.php:305
Stack trace:
#0 /data/web/webman/vendor/workerman/workerman/Events/Select.php(232): Workerman\Redis\Client->Workerman\Redis\{closure}()
#1 /data/web/webman/vendor/workerman/workerman/Events/Select.php(281): Workerman\Events\Select->tick()
#2 /data/web/webman/vendor/workerman/workerman/Worker.php(2430): Workerman\Events\Select->loop()
#3 /data/web/webman/vendor/workerman/workerman/Worker.php(1554): Workerman\Worker->run()
#4 /data/web/webman/vendor/workerman/workerman/Worker.php(1384): Workerman\Worker::forkOneWorkerForLinux(Object(Workerman\Worker))
#5 /data/web/webman/vendor/workerman/workerman/Worker.php(1358): Workerman\Worker::forkWorkersForLinux()
#6 /data/web/webman/vendor/workerman/workerman/Worker.php(542): Workerman\Worker::forkWorkers()
#7 /data/web/webman/start.php(156): Workerman\Worker::runAll()
#8 {main}
redis 性能截图:
有没有大佬帮忙给看下问题
workerman/redis 是异步的,当有大量redis请求要发给redis时,请求会放在进程一个排队里,然后一个一个发给redis。
当redis处理不过来时,队列里的数据会积压,如果队列里有请求超过10秒还没发送给redis处理,就会报
Workerman Redis Wait Timeout (10 seconds)
。如果消量很大,可以用redis扩展来发送,它是同步的。参考 http://doc.workerman.net/components/workerman-redis-queue.html 里 在非workerman环境向队列发送消息 部分使用redis扩展发送队列消息
感谢感谢! 我看下解决方法!
大佬 , 帮忙看下我下方的回复贴内容 是否 可行呢
通过查看代码超时时间 设置默认为 10S , 增加了配置文件
最起码能解决快速超时 , 但是 插入效率不是改变 , 但是不知道超时 时间过长会不会对程序稳定性会不会有影响呢
还有其他方案 , 单批次插入 特定条数 , 比如说 10000 条, 立即重启下次 计时器 , 会不会是可行的?
以下是队列插入逻辑源码:
如果改为:
是否可行 , 还未测试
不需要超时的话把 wait_timeout 调成很大的值就好了。
好的好的