NestJS yerleşik mikro hizmet desteğine sahiptir — HTTP yerine çeşitli taşıyıcılar (TCP, Redis, NATS, RabbitMQ, Kafka, gRPC) üzerinden iletişim kuran, tutarlı bir mesaj tabanlı programlama modeli kullanan bir mikro hizmet olarak çalışabilir. Aynı NestJS yapısı (modüller, servisler, DI) geçerlidir; sadece taşıyıcı ve mesaj desenleri değişir.
Bir mikro hizmet oluşturma
// a microservice listens on a transport instead of HTTP
const app = await NestFactory.createMicroservice(AppModule, {
transport: Transport.TCP, // or REDIS, NATS, RMQ, KAFKA, GRPC
options: { host: "0.0.0.0", port: 3001 },
});
await app.listen();
Mesaj desenleri ve olay desenleri
@Controller()
export class MathController {
// REQUEST-RESPONSE: respond to a message and RETURN a result (RPC-style)
@MessagePattern({ cmd: "sum" })
sum(data: number[]): number {
return data.reduce((a, b) => a + b, 0); // the caller awaits this result
}
// EVENT-BASED: react to an event, NO response expected (fire-and-forget)
@EventPattern("order_created")
handleOrderCreated(data: OrderDto) {
this.processOrder(data); // just react; nothing returned
}
}
İki iletişim stili: @MessagePattern istek-yanıt için (çağıran sonucu bekler, RPC gibi) ve @EventPattern olaylar için (ateşle ve unut, bağımsız — yayıncı bekleme yapmaz).
Başka bir mikro hizmeti çağırma (istemci)
@Injectable()
export class AppService {
constructor(@Inject("MATH_SERVICE") private client: ClientProxy) {}
async getSum() {
// send() → request-response (returns an Observable of the result)
return this.client.send({ cmd: "sum" }, [1, 2, 3]);
// emit() → fire an event (no response)
this.client.emit("order_created", orderData);
}
}
Bir ClientProxy (ClientsModule aracılığıyla yapılandırılır) diğer hizmetlere mesaj/olaylar gönderir — send() istek-yanıt için, emit() olaylar için.
Hibrit uygulamalar
// an app can serve HTTP AND connect microservice transports simultaneously
const app = await NestFactory.create(AppModule);
app.connectMicroservice({ transport: Transport.RMQ, options: {...} });
await app.startAllMicroservices();
await app.listen(3000); // HTTP too
Taşıyıcı seçimi önemlidir
TCP → simple direct service-to-service
Redis/NATS → lightweight pub/sub messaging
RabbitMQ/Kafka → robust message queues/streams (durability, retries, decoupling)
gRPC → high-performance, strongly-typed RPC (protobuf)
→ Async message brokers (RMQ/Kafka) give decoupling & resilience; gRPC gives speed+typing.
Neden önemli
NestJS'in yerleşik mikro hizmet desteği önemlidir çünkü dağıtılmış sistemler oluşturmanıza olanak tanır aynı tanıdık NestJS yapısını (modüller, sağlayıcılar, DI, dekoratörler) kullanırken HTTP yerine mesaj tabanlı taşıyıcıları değiştirebilirsiniz — önemli bir verimlilik ve tutarlılık avantajı.
Bunu anlamak ölçeklenebilir sistemleri mimarlık için önemlidir: message-pattern (istek-yanıt) ve event-pattern (ateşle ve unut) ayrımı doğrudan temel mikro hizmet iletişim seçimine eşlenir — senkron RPC tarzı çağrılar ve asenkron, bağımsız olaylar (ikincisi, mesaj aracıları aracılığıyla, mikro hizmetleri sağlam kılan dayanıklılık ve gevşek bağlantı sağlar).
Mikro hizmetler oluşturmayı, mesaj/olay işleyicilerini tanımlamayı, ClientProxy aracılığıyla diğer hizmetleri çağırmayı, hibrit HTTP+mikro hizmet uygulamaları oluşturmayı ve taşıyıcıları seçmeyi (hafif pub/sub ve Kafka/RabbitMQ gibi dayanıklı kuyruklar ve yüksek performanslı gRPC) bilmek, dağıtılmış arka uçları tasarlamak için değerli kıdemli seviye bilgisidir.
Mikro hizmetler gerçek karmaşıklık eklerken (ve her zaman bir monolite göre doğru seçim değildir), NestJS uygulamayı temiz ve tutarlı kılar, bu da bu konuyu büyük ölçekli, dağıtılmış NestJS sistemleri oluştururken önemli bir mimari konu haline getirir.
