Mikroservisler Arası İletişim: Senkron vs Asenkron
Mikroservisler mimarisinde iki servis birbirleriyle konuşmak zorunda. Ama nasıl konuşacakları, sistemin hızını ve güvenilirliğini doğrudan etkiliyor.
Bir servisten diğerine istek gönderiyorsun ve cevap gelene kadar bekliyorsun. REST API'ler buna örnek. Müşteri servisi, ödeme servisiyle senkron konuşursa: "Ödemeyi işle, ben burada bekliyorum."
Avantaj: Basit, anlaşılması kolay. Hata yönetimi net.
Riskleri: Ödeme servisi yavaşsa, müşteri servisi de donup kalır. Zincir halinde servisler bağlanırsa, bir tanesi çöktüğünde tüm sistem etkilenir.
Müşteri servisi, ödeme servisiyle doğrudan konuşmaz. Bunun yerine bir kuyruğa (message queue) mesaj bırakır ve hemen devam eder. Ödeme servisi kendi hızında mesajı alıp işler.
Avantaj: Servisler bağımsız çalışır. Ödeme servisi geçici olarak offline olsa bile, mesajlar bekler.
Riskleri: Daha karmaşık. Mesajın işlenip işlenmediğini takip etmek gerekir.
Müşteri servisi, ödeme servisiyle doğrudan iletişim kuruyor:
1// customer-service.js2const axios = require('axios');34async function createOrder(customerId, amount) {5try {6// Senkron: Cevap gelene kadar bekle7const paymentResponse = await axios.post(8'http://payment-service/pay',9{ customerId, amount }10);1112if (paymentResponse.data.success) {13console.log('Ödeme başarılı, sipariş oluşturuluyor...');14return { orderId: 123, status: 'confirmed' };15}16} catch (error) {17console.log('Ödeme servisi yanıt vermiyor!');18return { orderId: null, status: 'failed' };19}20}2122createOrder(1, 100);Çıktı: Ödeme servisi 5 saniye yanıt verirse, müşteri servisi 5 saniye bekler.
Müşteri servisi mesajı kuyruğa bırakıp devam ediyor:
1// customer-service.js (asenkron)2const amqp = require('amqplib');34async function createOrder(customerId, amount) {5const connection = await amqp.connect('amqp://localhost');6const channel = await connection.createChannel();78// Kuyruğu oluştur9await channel.assertQueue('payment_queue');1011// Mesajı gönder ve hemen dön12channel.sendToQueue('payment_queue', 13Buffer.from(JSON.stringify({ customerId, amount }))14);1516console.log('Mesaj kuyruğa eklendi, sipariş oluşturuluyor...');17return { orderId: 123, status: 'pending' };18}1920createOrder(1, 100);Çıktı: Mesaj hemen kuyruğa eklenir, müşteri servisi beklemez.
Hızlı yanıt gerekiyorsa (ödeme doğrulama, hesap kontrol) Senkron.
Zaman alabilecek işler için (e-posta gönderme, raporlama, ağır işlemler) Asenkron.
Çoğu modern sistem ikisini de kullanır. Ödeme senkron, e-posta bildirimi asenkron.
0 yorum