你们是如何使用 redis 来监听任务的?

2020-08-11 10:32:46 +08:00
 smallgoogle
鄙人有个需求就是,A 服务把数据推到 redis,B 服务一直监听 redis list,如果有数据就弹出。
我在 B 服务里用的是 blpop,可这个命令是阻塞的。意思是如果 redis 的 list 一直没有数据 这个位置就一直阻塞,直到监听到一个数据 然后弹出。。。
那么问题就来了,先不说程序效率不效率的,或者是超时不超时的。因为目前我发现我还没等到超时呢,内存就溢出了。。或者说这个阻塞导致了系统自动结果了 B 服务的进程。因为我报错如下:
```
OSError: [Errno 12] Cannot allocate memory
```

那么问题来了,我如何可以优雅的监听 list 是否有新数据呢?
7584 次点击
所在节点    Python
56 条回复
Immortal
2020-08-11 11:22:14 +08:00
我觉得内存溢出问题不是 redis 的队列引起的 再检查下
blpop 就是这么用的 我不是很支持楼上说的 lpop 然后 sleep
而且我也建议继续使用 redis 没必要动不动上 mq 服务架构越简单越好 不得不上的时候才会考虑加第三方组件
berserk
2020-08-11 11:25:05 +08:00
显然这个需求应该用 kafka.
vissssa
2020-08-11 11:28:48 +08:00
明显不是 blpop 的问题,都歪楼成啥样了
以前用 blpop 监听过任务,没出现过问题。
Pythoner666666
2020-08-11 11:45:11 +08:00
sleep 的操作建议别用 会阻塞 cpu 。 blpop 本身就是楼主这种用法 另外设置超时时间 没有数据就不会一直阻塞 会进入 sleep 状态 有新数据就会再次唤醒 这样比较合理 但是会有另外一个坑 就是 sleep 时间太久 redis 客户端会断开连接 所以得 catch 异常 然后假重连。
wysnylc
2020-08-11 12:28:02 +08:00
redis sub/pub
jenlors
2020-08-11 12:50:14 +08:00
redis5.0 以上支持 stream,当做轻量级队列使用还是不错的。
bigggge
2020-08-11 12:56:56 +08:00
借楼问下,Node.js 用 https://github.com/OptimalBits/bull/ 的时候,BRPOPLPUSH 导致写时延一直是 5s,触发监控报警咋办?
tikazyq
2020-08-11 14:04:49 +08:00
上代码
tikazyq
2020-08-11 14:05:43 +08:00
选 redis 没错,这个方案也可行,内存溢出一般是程序本身的问题,检查一下哪里写了 bug 了
lenqu
2020-08-11 14:14:11 +08:00
轻量级,redis 我觉得很好用,消息队列并不适合单一的场景业务
gemini767
2020-08-11 14:16:43 +08:00
思路有点绕,可以用 redis 的订阅
也可以当前一个事务处理完直接调用下一个服务
也可以 eventbus 之类的
不知道手写 一边写一边读的意义
lenqu
2020-08-11 14:20:42 +08:00
还有如果是一个在内网,一个在外网,我觉得消息队列在这种业务下是不合适的,因为队列服务器无法主动连接
cnoder
2020-08-11 14:32:56 +08:00
大概率不是 redis 的问题,用法没错
shenlanAZ
2020-08-11 16:41:18 +08:00
lpush 把消息放到队列里,brpop 消费,这里面会有一个 timeout 当 timeout 过了之后,brpop 就结束了会返回 null, 需要进入下一个循环。

内存溢出应该和这些方法没问题,建议检查一下逻辑代码。
timidadonis
2020-08-11 16:59:23 +08:00
消息队列他不香吗
byzf
2020-08-11 17:27:51 +08:00
和你需求基本相同, 用 lrange + ltrim, 每次取固定数量, 代码大概五十行吧, 跑了几年至今没遇到过超时和内存溢出.

仿佛来到了卡巴, 20 块钱配置出的问题, 一堆人让买八路泰坦.
ToBeHacker
2020-08-11 17:42:57 +08:00
你这个内存溢出跟 redis 应该没啥关系吧
dzdh
2020-08-11 17:47:06 +08:00
@KallyDev 并不是弃坑,而是作为一个 redis 扩展可选安装。不再默认整合在 redis 代码中。
Leigg
2020-08-11 17:50:30 +08:00
出问题先检查自己代码
robinlovemaggie
2020-08-11 17:54:05 +08:00
不太清楚你的 blpop 在做什么逻辑的阻塞,感觉像是出现了死锁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/697283

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX