Node.js如何处理高频websocket事件?异步函数是并行还是串行执行?
解答
1. 事件处理的执行逻辑
你写的代码中,Node.js不会等待前一个事件处理完成再处理下一个,所有异步函数是 IO层面并行执行 的:
- Node.js的EventEmitter机制每收到一个新事件就会立刻触发对应回调,不会等待前一个回调执行结束
- async回调执行到
await callHttp(data)时,会暂停当前回调的执行,让出主线程处理其他任务,此时新的websocket事件到达会直接触发新的回调 - 你当前的场景每秒上千条事件,会同时发起大量HTTP请求,没有限流的情况下很容易出现连接耗尽、下游接口限流、内存溢出等问题。
2. 替换为.then写法运行逻辑无变化
async/await是Promise的语法糖,替换为.then写法后运行逻辑完全一致,比如修改为以下代码:
socket.on('event1', (data) => { callHttp(data).then(() => { // 原await之后的逻辑放在此处 }) })
和之前的await写法效果完全相同:事件触发后立刻调用callHttp发起请求,IO等待过程不会阻塞后续事件的处理。
补充说明
如果你需要实现串行处理(等前一个事件处理完成再处理下一个),需要自行实现队列逻辑:给每个socket的事件维护待处理队列,前一个任务执行完成后再从队列取出下一个任务执行。
内容的提问来源于stack exchange,提问作者Francesco Clementi
相关产品推荐
相关产品推荐

