目前使用Node,Express和Socket.io构建一个运行Heroku Standard-1X
dyno的项目。该应用程序的前提非常简单:人们从客户端搜索物品(存储在引擎盖下作为Dicts,如此):
['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?
我只是想了解这一点,感谢任何帮助。如果我能提供更多信息,请告诉我。
答案 0 :(得分:1)
对于遇到这个奇怪问题的人来说,我最终想出了问题所在。我没有在socket.disconnect
或applicationDidEnterBackground
上释放套接字层并断开连接(applicationWillResignActive
)。这导致后端的套接字等待超时(55秒)。它等待的整个时间,它正在阻塞事件循环的其余部分;因此,其他传入的请求会等待,然后它们也会超时。
tl; dr :要努力打开和关闭你的插座。当用户退出应用程序时,不要忘记关闭它们。