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

6

使用Node.js和socket.io一段时间后,我明白如果我希望我的应用程序支持高达1百万个并发用户,我需要对其进行扩展。因此,我开始使用Redis来在套接字之间发布/订阅消息,并运行大量的socket.io服务实例,在同一台机器上和其他机器上运行,但所有我的socket.io服务器都使用相同的Redis服务器。

这使我想:这有什么意义吗?我是否需要更多的redis服务器并在它们之间进行扩展?我的观点是,顶级服务器上总会存在瓶颈。

我的问题是,Redis是否可以扩展?如果可以,那么连接到不同socket.io服务器的所有socket如何在Redis服务器之间进行发布/订阅?


请问,您是否在发布/订阅中使用相同的连接?谢谢。 - user1255808
不,为每个连接的客户端创建2个客户端。 - udidu
非常抱歉,我想说的是不使用发布/订阅模式。那么呢?谢谢。 - user1255808
你读过我在 https://dev59.com/q2855IYBdhLWcg3wQyDh#4446424 上的这篇文章吗?那个例子可以写得更好!然后一个 Redis 实例就可以扩展所有的 Socket.io 服务器! - Alfred
2个回答

2
我认为你正在寻找的是Redis Cluster。在那个页面上,它被提到正在“进行中”,并且“希望在今年夏天”推出。
这里有一个演示here。基本上是哈希+单主和从备份。但它还没有准备好。获取更多信息的最佳途径是访问产品论坛和IRC。
如果有人正在做类似的事情,他们会在这些渠道上。

1
或者,如果您的应用程序是唯一请求Redis的客户端,请通过进行客户端哈希来自己实现。快速搜索Node.js中可用的库以帮助您:https://github.com/bnoguchi/node-hash-ring。(如果您不熟悉“一致性哈希”术语,请阅读所引用的博客文章,该术语基本上允许您具有最小的开销并相应地重新哈希弹性缩放服务器,而无需事先定义服务器数量)。顺便说一句:这仅处理分片。复制/高可用性也必须得到处理。 - Geert-Jan
2
没错,Redis Cluster是解决这个问题的最佳选择。我从2012年4月开始就一直在使用它来处理其他事情和发布/订阅,效果非常好 :) 我编写了一个nodejs模块,帮助您处理Redis Cluster并为您执行客户端哈希,您只需要提供一个节点地址,如果您正确配置了集群,它将为您发现其他节点:https://github.com/joaojeronimo/node_redis_cluster - João Pinto Jerónimo

0

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

需要强调的一件事是:Redis集群不是答案(在上面的问题中讨论过,或者查看下面的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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接