Nodejs emitter.setMaxListeners()的问题

Nodejs emitter.setMaxListeners()的问题

我使用exBuffer进行的socket数据分包

var exBuffer = new ExBuffer();
exBuffer.on('data', function(data){
	// do code
})
socketCli.on('data', function(data) {
   exBuffer.put(data);
});

在大并发量下,现在会报错

(node) warning: possible EventEmitter memory leak detected. 31 listeners added. Use emitter.setMaxListeners() to increase limit.
Trace
    at Socket.EventEmitter.addListener (events.js:175:15)
    at client.connection (/data/node/online/client.js:57:23)
    at EventEmitter.emit (events.js:96:17)
    at proc (/data/node/node_modules/ExBuffer/ExBuffer.js:151:26)
    at put (/data/node/node_modules/ExBuffer/ExBuffer.js:100:9)
    at Socket.client.connection (/data/node/client.js:96:22)
    at Socket.EventEmitter.emit (events.js:96:17)
    at TCP.onread (net.js:396:14)

使用的nodejs的NET建立socket,socket监听到的消息全部交给exBuffer处理进行分包,解决之前出现的粘包问题。

但是现在会报错,提示监听数量达到了最大值,最开始提示10,我设置为30后,现在又开始报错。


2 回复

Nodejs emitter.setMaxListeners()的问题

问题描述

在高并发场景下,当处理大量的Socket连接时,可能会遇到以下警告信息:

(node) warning: possible EventEmitter memory leak detected. 31 listeners added. Use emitter.setMaxListeners() to increase limit.

这种警告表明你已经添加了超过默认的最大监听器数量(通常是10个)。在这个例子中,我们使用了一个自定义的 ExBuffer 对象来处理从 socket 接收到的数据,并且这个对象上有多个事件处理器。

示例代码

var exBuffer = new ExBuffer();
exBuffer.on('data', function(data){
    // 处理接收到的数据
});

socket.on('data', function(data) {
    exBuffer.put(data);
});

解决方案

为了防止这个警告,你可以使用 emitter.setMaxListeners() 方法来增加每个事件发射器的最大监听器数量。默认情况下,EventEmitter 的最大监听器数量是10,但你可以根据需要增加它。

const EventEmitter = require('events');
const exBuffer = new ExBuffer();

// 增加最大监听器数量
exBuffer.setMaxListeners(50); // 设置为50

exBuffer.on('data', function(data){
    // 处理接收到的数据
});

socket.on('data', function(data) {
    exBuffer.put(data);
});

解释

  • setMaxListeners(n): 这个方法用于设置特定事件发射器的最大监听器数量。如果你不设置这个值,当添加的监听器数量超过默认值(10)时,Node.js 会发出警告。通过调用 setMaxListeners(n) 可以增加这个限制,从而避免警告信息。

注意事项

  • 虽然增加最大监听器数量可以解决当前问题,但最好还是考虑是否有更优化的方式来减少监听器的数量。例如,可以重用监听器或者在不再需要时移除它们。
  • 如果监听器数量仍然持续增加,可能需要检查你的代码逻辑,确保没有意外地添加过多的监听器。

通过上述方法,你可以有效地解决在高并发场景下可能出现的 EventEmitter 监听器数量超限问题。


在Node.js中,EventEmitter对象默认允许添加最多10个监听器。当超过这个限制时,Node.js会发出警告,提示可能发生了内存泄漏。在这个场景中,你遇到的问题是因为你的exBuffer对象上添加了太多的事件监听器。

可以通过调用emitter.setMaxListeners(n)方法来增加默认的最大监听器数量。然而,通常建议先检查为什么会有如此多的监听器被添加。如果真的需要处理大量数据或并发请求,可以适当地调整这个限制。

示例代码如下:

var exBuffer = new ExBuffer();
// 增加最大监听器数量至50
exBuffer.setMaxListeners(50);

exBuffer.on('data', function(data){
    // do code
});

socketCli.on('data', function(data) {
    exBuffer.put(data);
});

如果你发现即使设置了较高的最大监听器数量仍然会遇到问题,那么你需要进一步检查你的应用逻辑,确保没有无意中创建过多的监听器。例如,可能每个新的客户端连接都会导致一个新的监听器被添加到exBuffer上。确保在不需要时移除监听器(使用removeListeneroff方法),或者使用一次性监听器(使用once方法)以避免这种情况。

回到顶部