Toplu İşlemler için Sunucu Tarafı Olaylarını Kullanan NestJS'de Zahmetsiz Bildirimler

Temp mail SuperHeros
Toplu İşlemler için Sunucu Tarafı Olaylarını Kullanan NestJS'de Zahmetsiz Bildirimler
Toplu İşlemler için Sunucu Tarafı Olaylarını Kullanan NestJS'de Zahmetsiz Bildirimler

Toplu Ekleme İşlemleri için Kolaylaştırılmış Bildirim Gönderimi

Yüzlerce çalışana departman, sınıf veya deneyim gibi çeşitli kriterlere göre kuponların atandığı bir sistemi yönettiğinizi hayal edin. Sistemde darboğazlara yol açmadan her çalışanı verimli bir şekilde bilgilendirmek çok büyük bir iştir. 🔔 Soketlerin veya yoklama mekanizmalarının karmaşıklığından kaçınmayı hedeflediğinizde bu zorluk daha da göz korkutucu hale gelir.

Bu tür senaryolarda Sunucu Tarafı Olayları (SSE), güçlü ancak basit bir çözüm olarak ortaya çıkar. NestJS uygulamanızda SSE'den yararlanarak belirli çalışan gruplarını dinamik kriterlere göre bilgilendirmek için gerçek zamanlı bir iletişim kanalı oluşturabilirsiniz. Örneğin, kuponlar Satış departmanına tahsis edildiğinde yalnızca bu çalışanların bildirim alması sağlanarak kesin ve anlamlı güncellemeler yapılması sağlanır.

Bu makalede, SSE'nin NestJS kullanarak toplu ekleme sürecine nasıl entegre edileceğini gösteren pratik bir örneğe dalacağız. Kusursuz performansı korurken, arka uçtaki olayları tetiklemekten ön uçtaki güncellemeleri dinlemeye kadar yaşam döngüsü boyunca yürüyeceğiz. 💼

İster bir İK aracı ister finans uygulaması geliştiriyor olun, bu iş akışını anlamak size kişiselleştirilmiş bildirimleri gerçek zamanlı olarak sunma gücü verecektir. SSE'nin basitliğini ve uygulamanızın kullanıcı deneyimini nasıl geliştirebileceğini çözelim.

Emretmek Kullanım Örneği
@Sse Sunucu Tarafı Olayları (SSE) uç noktasını tanımlamak için kullanılan bir NestJS dekoratörü. Örneğin, @Sse('kuponlu-çalışan') istemciye gerçek zamanlı güncellemelerin akışını sağlamak için bir uç nokta kurar.
fromEvent tarafından yayılan bir olayı dönüştüren RxJS'den bir işlev Olay Verici gözlemlenebilir bir akışa dönüşür. Örneğin, fromEvent(this.eventEmitter, 'sonradan eklenen kupon') belirli bir olayı dinler.
Observable Eşzamansız veri akışlarını yönetmek için kullanılan RxJS'nin temel konsepti. NestJS'deki Sunucu Tarafı Olaylarını işlemek için gereklidir; gözlemlenebilir<MessageEvent>.
@InjectQueue Bir kuyruk örneğini enjekte eden bir NestJS dekoratörü, Bull gibi kitaplıklarla iş işlemeyi yönetmek için kullanışlıdır. Örneğin, @InjectQueue('allotVoucher') 'allotVoucher' adlı kuyruğa erişim sağlar.
WorkerHost NestJS'de özel iş işlemcilerinin tanımlanmasına olanak tanıyan BullMQ'nun temel sınıfı. Örneğin, TahsisKuponuTüketici sınıf uzanır İşçi Ana Bilgisayarı belirli işleri halletmek için.
@OnWorkerEvent Bir kuyruk işinin belirli yaşam döngüsü olaylarını dinlemek için kullanılan bir dekoratör. Örneğin, @OnWorkerEvent('tamamlandı') Bir işin "tamamlandı" olayını yönetir.
createMany Bir veritabanına aynı anda birden fazla kayıt eklemek için kullanılan bir Prisma komutu. Örneğin, prisma.employeeVoucher.createMany tüm çalışanların kuponlarını tek bir işlemde ekler.
EventSource Arka uçtan sunucu tarafından gönderilen olayları (SSE) almaya yönelik bir JavaScript API'si. Örneğin, new EventSource('http://localhost/vouchered-employee') veri akışı için bir bağlantı kurar.
add Kuyruğa yeni bir iş eklemek için Bull kuyruklarından bir yöntem. Örneğin, allotVoucherQueue.add('tahsis kuponu', jobData) işlenmek üzere bir iş planlar.
@OnEvent Uygulama içinde yayılan belirli olayları dinleyen bir NestJS dekoratörü. Örneğin, @OnEvent('tahsis sonrası kupon') bu olay yayıldığında bir yöntemi tetikler.

Sunucu Tarafı Olayları ve Kuyrukları ile Verimli Bildirimler

Sağlanan komut dosyaları, kupon kayıtlarının veritabanına toplu olarak eklenmesinden sonra çalışanlara gerçek zamanlı bildirimlerin gönderildiği bir sistemi göstermektedir. Süreç şurada başlıyor: TahsisVoucherController, kupon tahsisi görevleri oluşturmak için bir uç nokta ortaya çıkarır. Bir görev oluşturulduğunda, adlı bir olay yayar. tahsis sonrası kupon. Bu olay, sonraki adımları tetiklemek ve sistemin olay odaklı ve modüler olmasını sağlamak için gereklidir. Bu tasarım, endişelerin net bir şekilde ayrılmasına olanak tanıyarak sistemi daha sürdürülebilir ve ölçeklenebilir hale getirir. 🎯

Hizmet katmanında, TahsisKupon Hizmeti BullMQ kullanarak görevleri sıraya koyma mantığını yönetir. Aldıktan sonra tahsis sonrası kupon olay, adlı kuyruğa bir iş ekler tahsis makbuzu. Bu kuyruk, eşzamansız işlemeye izin vererek sistemin büyük veri kümelerini işlerken bile yanıt vermeye devam etmesini sağlar. Örneğin Satış departmanındaki 200 çalışana kupon tahsis ederseniz kuyruk, operasyonun diğer istekleri engellememesini sağlar. Kuyruğun yapılandırması aşağıdaki gibi seçenekleri içerir: KaldırmaOnComplete iş tamamlandıktan sonra Redis'i temiz tutmak için.

Kuyruk işleri şu kişi tarafından işlenir: TahsisKuponuTüketici sınıf. Burada ilgili çalışanların belirlenmesi ve fiş kayıtlarının veri tabanına eklenmesi mantığı uygulanmaktadır. Prizma komutu CreateMany Kayıtları toplu olarak eklemek için kullanılır Çalışan Kuponu Performans için optimize edilmiş tablo. Veritabanı işlemi tamamlandıktan sonra aboneleri bilgilendirmek için başka bir olay yayınlanır. Bu etkinlik, çalışanların yalnızca toplu ekleme başarıyla işlendikten sonra bilgilendirilmesini sağlayarak bildirim sistemine güvenilirlik katar. 🌟

Ön uçta, React bileşeni sunucu tarafından gönderilen olayları bir Olay Kaynağı. Çalışanlar bilgilendirildikçe ayrıntıları, sayfanın yenilenmesine gerek kalmadan kullanıcı arayüzünde dinamik olarak güncellenir. Bu yaklaşım, canlı spor skorları veya sosyal medya bildirimleri gibi modern web uygulamalarında görülen gerçek zamanlı güncellemelere benzer, kesintisiz bir kullanıcı deneyimi sağlar. Örneğin, arka uç, tahsis kriterlerine göre olayları hassas bir şekilde filtrelediğinden, İK departmanındaki çalışanlar Satışa yönelik güncellemeleri görmez. Bu özgüllük, kullanıcı odaklı bir sistem yaratarak hem performansı hem de alaka düzeyini artırır. 🖥️

NestJS'de Sunucu Tarafı Olayları (SSE) ile Bildirimleri Toplu Olarak Gönderme

Bu çözüm, toplu işlemler için NestJS'nin Prisma ve Sunucu Tarafı Olayları (SSE) ile birlikte kullanılmasına yönelik bir arka uç yaklaşımını göstermektedir. Olay odaklı bir mimari ve kuyruk sistemi içerir.

// 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 ve React Kullanarak Toplu Eklemeler için Gerçek Zamanlı Güncellemeler

Bu ön uç örneği, Sunucu Tarafı Olaylarını dinlemek ve veriler alınırken kullanıcı arayüzünü dinamik olarak güncellemek için React'ı kullanır. Toplu eklemelerden sonra çalışanların gerçek zamanlı olarak bilgilendirilmesini sağlar.

// 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;

Toplu Ekleme İşlemleri için Birim Test Bildirimleri

Bu Jest testi, NestJS'deki Sunucu Tarafı Olayları için arka uçta olay emisyonu ve bildirim mekanizmasının doğru şekilde çalışmasını sağlar.

// 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);
  });
});

NestJS'de SSE ile Gerçek Zamanlı Sistemlerin Geliştirilmesi

Çalışanları kupon tahsisleri konusunda bilgilendirmek için Sunucu Tarafı Olaylarının (SSE) uygulanmasını araştırmış olsak da, gerçek zamanlı sistemlerde SSE için daha geniş bir kullanım durumu mevcuttur. SSE, istemcilerin sürekli sorgulamaya gerek kalmadan sunucu verileriyle güncel kalmasının gerektiği senaryolarda öne çıkar. Örneğin, hızlı bir satış sırasında canlı envanter güncellemelerini takip eden bir çevrimiçi perakende platformunu düşünün. SSE'yi kullanarak, güncellemeleri bağlı tüm istemcilere verimli bir şekilde aktarabilir, gereksiz sunucu yükü olmadan en son stok seviyelerini görüntülemelerini sağlayabilirsiniz. Bu yaklaşım, kullanıcı deneyimini kusursuz tutarken ölçeklenebilirlik sağlar. 🛒

BullMQ gibi gelişmiş kuyruklama sistemlerini bir araya getirerek, tahsis makbuzu kuyruk, toplu veri işleme görevlerine sağlamlık katar. Kuyruk, sunucu yeniden başlatılsa bile bekleyen görevlerin bozulmadan kalmasını ve işlemlerin devam etmesini sağlar. Ek olarak, başarısız işlerin (örneğin, geçici veritabanı kesintisi nedeniyle) otomatik olarak yeniden denenmesini sağlayacak şekilde yeniden deneme mekanizmaları yapılandırılabilir. Örneğin, departmanlar arasında 300 çalışana yapılan tahsiste geçici bir hatayla karşılaşılırsa kuyruğun esnekliği hiçbir kaydın işlenmeden kalmamasını sağlayarak sisteminize güvenilirlik katar.

SSE, gerçek zamanlı bildirimlerin ötesinde, ayrıntılı özetler gerektiren görevler için e-posta hizmetlerini de tamamlayabilir. Tüm kupon bildirimleri SSE aracılığıyla gönderildikten sonra arka uç, eşzamansız olarak bir rapor oluşturabilir ve yöneticilere birleştirilmiş bir e-posta gönderebilir. Bu çok kanallı iletişim, çok çeşitli kullanıcı tercihlerine hitap ederek hem anında bildirimler hem de kapsamlı takipler sağlar. Bu tür bir entegrasyon, sisteminizin esnekliğini artırarak çok yönlü bir kullanıcı deneyimi yaratır. 📧

NestJS'de SSE Hakkında Sıkça Sorulan Sorular

  1. Sunucu Tarafı Olaylarını WebSockets üzerinden kullanmanın faydaları nelerdir?
  2. SSE'nin uygulanması daha kolaydır ve HTTP'yi kullanır, bu da onu güvenlik duvarı dostu hale getirir. WebSocket'lerden farklı olarak yalnızca tek bir tek yönlü bağlantı gerektirir ve bu da gerçek zamanlı güncellemeler için verimlidir.
  3. Kullanabilir miyim @Sse bir denetleyicide birden fazla uç nokta var mı?
  4. Evet, birden fazla tanımlayabilirsiniz @Sse Belirli ihtiyaçlara göre istemcilere farklı veri akışları sunmak için aynı denetleyicideki uç noktalar.
  5. Kuyruk işleme sırasında hataları nasıl ele alabilirim?
  6. BullMQ ile yeniden deneme seçeneklerini tanımlayabilir ve aşağıdaki gibi olay dinleyicilerini kullanabilirsiniz: @OnWorkerEvent('failed') hataları günlüğe kaydetmek ve gerekirse işleri yeniden işlemek için.
  7. Prisma mı createMany yöntem işlem geri almalarını destekliyor mu?
  8. Evet, Prisma'nın createMany bir işleme sarılabilir. İşlemdeki herhangi bir işlem başarısız olursa tutarlılık sağlamak için tüm işlemler geri alınır.
  9. Bir SSE akışı sırasında istemcinin bağlantısı kesilirse ne olur?
  10. Sunucu, bağlantı kopukluğunu algıladığında güncelleme göndermeyi durdurur. İstemciye yeniden bağlanma mantığını kullanarak uygulayabilirsiniz. EventSource API'dir.
  11. SSE iki yönlü iletişim için kullanılabilir mi?
  12. Hayır, SSE tek yönlüdür (sunucudan istemciye). Çift yönlü iletişim için WebSockets veya HTTP2 akışlarını kullanın.
  13. NestJS'de SSE uç noktalarının güvenliğini nasıl sağlarım?
  14. Korumaları veya ara yazılımları kullanın, örneğin @UseGuardsSSE uç noktalarınız için kimlik doğrulamayı ve yetkilendirmeyi zorunlu kılmak için.
  15. SSE tarayıcı olmayan istemcilerle çalışabilir mi?
  16. Evet, HTTP ve olay akışını destekleyen herhangi bir istemci (ör. Node.js, cURL) SSE akışlarını kullanabilir.
  17. Bir SSE uç noktasına bağlanabilecek maksimum istemci sayısı nedir?
  18. Bu, sunucunuzun yapılandırmasına ve kaynak sınırlarına bağlıdır. Yük dengeleme ve kümeleme, daha fazla istemciyi destekleyecek şekilde ölçeklendirmeye yardımcı olabilir.
  19. JSON verilerini SSE üzerinden göndermek mümkün mü?
  20. Evet, nesneleri JSON dizelerine seri hale getirebilir ve bunları kullanarak gönderebilirsiniz. new MessageEvent NestJS'de.

NestJS'de Etkili Gerçek Zamanlı Bildirimler

Gerçek zamanlı sistemlerin uygulanması SSE NestJS'de sunucu ve istemciler arasındaki iletişimi basitleştirir. Bu yöntem, sürekli yoklamaya kıyasla sunucu yükünü azaltır ve bildirimler için hassas hedefleme sağlar. Örneğin, bir İK aracı, diğerlerini rahatsız etmeden Satış bölümündeki 200 çalışana yeni kuponlar hakkında bilgi verebilir. 🎯

BullMQ ve Prisma gibi araçlarla bu kurulum, eşzamansız görev işlemeyi ve verimli veritabanı işlemlerini sağlar. Olay tabanlı mimarinin esnekliği, onu çeşitli gerçek zamanlı gereksinimler için ölçeklenebilir bir çözüm haline getirerek kullanıcı katılımını ve sistem güvenilirliğini artırır.

Kaynaklar ve Referanslar
  1. Hakkında ayrıntılı belgeler NestJS Çerçevesi ölçeklenebilir sunucu tarafı uygulamaları oluşturmak için.
  2. Kullanım kılavuzu BoğaMQ Node.js uygulamalarında güçlü iş kuyruğu yönetimi için.
  3. Resmi Prizma Dokümantasyonu veritabanı işlemleri ve ORM kullanımı için.
  4. Analizler Sunucu Tarafından Gönderilen Etkinlikler (SSE) gerçek zamanlı istemci-sunucu iletişimi için.
  5. Uygulamalı ön uç uygulama örnekleri ReactJS Belgeleri etkileşimli kullanıcı arayüzleri oluşturmak için.