Оптимизированная доставка уведомлений для операций массовой вставки
Представьте, что вы управляете системой, в которой сотням сотрудников назначаются ваучеры на основе различных критериев, таких как отдел, разряд или опыт. Эффективно оповестить каждого сотрудника, не создавая узких мест в системе, — колоссальная задача. 🔔 Эта задача становится еще более сложной, если вы стремитесь избежать сложностей, связанных с сокетами или механизмами опроса.
В таких сценариях события на стороне сервера (SSE) становятся мощным, но простым решением. Используя SSE в своем приложении NestJS, вы можете установить канал связи в реальном времени для уведомления определенных групп сотрудников на основе динамических критериев. Например, когда ваучеры распределяются по отделу продаж, уведомления должны получать только эти сотрудники, что обеспечивает точные и содержательные обновления.
В этой статье мы рассмотрим практический пример, демонстрирующий, как интегрировать SSE в процесс массовой вставки с помощью NestJS. Мы пройдемся по жизненному циклу: от запуска событий на серверной части до прослушивания обновлений на внешней стороне, сохраняя при этом бесперебойную работу. 💼
Независимо от того, разрабатываете ли вы инструмент для управления персоналом или финансовое приложение, понимание этого рабочего процесса позволит вам доставлять персонализированные уведомления в режиме реального времени. Давайте разберемся в простоте SSE и в том, как он может улучшить взаимодействие с пользователем вашего приложения.
Команда | Пример использования |
---|---|
@Sse | Декоратор NestJS, используемый для определения конечной точки событий на стороне сервера (SSE). Например, @Sse('ваучер-сотрудник') настраивает конечную точку для потоковой передачи обновлений клиенту в реальном времени. |
fromEvent | Функция из RxJS, которая преобразует событие, отправленное EventEmitter в наблюдаемый поток.
Например, fromEvent(this.eventEmitter, 'ваучер после добавления') прослушивает определенное событие. |
Observable | Основная концепция RxJS, используемая для управления асинхронными потоками данных.
Это важно для обработки событий на стороне сервера в NestJS, например наблюдаемый<MessageEvent> . |
@InjectQueue | Декоратор NestJS, который внедряет экземпляр очереди, полезный для управления обработкой заданий с помощью таких библиотек, как Bull.
Например, @InjectQueue('allotVoucher') обеспечивает доступ к очереди с именем «allotVoucher». |
WorkerHost | Базовый класс BullMQ, который позволяет определять собственные обработчики заданий в NestJS.
Например, РаспределитьВаучерПотребитель класс расширяется РабочийХост для решения конкретных задач. |
@OnWorkerEvent | Декоратор, используемый для прослушивания определенных событий жизненного цикла задания очереди.
Например, @OnWorkerEvent('завершено') обрабатывает событие «завершено» задания. |
createMany | Команда Prisma, используемая для одновременной вставки нескольких записей в базу данных.
Например, prisma.employee Voucher.createMany добавляет ваучеры всех сотрудников за одну операцию. |
EventSource | API JavaScript для получения событий, отправленных сервером (SSE) из серверной части.
Например, новый EventSource('http://localhost/vouchered-employee') устанавливает соединение для потоковой передачи данных. |
add | Метод из очередей Bull для добавления нового задания в очередь.
Например, allotVoucherQueue.add('выделенный-ваучер', jobData) планирует задание на обработку. |
@OnEvent | Декоратор NestJS, который прослушивает определенные события, создаваемые внутри приложения.
Например, @OnEvent('после выделения ваучера') запускает метод при возникновении этого события. |
Эффективные уведомления с помощью событий и очередей на стороне сервера
Предоставленные сценарии иллюстрируют систему, в которой уведомления в режиме реального времени отправляются сотрудникам после массовой вставки записей ваучеров в базу данных. Процесс начинается в Аллокатеваучерконтроллер, который предоставляет конечную точку для создания задач распределения ваучеров. Когда задача создается, она генерирует событие с именем ваучер после распределения. Это событие необходимо для запуска последующих шагов, гарантируя, что система будет управляемой событиями и модульной. Такая конструкция позволяет четко разделить задачи, делая систему более удобной в обслуживании и масштабируемой. 🎯
На уровне обслуживания Распределить ваучерсервис обрабатывает логику задач постановки в очередь с помощью BullMQ. После получения ваучер после распределения событие, оно добавляет задание в очередь с именем ваучер на выделение. Эта очередь обеспечивает асинхронную обработку, гарантируя, что система останется отзывчивой даже при обработке больших наборов данных. Например, если вы распределяете ваучеры 200 сотрудникам отдела продаж, очередь гарантирует, что операция не заблокирует другие запросы. Конфигурация очереди включает в себя такие параметры, как удалитьOnComplete чтобы поддерживать Redis в чистоте после завершения задания.
Задания очереди обрабатываются РаспределитьВаучерПотребитель сорт. Здесь реализована логика идентификации соответствующих сотрудников и внесения записей о ваучерах в базу данных. Команда «Призма» создатьМного используется для пакетной вставки записей в сотрудникВаучер таблица, оптимизированная по производительности. После завершения операции с базой данных генерируется другое событие для уведомления подписчиков. Это событие гарантирует, что сотрудники будут уведомлены только после успешной обработки массовой вставки, что повышает надежность системы уведомлений. 🌟
На внешнем интерфейсе компонент React прослушивает события, отправленные сервером, через Источник событий. Когда сотрудники получают уведомления, их данные динамически обновляются в пользовательском интерфейсе без необходимости обновления страницы. Такой подход обеспечивает удобство взаимодействия с пользователем, аналогично обновлениям в реальном времени, которые можно увидеть в современных веб-приложениях, таких как прямые трансляции спортивных результатов или уведомления в социальных сетях. Например, сотрудники отдела кадров не увидят обновления, предназначенные для продаж, поскольку серверная часть точно фильтрует события на основе критериев распределения. Эта специфика повышает производительность и актуальность, создавая систему, ориентированную на пользователя. 🖥️
Массовая отправка уведомлений с помощью серверных событий (SSE) в NestJS
Это решение демонстрирует серверный подход к использованию NestJS с Prisma и событиями на стороне сервера (SSE) для массовых операций. Он включает в себя архитектуру, управляемую событиями, и систему очередей.
// Backend: AllocateVoucherController
import { Controller, Post, Body, Sse, OnEvent } from '@nestjs/common';
import { AllocateVoucherService } from './allocate-voucher.service';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { Observable } from 'rxjs';
import { map, fromEvent } from 'rxjs';
@Controller('allocate-voucher')
export class AllocateVoucherController {
constructor(
private readonly allocateVoucherService: AllocateVoucherService,
private readonly eventEmitter: EventEmitter2
) {}
@Post()
async create(@Body() createDto: any) {
const result = await this.allocateVoucherService.create(createDto);
return result;
}
@Sse('vouchered-employee')
updatedEmployeeEvent(): Observable<MessageEvent> {
return fromEvent(this.eventEmitter, 'after-added-voucher').pipe(
map((data) => new MessageEvent('after-added-voucher', { data })),
);
}
}
Обновления в реальном времени для массовых вставок с использованием NestJS и React
В этом примере внешнего интерфейса React используется для прослушивания событий на стороне сервера и динамического обновления пользовательского интерфейса по мере получения данных. Это гарантирует, что сотрудники будут получать уведомления в режиме реального времени после массовых вставок.
// Frontend: React Component for SSE
import React, { useEffect, useState } from 'react';
const EmployeeUpdates = () => {
const [employees, setEmployees] = useState([]);
useEffect(() => {
const eventSource = new EventSource('http://localhost:3000/allocate-voucher/vouchered-employee');
eventSource.onmessage = (event) => {
const newEmployee = JSON.parse(event.data);
setEmployees((prev) => [...prev, newEmployee]);
};
return () => eventSource.close();
}, []);
return (
<table>
<thead>
<tr><th>Name</th><th>Voucher</th></tr>
</thead>
<tbody>
{employees.map((emp) => (
<tr key={emp.id}><td>{emp.name}</td><td>{emp.voucher}</td></tr>
))}
</tbody>
</table>
);
};
export default EmployeeUpdates;
Уведомления о модульном тестировании для операций массовой вставки
Этот тест Jest гарантирует, что механизм генерации событий и уведомлений работает правильно в серверной части для событий на стороне сервера в NestJS.
// Jest Test: AllocateVoucherService
import { Test, TestingModule } from '@nestjs/testing';
import { AllocateVoucherService } from './allocate-voucher.service';
import { EventEmitter2 } from '@nestjs/event-emitter';
describe('AllocateVoucherService', () => {
let service: AllocateVoucherService;
let eventEmitter: EventEmitter2;
beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({
providers: [AllocateVoucherService, EventEmitter2],
}).compile();
service = module.get(AllocateVoucherService);
eventEmitter = module.get(EventEmitter2);
});
it('should emit after-allocate-voucher event', async () => {
jest.spyOn(eventEmitter, 'emit');
const result = await service.create({ someData: 'test' });
expect(eventEmitter.emit).toHaveBeenCalledWith('after-allocate-voucher', result);
});
});
Улучшение систем реального времени с помощью SSE в NestJS
Хотя мы изучили реализацию событий на стороне сервера (SSE) для уведомления сотрудников о распределении ваучеров, существует более широкий вариант использования SSE в системах реального времени. SSE отлично подходит для сценариев, когда клиентам необходимо получать обновленные данные сервера без постоянного опроса. Например, представьте себе розничную онлайн-платформу, отслеживающую обновления запасов в реальном времени во время быстрой распродажи. Используя SSE, вы можете эффективно отправлять обновления всем подключенным клиентам, гарантируя, что они просматривают последние уровни запасов без лишней нагрузки на сервер. Такой подход обеспечивает масштабируемость, сохраняя при этом удобство работы пользователя. 🛒
Включение передовых систем массового обслуживания, таких как BullMQ, как мы это сделали с ваучер на выделение очереди, повышает надежность задач обработки больших объемов данных. Очередь гарантирует, что даже в случае перезапуска сервера ожидающие задачи останутся нетронутыми и обработка возобновится. Кроме того, можно настроить механизмы повтора, гарантирующие автоматический повтор неудачных заданий (например, из-за временного простоя базы данных). Например, если при распределении 300 сотрудников по отделам возникает временная ошибка, устойчивость очереди гарантирует, что ни одна запись не останется необработанной, что повышает надежность вашей системы.
Помимо уведомлений в режиме реального времени, SSE также может дополнять службы электронной почты для задач, требующих подробных сводок. После того как все уведомления о ваучерах будут отправлены через SSE, серверная часть может асинхронно создать отчет и отправить сводное электронное письмо менеджерам. Эта многоканальная связь обеспечивает как немедленные уведомления, так и комплексные последующие действия, удовлетворяя широкий спектр предпочтений пользователей. Такая интеграция повышает гибкость вашей системы, создавая всесторонний пользовательский опыт. 📧
Часто задаваемые вопросы о SSE в NestJS
- Каковы преимущества использования событий на стороне сервера по сравнению с WebSockets?
- SSE проще реализовать и использует HTTP, что делает его удобным для брандмауэра. В отличие от WebSockets, для него требуется только одно однонаправленное соединение, что эффективно для обновлений в реальном времени.
- Могу ли я использовать @Sse с несколькими конечными точками в контроллере?
- Да, вы можете определить несколько @Sse конечные точки в одном контроллере для обслуживания разных потоков данных клиентам в зависимости от конкретных потребностей.
- Как обрабатывать ошибки во время обработки очереди?
- С помощью BullMQ вы можете определить параметры повтора и использовать прослушиватели событий, например @OnWorkerEvent('failed') для регистрации ошибок и повторной обработки заданий при необходимости.
- Есть ли у Prisma's createMany метод поддержки откатов транзакций?
- Да, Призма createMany может быть обернуто в транзакцию. Если какая-либо операция в транзакции завершается неудачно, все операции откатываются для обеспечения согласованности.
- Что произойдет, если клиент отключится во время потока SSE?
- Сервер прекращает отправку обновлений, как только обнаруживает отключение. Вы можете реализовать логику повторного подключения на клиенте, используя EventSource API.
- Можно ли использовать SSE для двусторонней связи?
- Нет, SSE является однонаправленным (от сервера к клиенту). Для двунаправленной связи используйте потоки WebSockets или HTTP2.
- Как защитить конечные точки SSE в NestJS?
- Используйте охранники или промежуточное программное обеспечение, например @UseGuards, чтобы обеспечить аутентификацию и авторизацию для ваших конечных точек SSE.
- Может ли SSE работать с небраузерными клиентами?
- Да, любой клиент, поддерживающий HTTP и потоковую передачу событий (например, Node.js, cURL), может использовать потоки SSE.
- Каково максимальное количество клиентов, которые могут подключиться к конечной точке SSE?
- Это зависит от конфигурации вашего сервера и ограничений ресурсов. Балансировка нагрузки и кластеризация могут помочь в масштабировании для поддержки большего количества клиентов.
- Можно ли отправлять данные JSON через SSE?
- Да, вы можете сериализовать объекты в строки JSON и отправлять их с помощью new MessageEvent в NestJS.
Эффективные уведомления в реальном времени в NestJS
Реализация систем реального времени с использованием СШЭ в NestJS упрощает связь между сервером и клиентами. Этот метод снижает нагрузку на сервер по сравнению с постоянным опросом и обеспечивает точный таргетинг уведомлений. Например, инструмент управления персоналом может уведомить 200 сотрудников отдела продаж о новых ваучерах, не мешая остальным. 🎯
Благодаря таким инструментам, как BullMQ и Prisma, эта установка обеспечивает асинхронную обработку задач и эффективную работу с базой данных. Гибкость архитектуры, основанной на событиях, делает ее масштабируемым решением для различных требований реального времени, повышая вовлеченность пользователей и надежность системы.
Источники и ссылки
- Подробная документация по NestJS Framework для создания масштабируемых серверных приложений.
- Руководство по использованию BullMQ для надежного управления очередью заданий в приложениях Node.js.
- Официальный Документация Призмы для операций с базой данных и использования ORM.
- Информация о События, отправленные сервером (SSE) для связи клиент-сервер в режиме реального времени.
- Практические примеры реализации фронтенда из Документация ReactJS для создания интерактивных пользовательских интерфейсов.