Пейджер

🌍 Привет мир! 👋🏻

🌍 Привет мир! 👋🏻

Сегодня важная тема о том, почему плохо использовать обычный Map в Node.js для кэширования данных. 🤨

💥 В чём проблема?

Рассмотрим пример:

protected translationsCache: TranslationsCache = new Map();

if (this.translationsCache.has(key)) {
  return this.translationsCache.get(key);
} else {
  const data = await complexAndHeavyLogic(key);
  this.translationsCache.set(key, data);
  return data;
}


На первый взгляд 👀, всё просто и понятно. Но проблема всплывает, когда ваше приложение развёрнуто на нескольких инстансах Node.js (например, за балансировщиком нагрузки).

🌐 Что значит несколько инстансов приложения и для чего это нужно?

Когда ваше приложение становится популярным, одного инстанса Node.js может не хватать для обработки всех запросов. Чтобы приложение не падало под нагрузкой и быстрее отвечало пользователям, запускается несколько одинаковых экземпляров (инстансов) приложения, между которыми балансировщик нагрузки равномерно распределяет входящие запросы.

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

⁉️ Почему локальный Map плохо подходит в таком случае?

Каждый инстанс Node.js хранит свою отдельную копию Map. Данные, сохранённые в одном инстансе, недоступны в других. Таким образом тяжёлая бизнес-логика повторно выполняется на каждом новом инстансе, что приводит к ненужным затратам ресурсов.

🔥 К чему это приводит?

✏️ Повышение нагрузки на серверы и базы данных.
✏️ Значительное падение производительности приложения.
✏️ Нестабильность работы в условиях высоких нагрузок.

💡 Как делать правильно?

Использовать централизованные системы кэширования:

🔖 Redis
🔖 Memcached
🔖 Другие распределённые кэши

Это гарантирует, что данные будут одинаковыми и актуальными для всех инстансов вашего приложения.

⚙️ Пример правильного подхода (Redis):

const data = await redis.get(key);

if (data) {
  return JSON.parse(data);
} else {
  const result = await complexAndHeavyLogic(key);
  await redis.set(key, JSON.stringify(result));
  return result;
}


🎙 Итог

Используйте правильные инструменты и подходы — избегайте локального кэширования в многопроцессорных средах. Ваше приложение скажет вам спасибо! 😄

💬 Делитесь своим мнением в комментариях👇! Если вам понравилась статья, не забудьте поставить лайк! 👍

#NODEJS #BESTPRACTICES
Медиа 1
Хотите больше таких постов?
Подпишитесь на канал и читайте продолжение в Telegram.
Подписаться на @ivanchikovitclub Открыть пост в Telegram