У меня проблема с утечкой памяти в приложении узла. Приложение подписано на topi c в redis и при получении сообщения выскакивает сообщение из списка, используя brpop
. Существует несколько экземпляров этого приложения, работающего в рабочей среде, поэтому один экземпляр может блокировать сообщение в списке повторного ввода. Вот фрагмент кода, который принимает сообщение от redis:
private doWork(): void {
this.storage.subscribe("newRoom", (message: [any, any]) => {
const [msg] = message;
if (msg === "room") {
return new Promise( async (resolve, reject) => {
process.nextTick( async () => {
const roomIdData = await this.storage.brpop("newRoomList"); // a promisified version of brpop with timeout of 5s
if (roomIdData) {
const roomId = roomIdData[1];
this.createRoom(roomId);
}
});
resolve();
});
}
});
}
Я попытался отладить утечки памяти, используя отладчик chrome, и я наблюдал, как создавалось слишком много объектов замыкания. Я подозреваю, что это из-за этого кода, поскольку я могу видеть имя объекта клиента Redis в объекте замыкания, но я не могу понять, как я мог бы это исправить. Я добавил process.nextTick
, но это не помогло. Я использую node-redis
клиент для подключения к Redis. Прикрепление скриншота карты держателя объекта из отладчика chrome.
PS blk
- это имя объекта клиента Redis, используемое исключительно для команд блокировки, например brpop
.
Редактировать : заменены brpop
на rpop
, и мы наблюдаем значительное снижение скорости роста памяти, но теперь распределение сообщений между рабочими перекошено.