我们正在使用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
会收听所有频道。此外,我们可以存储有关用户在套接字对象中订阅的频道的信息,并相应地处理数据。
希望我对问题陈述很清楚,并想了解使用这种设计模式的性能如何?
答案 0 :(得分:0)
性能方面,使用单个连接要好得多,它对redis-server的压力要小得多,并且在发布数据时,它不必遍历所有连接。 “模式”确实会产生一些开销,但它可以忽略不计,确保对模式更加具体,您可能会在将来在该服务器上发布其他事件。
sub.psubscribe('someprefix_*');
顺便说一句,如果您的问题是在多个NodeJS实例的上下文中广播到socket.io,您可以查看此模块:https://github.com/socketio/socket.io-redis
它利用redis为socket.io
提供扩展的多节点体验