Назад к вопросам
Senior
93
questionbank

Какие шаблоны проектирования вы применяли в своих проектах, такие как очередь сообщений, асинхронные пулы, enterprise bus или разделение команды и запроса?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

При разработке высоконагруженных frontend-приложений и SPA активно использовались следующие шаблоны проектирования:

  1. CQRS (Command Query Responsibility Segregation): Разделение операций изменения состояния (команды) и операций получения данных (запросы). Это позволяет оптимизировать обработку данных для чтения и записи независимо, повышая производительность и масштабируемость.

  2. Publisher/Subscriber (Pub/Sub): Реализация системы событий, где компоненты могут подписываться на определенные типы событий и получать уведомления о них. Используется для слабой связанности между модулями и асинхронного взаимодействия.

  3. Mediator: Использование центрального объекта-посредника для координации взаимодействия между различными модулями или компонентами. Помогает уменьшить прямую связанность между объектами.

  4. Asynchronous pools (на уровне UI/браузера): Управление параллельными асинхронными операциями (например, запросами к API) с ограничением количества одновременно выполняемых задач. Хотя это не классический пул потоков, в браузере реализуется контроль над количеством выполняемых асинхронных функций (например, промисов).

Хотя напрямую "очередь сообщений" или "enterprise bus" в классическом понимании на фронтенде не применялись, паттерны Pub/Sub и архитектурные подходы, близкие к CQRS, реализовали схожие принципы асинхронной обработки и распределения ответственности.

Пример реализации Pub/Sub:

// Простое хранилище событий и подписчиков
const events = {};

// Функция подписки
const subscribe = (eventName, callback) => {
  if (!events[eventName]) {
    events[eventName] = [];
  }
  events[eventName].push(callback);
};

// Функция публикации
const publish = (eventName, data) => {
  if (events[eventName]) {
    events[eventName].forEach(callback => {
      // Асинхронный вызов подписчика
      setTimeout(() => callback(data), 0);
    });
  }
};

// Пример использования
subscribe('userLoggedIn', (userData) => {
  console.log('Привет,', userData.name);
});

subscribe('userLoggedIn', (userData) => {
  console.log('Пользователь', userData.id, 'вошел в систему');
});

publish('userLoggedIn', { id: 123, name: 'Иван' });