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