【问题标题】:Redis Pub Sub : Design patternRedis Pub Sub:设计模式
【发布时间】:2017-09-25 06:22:55
【问题描述】:

我们正在使用套接字 i/o 来处理大量实时数据。用户使用套接字发送/接收数据。由于我们使用的是负载均衡器,所以我们不能使用 socket i/o 的命名空间模型,而是在 socket 中使用 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 将收听所有频道。此外,我们可以将用户订阅的频道信息存储在套接字对象中,并相应地处理数据。

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

【问题讨论】:

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


    【解决方案1】:

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

    sub.psubscribe('someprefix_*');
    

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

    它利用 redis 通过 socket.io 提供可扩展的多节点体验

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2012-04-25
      • 2016-01-18
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多