Redis Pub Sub:设计模式

时间:2017-04-27 12:39:16

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

我们正在使用socket i / o来处理大量实时数据。用户使用套接字发送/接收数据。由于我们使用负载均衡器,我们不能使用套接字i / o的命名空间模型,而是在套接字中使用redis'pub / sub。

到目前为止,我们正在为每个用户的每个频道创建一个单独的redis连接。但是最近我们遇到了一个问题,即在redis上达到最大连接(Error: Ready check failed: ERR max number of clients reached),我们发现这是因为通过pub sub有太多的redis连接。

为了解决这个问题,我发现不是每个用户使用多个订阅redis连接,为什么没有一个发布redis连接和一个订阅redis连接,它将监听所有通道并且可以通过以下方式实现:

var pub = redis.createClient();
var sub = redis.createClient();
sub.psubscribe('*');

sub会收听所有频道。此外,我们可以存储有关用户在套接字对象中订阅的频道的信息,并相应地处理数据。

希望我对问题陈述很清楚,并想了解使用这种设计模式的性能如何?

1 个答案:

答案 0 :(得分:0)

性能方面,使用单个连接要好得多,它对redis-server的压力要小得多,并且在发布数据时,它不必遍历所有连接。 “模式”确实会产生一些开销,但它可以忽略不计,确保对模式更加具体,您可能会在将来在该服务器上发布其他事件。

sub.psubscribe('someprefix_*');

顺便说一句,如果您的问题是在多个NodeJS实例的上下文中广播到socket.io,您可以查看此模块:https://github.com/socketio/socket.io-redis

它利用redis为socket.io

提供扩展的多节点体验