有没有一种方法可以使用websoket重载Node.js事件循环

时间:2020-05-18 11:07:05

标签: node.js websocket event-loop

我在使用Node.js和websocket(https://www.npmjs.com/package/ws)的“ WS”实现时遇到问题。经过一阵激增(短时间内有大量消息),我得到的数据表明我“错过了”一条消息。

  • 我已经联系了发射服务器的所有者,他向我保证所有消息都已经发送到他的身边。
  • 我已经记录了我身边收到的每条消息(在函数on('message',()=> {})的开头,我似乎找不到消息,所以我的假设是甚至没有达到这一点

所以我想知道:

  • 消息将按FIFO顺序进行接收和处理。在处理当前消息期间,新消息将堆叠在节点事件循环中,然后立即进行计算。对吗有没有一种方法可以使事件循环变得“太大”而可能丢弃新的传入消息?如果是这样,它会悄悄地掉下来吗?还是程序严重崩溃(换句话说,如何查看消息是否已通过这种方式丢弃?)
  • “ ws”模块对收到的最大邮件数量有任何已知的限制吗?是否有内部丢弃消息的方法?
  • 有没有比“ ws”模块更好的选择?
  • 还有其他方法可以解释“缺失”消息吗?

非常感谢您的见解,

1 个答案:

答案 0 :(得分:1)

我在nodejs中使用ws来同时处理生产中来自许多客户端的大消息流,而我从未遇到过丢失消息的情况。每个服务器每秒处理来自数百个不同客户端连接的数千条消息。我的系统的工作方式是:如果ws丢弃了消息或更改了它们的顺序,我的用户就会大声抱怨。

这让我猜想您没有达到ws的任何限制。

在编程工作的早期,我有一个不太聪明的想法,就是将传入的消息放在我的nodejs代码中的队列对象中,然后“稍后”处理它们。这导致通过我的服务器的消息流令人难以理解。有时似乎我丢失了ws消息。我很高兴删除所有这些代码,并在其消息事件处理程序中完全调度每条消息。

Websocket连接有时会异常关闭。因为网络。您可以使用错误和关闭事件处理程序来捕获这些情况。消息的发送者或接收者可能需要一段时间才能检测到某种网络故障中断了其连接。这可能导致在发送方和接收方之间的消息计数方面存在分歧。值得调查。

我用消息计数修饰ws的连接对象(“装饰”-向对象添加特定于应用程序的属性),并在连接关闭时将这些消息计数放入日志中。