我将在几周后开始开发一款多人纸牌游戏,在此之前,我正在研究可用的最佳技术。我将使用PHP+MySQL作为服务器端,使用JS/HTML5作为客户端。游戏也将在手机浏览器中播放。
我的游戏涉及4个或更多的用户在一张桌子上玩,每个人有30秒的时间采取行动。将有多张桌子可用,用户可以同时玩一张以上的桌子。
根据我的研究,通过让服务器在每次其他玩家做出动作时通过SSE推送数据,将客户端与服务器同步似乎很容易。然后,当当前玩家采取行动时,请求数据将通过XMLHttpRequest从客户端发送到服务器,然后通过SSE同步到其他玩家。
现在,从我所读到的内容来看,这是一个很大的问题,因为对于每个监听SSE进程的播放器来说,服务器上的连接都是打开的,消耗了大量内存。我将构建的应用程序旨在随着时间的推移,在具有现代硬件(8核CPU、64GB RAM)的专用服务器上支持10000多名玩家。有些人可能会说PHP对此不好,但这里的争论是如何使用PHP来实现这一点。
SSE实现的替代方案是使用Websockets(我目前正在检查Ratchet,并设法从文档中设置了聊天服务器),但总的来说,我有一些困难,无法做出决定:
-
Websockets:当建立握手时,服务器上的连接也保持打开状态,与SSE中的连接相同,但我猜这是一种不同类型的连接,消耗的内存更少。是这样吗?所以websocket会更有效率。对SSE和WebSockets的内存使用情况有什么估计吗?我在某个地方读到,通过SSE的每个连接使用APACHE和PHP将消耗约2000兆字节。对于10000个用户来说,这将是200GB(太多了)。我希望我错了。我不知道一个套接字连接会消耗多少内存。我是说一个无所事事的人。
-
SSE是否会消耗更多的电池(在手机上),并将导致比套接字连接更多的网络流量?
-
SSE:如果用户将在两张表上播放,我是否需要打开两个SSE进程(每个表一个),或者我如何告诉SSE进程我是在请求表1还是表2的数据?或者我被迫同时接收所有表的数据?接收用户现在活动的所有表的数据不会有问题,但我很好奇是否有自定义的方法。
-
和那些网络连接不稳定的人打交道怎么样?websocket支持自动重新连接吗?或者这需要从客户端手动完成?
1)WebSocket和SSE都保持连接打开吗
是的。只要服务器配置为打开连接,或者客户端或服务器关闭连接,WebSocket和SSE都会保持连接打开。因为很多时候,服务器默认配置为在空闲时间超过配置中指定的时间时关闭连接。
2)如果两者都保持连接打开,那么两者的内存消耗和网络开销是否相同?哪一个更轻更快
首先,在建立连接方面,两者似乎共享相同的资源,因为两者都必须第一次握手,并通过ping检查心跳,而休息是正常的单TCP连接。
但有一点需要注意,Websocket是双向的,SSE是单向的,所以即使SSE连接是活动的,并且您必须将一些数据从客户端发送到服务器,您也必须使用某种XHR,它将再次创建到服务器的另一个连接。创建连接是资源密集型的。因此,当这是双向的时,WebSockets似乎更善于资源利用,就像上面的OP情况下的多层纸牌游戏一样。这也使得WebSockets比SSE更快、更轻。当你只需要从服务器向客户发送数据时,SSE是很好的,比如一些股票市场价格、游戏分数等。
3)如果您的首选是WebSocket,那么我们是否需要担心URL重写、响应头等
我不这么认为,因为如果WebSockets与PHP一起使用,那么大多数时候它都是基于CLi的独立PHP脚本,通过一个连接到类似ws://example.com:8092/websocket.PHP的websocket。而且,我认为,如果需要的话,PHP脚本本身可以添加/修改头。
4)SSE是否会消耗更多的电池(在手机上),并会导致比套接字连接更多的网络流量
我认为SSE不会比WebSockets消耗更多的电池。但是的,它肯定会创建更多到服务器的流量,因为如上所述,SSE是单向的,从客户端到服务器的每个数据都会创建另一个到服务器的连接。
5)与互联网连接不稳定的人打交道怎么样?websocket支持自动重新连接吗?或者这需要从客户端手动完成
有一些技术可以在这种情况下处理这部分重新连接。