【问题标题】:Node.js and Express with socket.io on Heroku - H12 & H13 errorsNode.js 和 Express 与 Heroku 上的 socket.io - H12 和 H13 错误
【发布时间】:2017-01-18 12:51:02
【问题描述】:

目前正在使用 Node、Express 和 Socket.io 构建一个运行 Heroku Standard-1X dyno 的项目。该应用程序的前提相当简单:人们从客户端搜索项目(作为字典存储在引擎盖下,就像这样):

    ['Item':'Coffee', 
    'Id':0247508725,
    'Location': 'Baker Street']

并选择它们,然后将项目键值推送到节点服务器并存储在列表中。其余客户端“实时”检索该列表。客户端都是原生构建的 Swift iOS 应用

我第一次运行它时大约有 60 个用户,所有用户同时搜索和添加项目。 Heroku 仪表板的结果非常可怕:

我以为我测试得很彻底,我从未见过这么多 H12 和 H13 错误。我的一部分认为这可能是我服务器端的低效代码,或者只是缺乏适当的 Node 实现来处理如此多的请求,所以我不会因为整个单线程处理而一直等待 I/O。

这是一个运行以在该列表中添加项目的功能服务器端的示例:

clientSocket.on("additionToList", function(Location,Item,Id){
  client.query("INSERT q_venue_list (item_name, item_id, at_location) VALUES ($1, $2, $3)",[Item,Id,Location], function(err, result) {
if(err) {
  return console.error('error running insert', err);
}
io.sockets.in(Location).emit('updateList');
  });
});

当房间Location中的客户端套接字接收到'updateList' 命令时,他们会拉取新列表。存储和检索都可以正常工作,但是由于某些原因,所有这些人都陷入了困境并且非常滞后。 我几乎不知道自己在做什么,但我只是想了解我可能会出错的地方。我无法集群,因为我只能访问一个核心,所以下一个最佳选择是探索异步?会不会是可怕的设备信号,加上等待导致所有超时的 I/O?

我只是想了解这一点,感谢任何帮助。如果我能提供更多信息,请告诉我。

【问题讨论】:

  • 如果没有更多代码,我无法真正分辨出怎么了上下,但似乎很多错误表明你没有利用 Node 的异步潜力。
  • @sova 你可能是对的。您是否遇到过任何资源,可以用更通俗的术语很好地为正在学习的人提供这些概念?
  • 好吧,最近自己刚刚掌握了回调模型,我强烈推荐codeschool的课程“使用node.js的实时网络”一些视频和互动练习来帮助你了解要点。尝试阅读 javascript 事件循环作为一个很好的补充。
  • 你是把socket.io附加到http服务器上,还是在每个expresses路由中都有socket.io?
  • @DavidGatti 都附在http服务器上

标签: node.js express heroku socket.io


【解决方案1】:

对于遇到此类奇怪问题的任何人,我最终弄清楚了问题所在。我没有在applicationDidEnterBackgroundapplicationWillResignActive 上释放套接字层并断开连接(socket.disconnect)。这导致后端的套接字等待超时(55 秒)。在它等待的整个过程中,它一直在阻塞事件循环的其余部分;因此,其他传入请求将等待,然后它们也会超时。

tl;dr:请注意打开和关闭套接字。当用户退出应用程序时不要忘记关闭它们。

【讨论】:

    猜你喜欢
    • 2022-07-25
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 2015-12-25
    • 2012-07-08
    • 2018-06-19
    • 2020-07-12
    • 2018-10-14
    相关资源
    最近更新 更多