node.js - Redis 发布订阅 : Design pattern

标签 node.js sockets redis socket.io publish-subscribe

我们正在使用 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/

相关文章:

mysql - 来自 Node.js WebSocket 服务器的间歇性 500 错误

javascript - MongoDB/Mongoose/nodejs 中的引用资料 - 并行化

C 套接字 : using shutdown() to stop server running in background

sockets - 客户端-服务器多人 (MMO) 游戏中的运动 "algorithm"?

node.js - Socket.IO 和 Node.js 核心集群

django - celery 调度错误: an integer is required

Node.js、Express 和 GM (GraphicsMagick) - 添加水印和一般图像处理效率

node.js - 用于 nodejs Upstart 的配置文件

php - socket_connect 不会超时

django - Web Sockets 在 Heroku 上的 Django 应用程序中不起作用