NATS
NATS cloud-native ilovalar, IoT messaging va microservice arxitekturalari uchun sodda, xavfsiz va yuqori unumdor open source messaging tizimi. NATS serveri Go dasturlash tilida yoz
NATS cloud-native ilovalar, IoT messaging va microservice arxitekturalari uchun sodda, xavfsiz va yuqori unumdor open source messaging tizimi. NATS serveri Go dasturlash tilida yozilgan, ammo server bilan ishlash uchun client kutubxonalari o'nlab asosiy dasturlash tillari uchun mavjud. NATS At Most Once va At Least Once yetkazib berishni qo'llab-quvvatlaydi. U katta serverlar va cloud instansiyalardan tortib edge gatewaylar va hatto Internet of Things qurilmalarigacha istalgan joyda ishlashi mumkin.
O'rnatish
NATS asosidagi microservice'larni qurishni boshlash uchun avval kerakli paketni o'rnating:
1$ npm i --save natsUmumiy ko'rinish
NATS transportyoridan foydalanish uchun createMicroservice() metodiga quyidagi options obyektini uzating:
1const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
2 transport: Transport.NATS,
3 options: {
4 servers: ['nats://localhost:4222'],
5 },
6});Transport enum'i @nestjs/microservices paketidan import qilinadi.
Opsiyalar
options obyekti tanlangan transportyorga xos. NATS transportyori here da tasvirlangan propertylardan tashqari quyidagi propertylarni ham ochadi:
queue | Serveringiz subscribe qilishi kerak bo'lgan queue (bu sozlamani e'tiborsiz qoldirish uchun undefined qoldiring). NATS queue group'lari haqida batafsil ma'lumotni quyida o'qing.
|
gracefulShutdown | Graceful shutdownni yoqadi. Yoqilganda server ulanishni yopishdan oldin barcha kanallardan unsubscribe qiladi. Standart qiymat false.
|
gracePeriod | Barcha kanallardan unsubscribe qilingandan so'ng serverni kutish uchun millisekunddagi vaqt. Standart 10000 ms.
|
Mijoz
Boshqa microservice transportyorlari kabi, NATS ClientProxy instansiyasini yaratish uchun bir nechta variant bor.
Instansiya yaratishning bir usuli - ClientsModuledan foydalanish. ClientsModule orqali client instansiyasini yaratish uchun uni import qiling va register() metodiga createMicroservice() metodida yuqorida ko'rsatilgan xuddi shu propertylarga ega options obyektini, shuningdek injection token sifatida ishlatiladigan name propertysini uzating. ClientsModule haqida batafsil hereda o'qing.
1@Module({
2 imports: [
3 ClientsModule.register([
4 {
5 name: 'MATH_SERVICE',
6 transport: Transport.NATS,
7 options: {
8 servers: ['nats://localhost:4222'],
9 }
10 },
11 ]),
12 ]
13 ...
14})Client yaratishning boshqa usullari (ClientProxyFactory yoki @Client()) ham qo'llanishi mumkin. Ular haqida hereda o'qishingiz mumkin.
So'rov-javob
So'rov-javob message uslubi uchun (read more), NATS transportyori NATSning built-in Request-Reply mexanizmidan foydalanmaydi. Buning o'rniga, "request" publish() metodi orqali berilgan subjectda, noyob reply subject nomi bilan publish qilinadi, va responderlar o'sha subjectni tinglab reply subjectga javob yuboradi. Reply subjectlar joylashuvdan qat'i nazar, so'rov yuboruvchiga dinamik ravishda yo'naltiriladi.
Eventga asoslangan
Eventga asoslangan message uslubi uchun (read more), NATS transportyori NATSning built-in Publish-Subscribe mexanizmidan foydalanadi. Publisher subjectda xabar yuboradi va o'sha subjectni tinglayotgan har qanday faol subscriber xabarni oladi. Subscriberlar wildcard subjectlarga ham qiziqishini ro'yxatdan o'tkazishi mumkin, ular oddiy regexga biroz o'xshaydi. Bu bir-to-ko'p pattern ba'zan fan-out deb ataladi.
Queue grouplari
NATS distributed queues deb ataladigan built-in load balancing funksiyasini taqdim etadi. Queue subscription yaratish uchun queue propertysidan quyidagicha foydalaning:
1const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
2 transport: Transport.NATS,
3 options: {
4 servers: ['nats://localhost:4222'],
5 queue: 'cats_queue',
6 },
7});Kontekst
Murakkabroq ssenariylarda kiruvchi so'rov haqida qo'shimcha ma'lumotlarga kirish kerak bo'lishi mumkin. NATS transportyoridan foydalanganda NatsContext obyektiga kirishingiz mumkin.
1@MessagePattern('notifications')
2getNotifications(@Payload() data: number[], @Ctx() context: NatsContext) {
3 console.log(`Subject: ${context.getSubject()}`);
4}@Payload(), @Ctx() va NatsContext@nestjs/microservices paketidan import qilinadi.
Wildcardlar
Obuna aniq subjectga bo'lishi mumkin yoki wildcardlarni o'z ichiga olishi mumkin.
1@MessagePattern('time.us.*')
2getDate(@Payload() data: number[], @Ctx() context: NatsContext) {
3 console.log(`Subject: ${context.getSubject()}`); // e.g. "time.us.east"
4 return new Date().toLocaleTimeString(...);
5}Record builderlari
Xabar options'larini sozlash uchun NatsRecordBuilder klassidan foydalanishingiz mumkin (eslatma: bu event-based flowlar uchun ham mumkin). Masalan, x-version headerini qo'shish uchun setHeaders metodidan quyidagicha foydalaning:
1import * as nats from 'nats';
2
3// somewhere in your code
4const headers = nats.headers();
5headers.set('x-version', '1.0.0');
6
7const record = new NatsRecordBuilder(':cat:').setHeaders(headers).build();
8this.client.send('replace-emoji', record).subscribe(...);NatsRecordBuilder klassi @nestjs/microservices paketidan eksport qilinadi.
Bu headerlarni server tomonida ham NatsContextga kirish orqali quyidagicha o'qishingiz mumkin:
1@MessagePattern('replace-emoji')
2replaceEmoji(@Payload() data: string, @Ctx() context: NatsContext): string {
3 const headers = context.getHeaders();
4 return headers['x-version'] === '1.0.0' ? '🐱' : '🐈';
5}Ba'zi holatlarda bir nechta so'rovlar uchun headerlarni sozlashni xohlashingiz mumkin, bu holda ularni ClientProxyFactoryga options sifatida uzatishingiz mumkin:
1import { Module } from '@nestjs/common';
2import { ClientProxyFactory, Transport } from '@nestjs/microservices';
3
4@Module({
5 providers: [
6 {
7 provide: 'API_v1',
8 useFactory: () =>
9 ClientProxyFactory.create({
10 transport: Transport.NATS,
11 options: {
12 servers: ['nats://localhost:4222'],
13 headers: { 'x-version': '1.0.0' },
14 },
15 }),
16 },
17 ],
18})
19export class ApiModule {}Instansiya holati yangilanishlari
Ulanish va asosiy driver instansiyasi holati haqida real vaqt yangilanishlarini olish uchun status streamiga subscribe bo'lishingiz mumkin. Bu stream tanlangan driverga xos holat yangilanishlarini beradi. NATS driveri uchun status streami connected, disconnected va reconnecting eventlarini emit qiladi.
1this.client.status.subscribe((status: NatsStatus) => {
2 console.log(status);
3});NatsStatus tipi @nestjs/microservices paketidan import qilinadi.
Xuddi shuningdek, serverning status streamiga subscribe bo'lib, server holati haqida xabarlarni olishingiz mumkin.
1const server = app.connectMicroservice<MicroserviceOptions>(...);
2server.status.subscribe((status: NatsStatus) => {
3 console.log(status);
4});Nats eventlarini tinglash
Ba'zi holatlarda microservice tomonidan emit qilinadigan ichki eventlarni tinglashni xohlashingiz mumkin. Masalan, xato yuz berganda qo'shimcha operatsiyalarni ishga tushirish uchun error eventini tinglashingiz mumkin. Buning uchun quyida ko'rsatilgandek on() metodidan foydalaning:
1this.client.on('error', (err) => {
2 console.error(err);
3});Xuddi shuningdek, serverning ichki eventlarini tinglashingiz mumkin:
1server.on<NatsEvents>('error', (err) => {
2 console.error(err);
3});