1

我不确定使用 node.js 时回调是如何“排队”的,这会导致担忧。

我有一个从节点 mqtt 客户端接收消息的 tcp 服务器。当消息到达 mqtt 客户端的 onMessage 回调时,会调用一个方法将其发送到任何已连接的 TCP 客户端。服务器每秒处理(峰值)大约 150 条消息,每条消息 50 - 300 字节。

偶尔会有“神秘”锁定。服务器正在运行,但没有消息传递给客户端。

我突然想到,在 tcp 服务器完成使用“最后一个”消息为客户端提供服务之前,可能有一个“新”消息到达,我不确定这是否会混淆事情。我希望处理“较旧”消息处理程序的函数可能会被推送到堆栈上,以支持后来的到达 - 在所有新消息都得到服务后继续。

目前我没有使用任何互斥锁或其他设备来防止对传递消息的函数的重叠调用。所以我的问题是,我应该信任节点和 mqtt 客户端来处理可能重叠到达的这种级别的消息传递,还是我需要构建某种节流、排队或互斥机制?如果是这样,kue 模块会是一个合乎逻辑的方式吗?

4

1 回答 1

2

原来问题不在我的服务器上,而是在客户的客户端上。客户端无法跟上消息量(可能是由于他们端的一些阻塞代码)。

我通过将 mqtt 消息运行到出队中并限制发送到客户端的消息数量以使消息之间的间隔不少于 5 毫秒,从而发现了这一点。令我惊讶的是(也很高兴),在我这样做之后,神秘的消息停止问题就消失了。

棘手的部分将是找到最小的消息间隙,使客户端能够可靠地工作,同时确保队列不会超过合理的大小。随着时间的推移,我将添加一些代码来管理最大队列大小,方法是丢失一些消息,直到客户可以修复他们的客户端代码。

于 2014-07-13T16:48:14.187 回答