使用 Redis 扩展 Socket.IO,然后扩展 Redis 本身

Posted

技术标签:

【中文标题】使用 Redis 扩展 Socket.IO,然后扩展 Redis 本身【英文标题】:Scaling Socket.IO with Redis and then scaling Redis itself 【发布时间】:2012-08-16 06:34:45 【问题描述】:

在使用 Node.js 和 socket.io 一段时间后,我明白如果我希望我的应用程序支持最多 100 万并发用户,我需要对其进行扩展,所以我开始使用 Redis 来处理套接字之间的PUB/SUB 消息并在同一台机器和其他机器上运行许多 socket.io 服务器实例,但我所有的 socket.io 服务器都与同一个 Redis 服务器一起工作。

这让我想:这有什么意义?我是否需要更多的 redis 服务器并在它们之间进行扩展?我的观点是,他们将永远是***服务器的瓶颈。

我的问题是,是否可以扩展 Redis?如果是,我所有连接到不同 socket.io 服务器的套接字如何能够在 Redis 服务器之间进行 PUB/SUB?

【问题讨论】:

请问,您对 pub/sub 使用相同的连接吗?谢谢 否,为每个连接的客户端创建 2 个客户端 非常抱歉,我想说 no pub/sub。所以 ?谢谢 你读过我@***.com/a/4446424/11926 的这篇文章吗?这个例子可以写得更好!然后一个 redis 实例就可以扩展你所有的 socket.io 服务器! 【参考方案1】:

我认为您正在寻找的是Redis Cluster。它在该页面上被称为“正在开发中”和“希望在今年夏天”。

有一个演示文稿here。它基本上是散列+单个主从冗余。但它还没有准备好。获取更多信息的最佳选择是访问这些产品的论坛和 IRC。

如果有人在做类似的事情,他们就会在这些频道上。

【讨论】:

或者,如果您的应用程序是唯一从 Redis 请求的客户端,请通过执行客户端散列来滚动您自己。在 Node.js 中快速搜索 lib 以帮助您:github.com/bnoguchi/node-hash-ring。 (如果您不熟悉“一致散列”一词,请阅读参考的博文,它基本上允许您以最小的开销弹性扩展服务器并相应地重新散列,而不必先验地定义服务器的 nr)。顺便说一句:这只需要处理分片。复制/HA 也必须得到照顾。 是的,Redis 集群就是解决这个问题的方法。自 2012 年 4 月以来,我一直在使用它来处理其他事情和发布/订阅,它工作得很好:) 我编写了一个 nodejs 模块,可以帮助您处理 Redis 集群并为您进行客户端散列,您所要做的就是要做的是为其中一个节点提供地址,如果您正确配置了集群,它将为您发现其他节点:github.com/joaojeronimo/node_redis_cluster【参考方案2】:

对于更多读者来说,使用带有 redis 适配器的 socket.io 是不可扩展的(至少目前是这样)。在后台,redis 适配器使用 pub/sub 进行广播。以下是关于此的讨论:https://github.com/redis/redis/issues/2672

要强调的一件事:Redis Cluster 不是答案(在上面的问题中讨论过,或查看下面的 youtube 链接以获取更多详细信息)

我在这里找到了一个关于扩展 Redis pubsub 的有趣解决方案:https://redislabs.com/wp-content/uploads/2018/04/Redis-Day-TLV-2018-Scaling-Redis-PubSub.pdf

观看 youtube:https://www.youtube.com/watch?v=6G22a5Iooqk&ab_channel=RedisLabs

【讨论】:

以上是关于使用 Redis 扩展 Socket.IO,然后扩展 Redis 本身的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上使用集群和 socket.io-redis 扩展 node.js socket.io@1.*.*

使用 socket.io-redis 和 RedisToGo 在 Heroku 上扩展到 2+ dynos

Socket.io & Redis - 适合 io 游戏的架构?

使用集群将 Socket.IO 扩展到多个 Node.js 进程时的一些问题

关于使用PHP socket.io 做消息推送服务

使用 Redis 在 PHP 和 socket.io/node.js 之间进行通信