Утечка памяти узла при использовании redis brpop - PullRequest
0 голосов
/ 07 апреля 2020

У меня проблема с утечкой памяти в приложении узла. Приложение подписано на 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.

1]

PS blk - это имя объекта клиента Redis, используемое исключительно для команд блокировки, например brpop.

Редактировать : заменены brpop на rpop, и мы наблюдаем значительное снижение скорости роста памяти, но теперь распределение сообщений между рабочими перекошено.

...