Спрощена доставка сповіщень для операцій масового вставлення
Уявіть, що ви керуєте системою, де сотням співробітників призначаються ваучери на основі різних критеріїв, таких як відділ, клас або досвід. Ефективно сповіщати кожного працівника, не створюючи вузьких місць у системі, — колосальне завдання. 🔔 Цей виклик стає ще складнішим, якщо ви прагнете уникнути складнощів сокетів або механізмів опитування.
У таких сценаріях серверні події (SSE) стають потужним, але простим рішенням. Використовуючи SSE у своїй програмі NestJS, ви можете встановити канал зв’язку в реальному часі для сповіщення певних груп співробітників на основі динамічних критеріїв. Наприклад, коли ваучери розподіляються до відділу продажів, лише ці співробітники мають отримувати сповіщення, забезпечуючи точні та змістовні оновлення.
У цій статті ми розглянемо практичний приклад, який демонструє, як інтегрувати SSE у процес масової вставки за допомогою NestJS. Ми пройдемося по життєвому циклу, від ініціювання подій у серверній частині до відстеження оновлень у зовнішній частині, зберігаючи безперебійну продуктивність. 💼
Незалежно від того, розробляєте ви HR-інструмент чи фінансовий додаток, розуміння цього робочого процесу дасть вам змогу надавати персоналізовані сповіщення в режимі реального часу. Давайте розгадаємо простоту SSE і те, як вона може підвищити користувацький досвід вашої програми.
Команда | Приклад використання |
---|---|
@Sse | Декоратор NestJS, який використовується для визначення кінцевої точки серверних подій (SSE). Наприклад, @Sse('ваучерований працівник') налаштовує кінцеву точку для потокової передачі оновлень клієнту в реальному часі. |
fromEvent | Функція з RxJS, яка перетворює подію, створену an EventEmitter в спостережуваний потік.
Наприклад, fromEvent(this.eventEmitter, 'after-added-voucher') прислухається до конкретної події. |
Observable | Основна концепція RxJS, яка використовується для керування асинхронними потоками даних.
Це важливо для обробки серверних подій у NestJS, наприклад Спостережувані<MessageEvent> . |
@InjectQueue | Декоратор NestJS, який додає екземпляр черги, корисний для керування обробкою завдань за допомогою бібліотек, таких як Bull.
Наприклад, @InjectQueue('allotVoucher') надає доступ до черги під назвою «allotVoucher». |
WorkerHost | Базовий клас від BullMQ, який дозволяє визначати спеціальні процесори завдань у NestJS.
Наприклад, AllotVoucherConsumer клас розширюється WorkerHost виконувати конкретні роботи. |
@OnWorkerEvent | Декоратор, який використовується для прослуховування певних подій життєвого циклу завдання черги.
Наприклад, @OnWorkerEvent('завершено') обробляє подію "завершено" завдання. |
createMany | Команда Prisma, яка використовується для одночасного вставлення кількох записів у базу даних.
Наприклад, prisma.employee Voucher.createMany додає ваучери всіх працівників за одну операцію. |
EventSource | API JavaScript для отримання подій, надісланих сервером (SSE) із серверної частини.
Наприклад, новий EventSource('http://localhost/vouchered-employee') встановлює з’єднання для потокового передавання даних. |
add | Метод від Bull queues для додавання нового завдання до черги.
Наприклад, allotVoucherQueue.add('allot-vaucher', jobData) планує завдання для обробки. |
@OnEvent | Декоратор NestJS, який прослуховує певні події, що надходять у програмі.
Наприклад, @OnEvent('after-allocate-voucher') запускає метод, коли виникає ця подія. |
Ефективні сповіщення з подіями та чергами на стороні сервера
Надані сценарії ілюструють систему, у якій сповіщення в режимі реального часу надсилаються працівникам після масового вставлення записів ваучерів у базу даних. Процес починається в AllocateVoucherController, який надає кінцеву точку для створення завдань розподілу ваучерів. Коли завдання створюється, воно створює подію з назвою after-allocate-vaucher. Ця подія є важливою для запуску наступних кроків, гарантуючи, що система керується подіями та є модульною. Така конструкція дозволяє чітко розділити проблеми, що робить систему більш зручною в обслуговуванні та масштабованістю. 🎯
На рівні обслуговування, AllocateVoucherService обробляє логіку для постановки завдань у чергу за допомогою BullMQ. Після отримання after-allocate-vaucher подія додає завдання до черги з іменем аллот-ваучер. Ця черга дозволяє асинхронну обробку, гарантуючи, що система залишається чуйною навіть під час обробки великих наборів даних. Наприклад, якщо ви розподіляєте ваучери для 200 співробітників у відділі продажів, черга гарантує, що операція не блокує інші запити. Конфігурація черги включає такі параметри, як removeOnComplete щоб Redis був чистим після завершення роботи.
Завдання черги обробляються AllotVoucherConsumer клас. Тут реалізовано логіку ідентифікації відповідних працівників і введення записів ваучерів у базу даних. Команда Prisma createMany використовується для пакетного вставлення записів у Ваучер працівника таблиця, яка оптимізована для продуктивності. Після завершення операції з базою даних видається інша подія для сповіщення абонентів. Ця подія гарантує, що співробітники отримують сповіщення лише після успішної обробки масової вставки, додаючи надійності системі сповіщень. 🌟
У інтерфейсі компонент React прослуховує події, надіслані сервером, через an Джерело події. Коли працівники отримують сповіщення, їхні дані динамічно оновлюються в інтерфейсі користувача без необхідності оновлення сторінки. Цей підхід забезпечує зручну взаємодію з користувачем, подібну до оновлень у реальному часі, які можна побачити в сучасних веб-додатках, таких як результати спортивних змагань у прямому ефірі або сповіщення в соціальних мережах. Наприклад, працівники відділу кадрів не бачитимуть оновлень, призначених для відділу продажів, оскільки бекенд точно фільтрує події на основі критеріїв розподілу. Ця специфіка покращує продуктивність і релевантність, створюючи орієнтовану на користувача систему. 🖥️
Масове надсилання сповіщень за допомогою серверних подій (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') для реєстрації помилок і повторної обробки завдань, якщо необхідно.
- Чи Призма createMany метод підтримки транзакцій відкатів?
- Так, Prisma 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
Впровадження систем реального часу з використанням SSE у NestJS спрощує зв’язок між сервером і клієнтами. Цей метод зменшує навантаження на сервер порівняно з постійним опитуванням і забезпечує точне націлювання сповіщень. Наприклад, HR-інструмент може повідомити 200 співробітників відділу продажів про нові ваучери, не заважаючи іншим. 🎯
За допомогою таких інструментів, як BullMQ і Prisma, це налаштування забезпечує асинхронну обробку завдань і ефективні операції з базою даних. Гнучкість архітектури, заснованої на подіях, робить її масштабованим рішенням для різних вимог у реальному часі, підвищуючи залучення користувачів і надійність системи.
Джерела та література
- Детальна документація на NestJS Framework для створення масштабованих програм на стороні сервера.
- Керівництво по використанню BullMQ для надійного керування чергою завдань у програмах Node.js.
- Офіційний Документація Prisma для операцій з базою даних і використання ORM.
- Інсайти на Події, надіслані сервером (SSE) для спілкування клієнт-сервер у реальному часі.
- Приклади практичної реалізації інтерфейсу з Документація ReactJS для створення інтерактивних інтерфейсів користувача.