Mikroxizmatlar5 min read

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:

Terminal
1$ npm i --save nats

Umumiy ko'rinish

NATS transportyoridan foydalanish uchun createMicroservice() metodiga quyidagi options obyektini uzating:

TypeScript
main
1const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
2  transport: Transport.NATS,
3  options: {
4    servers: ['nats://localhost:4222'],
5  },
6});
Hint

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:

queueServeringiz 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.
gracefulShutdownGraceful shutdownni yoqadi. Yoqilganda server ulanishni yopishdan oldin barcha kanallardan unsubscribe qiladi. Standart qiymat false.
gracePeriodBarcha 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.

TypeScript
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:

TypeScript
main
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.

TypeScript
1@MessagePattern('notifications')
2getNotifications(@Payload() data: number[], @Ctx() context: NatsContext) {
3  console.log(`Subject: ${context.getSubject()}`);
4}
Hint

@Payload(), @Ctx() va NatsContext@nestjs/microservices paketidan import qilinadi.

Wildcardlar

Obuna aniq subjectga bo'lishi mumkin yoki wildcardlarni o'z ichiga olishi mumkin.

TypeScript
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:

TypeScript
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(...);
Hint

NatsRecordBuilder klassi @nestjs/microservices paketidan eksport qilinadi.

Bu headerlarni server tomonida ham NatsContextga kirish orqali quyidagicha o'qishingiz mumkin:

TypeScript
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:

TypeScript
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.

TypeScript
1this.client.status.subscribe((status: NatsStatus) => {
2  console.log(status);
3});
Hint

NatsStatus tipi @nestjs/microservices paketidan import qilinadi.

Xuddi shuningdek, serverning status streamiga subscribe bo'lib, server holati haqida xabarlarni olishingiz mumkin.

TypeScript
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:

TypeScript
1this.client.on('error', (err) => {
2  console.error(err);
3});

Xuddi shuningdek, serverning ichki eventlarini tinglashingiz mumkin:

TypeScript
1server.on<NatsEvents>('error', (err) => {
2  console.error(err);
3});