hackergame-challenge-docker
hackergame-challenge-docker copied to clipboard
add websocket ping per 15s
If backend does not periodically ping client, nginx will close the socket after idling for 60s according to proxy_read_timeout.
看了一下 https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API/Writing_WebSocket_servers#pings_and_pongs_the_heartbeat_of_websockets,我的理解可能是有问题的,我本地跑跑看。
我本地测试了没有问题,虽然我感觉 timeout killer 好像没有必要,但是放着问题应该也不大。
timeout killer 是考虑到如果有人掉线,两次没回复ping,就把nc停掉。 不加这个判断的话,TCP keepalive可能也有这个功能,但我不确定。我是看到 ws库的文档这么写了 就抄了一份过来。不加timeout killer确实也行,因为选手直接nc的话也有掉线的问题。
看了一下TCP keepalive默认情况是空闲两个小时才生效。所以如果选手直接掉线,而且题目也一直不输出消息的话,就会等到 min(2h, 题目超时) 才关闭。这样做之后可以把web终端的掉线关闭时间缩短到35s,但是直接nc的选手如果掉线还是会等到超时。
(叠个甲:以上内容都是我脑补的,并没有实际去测。可能不对。)