7

这些天我一直在阅读许多关于 Socket.IO 的博客,并且对它的特性印象深刻。我打算将它用作聊天应用程序之一,并且对于具有最少用户数量的普通用户来说,它运行良好。但是在生产网络中使用时,Socket.IO 有什么陷阱吗?Socket.IO 是否最适合消息流非常庞大的大型消息传递系统。如果是,那么与 Socket.IO 一起使用的最佳技术堆栈是什么,以使其“即使在负载更多时也能 100% 可靠”工作。任何人都已经有使用 Socket.IO 实现大规模消息传递系统的经验。我想使用的堆栈是 Socket.IO、Redis、Cassandra 和 MySQL。

到目前为止,我已经浏览了许多 Socket.IO 的示例,并且许多人试图以不同的方式进行操作。有些人使用 Array 来存储 Socket id,而有些人使用 Redis。我知道使用 Redis 肯定会有所帮助。但我不想止步于此。我想学习 Socket.IO 应用程序的最佳架构。

请建议我一条通往它的道路。

编辑

对我来说,最好的堆栈不过是与其他堆栈相比失败率更低的堆栈。

4

1 回答 1

17

您首先需要了解 Socket.IO 只是WebSocket协议的一个抽象,而且是一个非常优雅的抽象。由于它享有令人难以置信的支持,当您需要跨公共网络在服务器和客户端之间进行双向通信时,该协议本身可能是您今天可以做出的最佳选择,因此您肯定走在正确的轨道上。

操作 Socket.IO 服务器所需的资源主要围绕连接总数和在任何给定时间点传输的数据。话虽如此,Socket.IO 服务器绑定到网络 I/O,并将扩展到您的网络硬件可以处理的尽可能多的客户端。

值得考虑的是 Socket.IO 是建立在异步网络库之上的。延迟阻止来自其他服务的 I/O,使服务器能够继续处理其他通信。内存占用通常包含连接的内存表示和正在传输的即时数据——即使一个客户端可能正在将兆字节的数据中继到其他客户端,它也会以离散块的形式流式传输数据,并且一旦一个块被传输成功传输给各方资源立即释放。

当然,即使管理简单的通信,例如跨多个房间的多个用户之间的聊天消息,也不可能扩展到像 Freenode 这样的规模,它可以在数千个房间中拥有数十万用户,只需单个服务器。

这就是 Redis 之类的服务发挥作用的地方,您可以在其中使用高可用的中央存储来存储一些中间的、有代表性的连接数据,通过在多个 Socket.IO 实例之间无缝分布客户端来水平扩展。

您现在可以获得 99% 以上的可靠性,通过使用像 CoreOS 这样的堆栈将架构的每个不同部分描述为可以分布在可用硬件上的单元,在负载增加时引入新实例,在这些出现时使用 etcd 等服务进行发现或者突然变暗,分布式 WebSocket 代理(如hipache)以保持所有 Socket.IO 实例饱和,但绝不允许任何一个耗尽所有可用资源。

于 2014-07-29T20:12:06.660 回答