我有一个聊天应用程序,有巨大的聊天室(15'000用户连接到一个房间)。只有少数有权写,所以理论上不应该有巨大的负载。我注意到有性能问题:当只发送一条消息时,服务器CPU负载会达到30%-50%,消息的发送速度会很慢(如果您编写多条消息,可能会延迟1秒,甚至更慢)。我已经使用clinic-flame分析了性能。我发现以下代码是问题所在:socket.to("room1").emit(/* ... */);
,这将触发www.example.com中的send()
engine.io和ws
库中的clearBuffer
。
是否有人知道我是否做错了什么,以及如何优化性能?
2条答案
按热度按时间egdjgwm81#
您可以对sokets.io服务器进行负载平衡。
我还没有这样做,但你有关于这样做的信息在这里:https://socket.io/docs/v4/using-multiple-nodes
如果您使用node.js作为http服务器:https://socket.io/docs/v4/using-multiple-nodes#using-nodejs-cluster
或者,你可以考虑使用redis.有一个软件包允许在进程或服务器的集群上分发流量:
https://github.com/socketio/socket.io-redis-adapter
oknwwptz2#
如果您拥有多达15k到20k的用户,则不必管理负载平衡,请按照以下说明操作。
1.在套接字代码中,不要使用await async。
1.在套接字代码中,不要使用任何DB查询。
1.使用套接字从某人那里获取数据并将这些数据提供给其他人,如果您想存储这些数据,请在将数据发送到套接字之前或之后使用API进行存储。
这一切都是关于你如何使用它。查询和等待所有这些都将减缓你的响应和加载,总是有一种方法来做不同的事情。
上面的3个建议提高了我的插座性能,我希望它对你也有同样的作用。