با استفاده از مشاهدات در MicroServices MicroService

Nestjs یک است Node.js Framework Node.js که به شدت در آغوش می گیرد رعایت برای انجام کارهای ناهمزمان. مشاهدات به ویژه در خدمات میکروسرویس برای:
✅ ارتباط بین سرویس (با استفاده از کافکا ، ردیس ، خرگوش و غیره)
✅ داده های جریان (WebSockets ، GRPC و غیره)
✅ رسیدگی به کارهای طولانی مدت (به عنوان مثال ، مشاغل پس زمینه)
بیایید شیرجه بزنیم نمونه های دنیای واقعی از چگونگی استفاده از مشاهده در میکروسرویسهای Nestjs. 🔥
1 ⃣ مشاهده در MicroService Nestjs
Nestjs استفاده می کند مشاهده RXJS به عنوان بخش اصلی طراحی خود برای انجام عملیات Async. این چارچوب پشتیبانی داخلی را برای شما فراهم می کند میکروسرویس و استفاده از مشاهدات را تشویق می کند الگوهای پاسخ-پاسخبشر
مثال: راه اندازی MicroService Nestjs
بیایید بگوییم که ما دو سرویس دهنده داریم:
- سرویس سفارشات (هنگام قرار دادن سفارش ، رویدادی را منتشر می کند)
- سرویس موجودی (سطح سهام را گوش می دهد و به روز می کند)
سفارشات میکروسرویس (ناشر)
import { Controller, Post } from '@nestjs/common';
import { Client, ClientProxy } from '@nestjs/microservices';
import { Observable } from 'rxjs';
@Controller('orders')
export class OrdersController {
@Client({ transport: Transport.REDIS, options: { host: 'localhost', port: 6379 } })
private client: ClientProxy;
@Post('create')
createOrder(): Observable<string> {
return this.client.send('order_created', { productId: 1, quantity: 2 });
}
}
🔹 اینجا ، client.send()
یک قابل مشاهده را برمی گرداند هنگامی که سرویس موجودی رویداد را پردازش می کند ، پاسخی منتشر می کند.
Microservice موجودی (شنونده)
import { Controller } from '@nestjs/common';
import { MessagePattern } from '@nestjs/microservices';
@Controller()
export class InventoryController {
@MessagePattern('order_created')
handleOrderCreated(data: { productId: number; quantity: number }): Observable<string> {
console.log('Updating inventory for:', data);
return new Observable((subscriber) => {
// Simulate processing
setTimeout(() => {
subscriber.next('Inventory Updated ✅');
subscriber.complete();
}, 2000);
});
}
}
🔹 این سرویس گوش دادن برای order_created
پیام ها و پاسخ با یک قابل مشاهده.
پاسخ در سرویس سفارشات
createOrder().subscribe((response) => console.log(response));
🟢 خروجی:
Updating inventory for: { productId: 1, quantity: 2 }
Inventory Updated ✅
2⃣ مشاهده در خدمات HTTP
اگر در حال ساخت یک API استراحت در داخل یک میکروسرویس ، از مشاهدات می توان با مشتری های HTTP استفاده کرد محور (بسته بندی شده from()
برای تبدیل وعده ها به مشاهدات).
مثال: واکشی داده ها از میکروسرویس دیگر
import { Injectable } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { Observable, map } from 'rxjs';
@Injectable()
export class ProductService {
constructor(private httpService: HttpService) {}
getProductDetails(productId: number): Observable<any> {
return this.httpService.get(`http://inventory-service/products/${productId}`).pipe(
map((response) => response.data) // Transform response
);
}
}
🔹 این به ما کمک می کند تا رویکرد واکنشی حتی برای تماس های HTTP.
3⃣ داده های جریان با استفاده از Observables
Nestjs پشتیبانی می کند WebSockets & GRPC، هر دو با آنها خوب کار می کنند رعایتبشر
مثال: به روزرسانی های سهام در زمان واقعی با استفاده از WebSockets
1⃣ Gateway (سرور WebSocket)
import { WebSocketGateway, SubscribeMessage, WebSocketServer } from '@nestjs/websockets';
import { Observable, interval, map } from 'rxjs';
@WebSocketGateway()
export class StockGateway {
@WebSocketServer() server;
@SubscribeMessage('stock_updates')
stockUpdates(): Observable<{ stock: number }> {
return interval(2000).pipe(
map(() => ({ stock: Math.floor(Math.random() * 100) })) // Random stock value
);
}
}
2 مشتری (Frontend WebSocket)
const socket = io('http://localhost:3000');
socket.emit('stock_updates');
socket.on('stock_updates', (data) => {
console.log('Live Stock:', data);
});
به روزرسانی سهام جریان به طور مداوم با استفاده از فاصله قابل مشاهدهبشر
4⃣ رسیدگی به کارهای طولانی مدت با مشاهده
در بعضی موارد ، ما ممکن است نیاز داشته باشیم پردازش داده های بزرگ غیر همزمان به جای مسدود کردن درخواست ، می توانیم مشاهده ای را که به تدریج داده ها را منتشر می کند ، برگردانیم.
مثال: جریان داده های گزارش بزرگ
import { Controller, Get } from '@nestjs/common';
import { Observable, interval, take, map } from 'rxjs';
@Controller('reports')
export class ReportsController {
@Get('generate')
generateReport(): Observable<string> {
return interval(1000).pipe(
take(5), // Emit 5 values (simulate processing)
map((count) => `Processing chunk ${count + 1}...`)
);
}
}
🟢 خروجی مشتری (بعد از ضربه زدن /reports/generate
):
Processing chunk 1...
Processing chunk 2...
Processing chunk 3...
Processing chunk 4...
Processing chunk 5...
🔹 این مانع از مسدود شدن و پاسخ ها را به صورت تدریجی جریان می دهدبشر
چرا از Observables در Nestjs استفاده می کنیم؟ 🤔
✔ دست زدن به async بهتر – برخلاف وعده ها ، مشاهدات اجازه می دهند مقادیر چندگانه با گذشت زمانبشر
✔ برنامه نویسی واکنشی -با به روزرسانی های زمان واقعی (WebSockets ، Kafka و غیره) عالی کار می کند.
✔ اپراتورهای قدرتمند – map()
با filter()
با mergeMap()
تحولات async را آسان تر کنید.
✔ پشتیبانی داخلی Nestjs – میکروسرویس ، وب سایت و GRPC همه به طور پیش فرض از مشاهدات استفاده می کنند.
نتیجه گیری
مشاهدات در Nestjs درخشش هنگام کار با میکروسرویس ، برنامه های کاربردی در زمان واقعی و فرآیندهای طولانی مدت. آنها ارائه می دهند راه قدرتمند برای انجام کارهای ناهمزمان به طور کارآمد ، بیشتر برنامه خود را انجام دهید واکنشی و مقیاس پذیربشر
🔥 اگر در حال ساخت هستید خدمات میکروسرویس، استفاده را شروع کنید رعایت امروز! 🚀