我们正在使用 socket i/o 处理大量实时数据。用户使用套接字发送/接收数据。由于我们正在使用负载均衡器,因此我们不能使用套接字 i/o 的命名空间模型,而是在套接字中使用 redis 的 pub/sub。
到目前为止,我们为每个用户每个 channel 的订阅创建了一个单独的 redis 连接。但最近我们遇到了 redis 上达到最大连接数的问题(Error: Ready check failed: ERR max number of clients reached
),我们发现这是因为通过 pub 有太多的 redis 连接子。
为了解决这个问题,我想到,与其为每个用户使用多个订阅 Redis 连接,不如有一个发布 Redis 连接和一个订阅 Redis 连接,它们将监听所有 channel ,并且可以通过以下方式实现:
var pub = redis.createClient();
var sub = redis.createClient();
sub.psubscribe('*');
sub
将监听所有 channel 。此外,我们可以将有关用户订阅的 channel 的信息存储在套接字对象中,并相应地处理数据。
希望我清楚问题陈述并想了解使用这种设计模式的性能如何?
最佳答案
在性能方面,使用单个连接要好得多,它对 redis 服务器的压力要小得多,并且在发布数据时,它不必遍历所有连接。 “模式”确实会产生一些开销,但可以忽略不计,请确保您的模式更加具体,您将来可能会在该服务器上发布其他事件。
sub.psubscribe('someprefix_*');
顺便说一句,如果您的问题是在多个 NodeJS 实例的上下文中广播到 socket.io,您可以查看此模块:https://github.com/socketio/socket.io-redis
它利用 redis 为 socket.io 提供可扩展的多 Node 体验
关于node.js - Redis 发布订阅 : Design pattern,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43658072/