Какие шаблоны проектирования вы применяли в своих проектах, такие как очередь сообщений, асинхронные пулы, enterprise bus или разделение команды и запроса?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
При разработке высоконагруженных frontend-приложений и SPA активно использовались следующие шаблоны проектирования:
-
CQRS (Command Query Responsibility Segregation): Разделение операций изменения состояния (команды) и операций получения данных (запросы). Это позволяет оптимизировать обработку данных для чтения и записи независимо, повышая производительность и масштабируемость.
-
Publisher/Subscriber (Pub/Sub): Реализация системы событий, где компоненты могут подписываться на определенные типы событий и получать уведомления о них. Используется для слабой связанности между модулями и асинхронного взаимодействия.
-
Mediator: Использование центрального объекта-посредника для координации взаимодействия между различными модулями или компонентами. Помогает уменьшить прямую связанность между объектами.
-
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: 'Иван' });