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

Posted

技术标签:

【中文标题】WebSockets(Socket.io)与heroku自动断开连接,我应该扩展吗?【英文标题】:WebSockets(Socket.io) disconnecting automatically with heroku, should I scale? 【发布时间】:2015-04-04 20:56:31 【问题描述】:

我的app 是在heroku 的服务器上使用ExpressJS、AngularJS 和socket.io 构建的。

最初,我的客户不断与heroku 的H12 error code 断开连接。我认为我的进程运行时间过长,但我听从了它的建议,将 socket.io 的 ping 间隔减少到 10 秒,将 ping 超时减少到 25 秒。进行此更改后,我的断开连接的频率降低了。

即使服务器仅支持 4-5 个客户端,断开连接仍然会发生。我的应用程序是一个简单的扑克牌游戏,我相信它不需要大量计算。同时,断开连接是非常不可取的,因为它是一个实时游戏。我还使用 CDN 和 AWS Cloudfront 处理了大多数静态资产。因此,我想知道我是否应该升级 Heroku Dyno 的 CPU,或者是否还需要增加 Dynos 的数量。

我是否需要对我的 socket.io 进行更多配置调整,例如 pingintervals 和 pingtimeouts。或者我应该在 Heroku 上升级/超越我的 Dynos?对不起,我对服务器优化的了解不多。非常感谢您的帮助!

以下是正常 ping 间隔的日志,其中没有发生任何事件。在这种情况下,根本不应该进行任何深度处理,但如日志所示,GET 方法大约需要 12 秒(Heroku 将在 30 秒时断开连接)。

2015-02-05T09:08:59.637350+00:00 heroku[路由器]: 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-02-05T09:09:12.074210+00:00 heroku[路由器]: at=info method=GET path="/socket.io/?EIO=3&transport=polling&t=1423127340438-25&sid=_5fURAV8_Gn5736HAAAC" host= daidi.herokuapp.com request_id=b54dedb6-1733-414a-8fd3-b8d8fd1f4516 fwd="42.60.78.220" dyno=web.1 connect=1ms service=12008ms status=200 bytes=207

【问题讨论】:

我遇到了完全相同的问题 【参考方案1】:

单个测功机支持 4-5 个客户应该没有任何问题(几百个应该没问题)。当然,这是假设您的服务器没有做任何其他 CPU 密集型操作。请记住,如果您在服务器上运行阻止操作,则更有可能断开用户连接。

我建议安装一些免费插件(strongloop、nodetime、new relic,随你喜欢),以深入了解你的 CPU/内存/网络级别。安装 event-loop-lag 模块并定期输出其值以查看是否有任何东西阻碍了您的事件循环,这也不是一个坏主意。

最后也要知道,在使用socket.io的时候看到各种错误是很正常的。它使用各种回退、长轮询等,可以使路由器(期待更传统的无状态、非实时请求)认为出现问题。除非您在客户端看到问题,否则我不知道我什至会担心它。当然,如果您看到客户端问题,那么请忽略所有这些......只是不要为了它而害怕 H12。

【讨论】:

以上是关于WebSockets(Socket.io)与heroku自动断开连接,我应该扩展吗?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以将 Websockets/Socket.IO 与蜂窝数据/4g 一起使用?

使用websockets手动连接socket.io 1.x,容量测试

从 socket.io 迁移到原始 websockets?

在 create-react-app 中使用 Socket.io-client 的 WebSockets 代理

WebSockets 和 Socket.io

Socket.io:WebSockets 可以处理多少并发连接?