我的游戏玩法涉及4个或更多用户在桌子上玩,每个用户有30秒钟的时间来采取行动。将会有多张桌子可供选择,用户可以同时在多张桌子上玩。
从我的研究中得知,通过让服务器通过SSE推送数据,就可以很容易地将客户端与服务器同步,每当另一个玩家采取行动时,服务器就会推送数据。然后当当前玩家采取行动时,请求数据将通过XMLHttpRequest从客户端发送到服务器,然后通过SSE同步到其他玩家。
现在从我读到的内容来看,这种方法有一个很大的缺点,因为每个监听SSE进程的玩家都会在服务器上保持连接,消耗大量内存。我要构建的应用程序旨在支持10000个以上的玩家在一台配备现代硬件(8核CPU、64GB RAM)的专用服务器上运行,随着时间的推移。有些人可能会说PHP不适合这个,但这里的争论是如何使用PHP使其正常工作。
SSE实现的替代方案是使用Websockets(我正在检查Ratchet,并设法从文档中设置聊天服务器),但总体上我有一些困惑,阻止我做出决定:
1. WebSockets:在建立握手时,服务器上也会保持连接,与SSE相同,但我想这是一种消耗更少内存的不同类型的连接。这样WebSockets将更有效率。对于SSE和WebSockets的内存使用量有什么估计吗?我在某个地方读到,每个通过SSE连接都会消耗大约20MB的APACHE和PHP。那对于10000个用户来说就需要200GB(太多了)。我希望我是错的。我不知道一个空闲的套接字连接会消耗多少内存。
2. SSE会比套接字连接消耗更多电池(在手机上)并且会导致更多的网络流量吗?
3. SSE:如果一个用户在两张桌子上玩,我需要开启两个SSE进程(每个桌子一个),还是如何告诉SSE进程我正在请求table1或table2的数据?或者我被迫同时接收所有桌子的数据?接收当前用户活跃的所有桌子的数据不是问题,但我很好奇是否有自定义的方法。
4. 如何处理网络连接不稳定的人?Websockets是否支持自动重连?还是需要从客户端手动操作?