我知道像这样的问题可能是一个见仁见智的问题,这就是我试图提供更多细节的原因。
我正在开发具有以下“功能”的 WebSocket 服务器应用程序:
- 2-3个连接可以指向同一个用户
- 用户有时可以相互交互。无论是突发还是连续数据交换
- 部分全局数据应始终在所有用户之间同步
- 部分全局数据应该在一些用户之间延迟(按需)同步
想到2个可能的结构:
- 工作线程。主线程处理所有网络 IO、连接-> 用户绑定以及存储/与全局数据交互。它还会向工作线程发送大量-s
postMessage
。当来自不同线程的 2 个玩家需要交互时,工作线程偶尔会相互交谈。可能的问题:postMessage
开销(主要来自我所理解的序列化)。理论上,对于大多数消息我可以尝试使用SharedArrayBuffer
. 我不认为它可以在此之外进行优化。- 主线程将处理网络 IO 和全局数据交互。也许这会成为瓶颈?
- 无状态 NodeJS 集群,将所有数据存储在 Redis 中,并利用偶尔锁定。问题/疑问:
- 会使用更多的内存
- 不管 Redis 有多快,与它的通信很可能会比使用
postMessage
-s 慢。 - 多台服务器真的会有用吗?听说将同一种类型的 IO 拆分成多个进程是个坏主意。或者至少不如使用本机 Node 异步 IO 有利。
- 我不认为有一种方法可以基于用户 id 之类的东西来捆绑连接。
- 根据请求获取和设置 Redis 数据很好。但是一个进程如何知道某个键是否被另一个进程修改了呢?