Heroku上的WebSockets(Socket.io)自动断开连接,我应该扩展吗?

4

我的应用程序是使用ExpressJS、AngularJS和socket.io在Heroku服务器上构建的。

最初,我的客户端一直遇到Heroku的H12错误代码而断开连接。我认为我的进程运行时间过长,但我按照它的建议将socket.io的ping间隔减小到10秒,并将ping超时时间减小到25秒。在进行此更改后,我的断开连接发生的频率较少。

即使服务器只支持4-5个客户端,仍然会发生断开连接。我的应用程序是一个简单的扑克牌游戏,我认为不需要强大的计算能力。同时,由于它是实时游戏,因此断开连接是非常不希望的。我还使用AWS CloudFront的CDN处理了大部分静态资产。因此,我想知道是否应该升级我的Heroku Dyno的CPU或者是否有必要增加Dyno的数量。

我是否需要在我的socket.io上进行更多的配置调整,例如ping间隔和ping超时时间。或者我应该在Heroku上升级/扩展我的Dynos?对于服务器优化我了解甚少,请提前谅解。非常感谢您的帮助!

以下是正常ping间隔的LOG,其中没有任何事件发生。在这种情况下,不应该进行任何深度处理,但是如日志所示,GET方法大约花费了12秒(当连接时间达到30秒时,Heroku将中断连接)。
2015-02-05T09:08:59.637350+00:00 heroku[router]: at=info method=POST path="/socket.io/?EIO=3&transport=polling&t=1423127340014-73&sid=MOLTkQP1knsflhZ3AAAB" host=daidi.herokuapp.com request_id=8faf8459-dfb3-4c3b-a7e2-6528c0ab9850 fwd="42.60.78.220" dyno=web.1 connect=2ms service=3ms status=200 bytes=255

2015年2月5日09:09:12.074210+00:00 heroku[router]: 信息:使用GET方法访问路径“/socket.io/?EIO=3&transport=polling&t=1423127340438-25&sid=_5fURAV8_Gn5736HAAAC”,主机为daidi.herokuapp.com,请求ID为b54dedb6-1733-414a-8fd3-b8d8fd1f4516,转发地址为42.60.78.220,动态网页为web.1,连接时间为1毫秒,服务时间为12008毫秒,状态码为200,字节数为207。


我遇到了完全相同的问题。 - Alexis
1个回答

1
一个 dyno 应该没有问题支持4-5个客户端(几百个应该也没问题)。当然,这是假设你的服务器没有进行任何其他占用 CPU 的操作。请记住,如果您在服务器上运行阻塞操作,您更有可能断开用户连接。
我建议安装一些免费的插件(strongloop、nodetime、new relic,或者您喜欢的其他插件),以了解您的 CPU/内存/网络水平。还可以安装 event-loop-lag 模块,并定期输出其值,以查看是否有任何东西阻塞了您的事件循环。
最后,还要知道,在使用 socket.io 时看到各种错误是非常正常的。它使用各种回退、长轮询等技术,这可能会让路由器(预期处理更传统的非状态、非实时请求)认为出现了问题。除非您在客户端看到问题,否则我不知道是否需要担心。当然,如果您在客户端看到问题,请忽略以上内容……只是不要因为 H12 而感到恐慌。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接