Mikroxizmatlar4 min read

Redis

Redis transportyori publish/subscribe messaging paradigmasini implement qiladi va Redisning Pub/Sub imkoniyatidan foydalanadi. Publish qilingan xabarlar kanallarda tasniflanadi, ul

Redis transportyori publish/subscribe messaging paradigmasini implement qiladi va Redisning Pub/Sub imkoniyatidan foydalanadi. Publish qilingan xabarlar kanallarda tasniflanadi, ularni oxir-oqibat qaysi subscriberlar (agar bo'lsa) olishini bilmasdan. Har bir microservice istalgan miqdordagi kanallarga subscribe bo'lishi mumkin. Bundan tashqari, bir vaqtning o'zida bir nechta kanalga ham subscribe bo'lish mumkin. Kanallar orqali almashiladigan xabarlar fire-and-forget, ya'ni xabar publish qilingan va unga qiziqqan subscriberlar bo'lmasa, xabar o'chiriladi va qayta tiklanmaydi. Shuning uchun kamida bitta servis xabar yoki eventni albatta qayta ishlashiga kafolat yo'q. Bitta xabar bir nechta subscriber tomonidan subscribe qilinishi (va qabul qilinishi) mumkin.

O'rnatish

Redis asosidagi microservice'larni qurishni boshlash uchun avval kerakli paketni o'rnating:

Terminal
1$ npm i --save ioredis

Umumiy ko'rinish

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

TypeScript
main
1const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
2  transport: Transport.REDIS,
3  options: {
4    host: 'localhost',
5    port: 6379,
6  },
7});
Hint

Transport enum'i @nestjs/microservices paketidan import qilinadi.

Opsiyalar

options propertysi tanlangan transportyorga xos. Redis transportyori quyida tasvirlangan propertylarni ochadi.

hostUlanish url'i
portUlanish porti
retryAttemptsXabarni qayta urinishlar soni (default: 0)
retryDelayXabarni qayta urinishlar orasidagi kechikish (ms) (default: 0)
wildcardsRedis wildcard obunalarini yoqadi, transportyorga ichkarida psubscribe/pmessage ishlatishni buyuradi. (default: false)

Rasmiy ioredis clienti qo'llab-quvvatlaydigan barcha propertylar ushbu transportyor tomonidan ham qo'llab-quvvatlanadi.

Mijoz

Boshqa microservice transportyorlari kabi, Redis 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.REDIS,
7        options: {
8          host: 'localhost',
9          port: 6379,
10        }
11      },
12    ]),
13  ]
14  ...
15})

Client yaratishning boshqa usullari (ClientProxyFactory yoki @Client()) ham qo'llanishi mumkin. Ular haqida hereda o'qishingiz mumkin.

Kontekst

Murakkabroq ssenariylarda kiruvchi so'rov haqida qo'shimcha ma'lumotlarga kirish kerak bo'lishi mumkin. Redis transportyoridan foydalanganda RedisContext obyektiga kirishingiz mumkin.

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

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

Wildcardlar

Wildcardlar qo'llab-quvvatlashini yoqish uchun wildcards optionini true ga o'rnating. Bu transportyorga ichkarida psubscribe va pmessage ishlatishni buyuradi.

TypeScript
1const app = await NestFactory.createMicroservice(AppModule, {
2  transport: Transport.REDIS,
3  options: {
4    // Other options
5    wildcards: true,
6  },
7});

Client instansiyasini yaratishda ham wildcards optionini uzatishni unutmang.

Ushbu option yoqilganda, message va event patternlarida wildcardlardan foydalanishingiz mumkin. Masalan, notifications bilan boshlanadigan barcha kanallarga subscribe qilish uchun quyidagi patterndan foydalaning:

TypeScript
1@EventPattern('notifications.*')

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. Redis driveri uchun status streami connected, disconnected va reconnecting eventlarini emit qiladi.

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

RedisStatus 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: RedisStatus) => {
3  console.log(status);
4});

Redis 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<RedisEvents>('error', (err) => {
2  console.error(err);
3});
Hint

RedisEvents tipi @nestjs/microservices paketidan import qilinadi.

Asosiy driverga kirish

Murakkabroq use-case'larda asosiy driver instansiyasiga kirish kerak bo'lishi mumkin. Bu ulanishni qo'lda yopish yoki driverga xos metodlardan foydalanish kabi ssenariylar uchun foydali. Biroq, ko'p hollarda driverga to'g'ridan-to'g'ri kirish kerak emasligini yodda tuting.

Buning uchun unwrap() metodidan foydalanishingiz mumkin, u asosiy driver instansiyasini qaytaradi. Generic type parametri kutilayotgan driver instansiyasi turini ko'rsatishi kerak.

TypeScript
1const [pub, sub] =
2  this.client.unwrap<[import('ioredis').Redis, import('ioredis').Redis]>();

Xuddi shuningdek, serverning asosiy driver instansiyasiga kirishingiz mumkin:

TypeScript
1const [pub, sub] =
2  server.unwrap<[import('ioredis').Redis, import('ioredis').Redis]>();

Eslatma: boshqa transportyorlardan farqli ravishda, Redis transportyori ikki ioredis instansiyasidan iborat tuple qaytaradi: birinchisi xabarlarni publish qilish uchun, ikkinchisi xabarlarni subscribe qilish uchun ishlatiladi.