Özet
Olay tabanlı API'ler harici bildirimler için web kancalarını (webhooks) ve dahili işleme için mesaj kuyruklarını kullanır. Olayları bir kuyruğa (RabbitMQ, Kafka) yayınlayın, eşzamansız olarak işleyin ve web kancaları aracılığıyla istemcileri bilgilendirin. Modern PetstoreAPI, sipariş işleme, envanter güncellemeleri ve ödeme bildirimleri için bu deseni kullanır.
Giriş
Bir müşteri sipariş verir. API'nizin ödeme alması, envanteri güncellemesi, e-posta göndermesi, depoyu bilgilendirmesi ve web kancalarını tetiklemesi gerekiyor. Tüm bunları müşteriyi 10 saniye bekletmek suretiyle eşzamanlı mı yaparsınız? Yoksa hemen yanıt verip eşzamansız olarak mı işlersiniz?
Olay tabanlı API'ler hızlı yanıt verir ve arka planda işleme yapar. Sipariş uç noktası hemen 201 Created döndürür. Olaylar arka plan işlemesini tetikler. Web kancaları, işlem tamamlandığında istemcileri bilgilendirir.
Modern PetstoreAPI, siparişler, ödemeler ve envanter için olay tabanlı mimari kullanır.
Apidog, web kancalarını test etmenize, olay akışlarını doğrulamanıza ve eşzamansız işlemeyi simüle etmenize yardımcı olur.
Olay Tabanlı Mimari
Olay tabanlı API'ler, olaylar gerçekleştiğinde yayınlar. Diğer hizmetler abone olur ve tepki verir.
Bileşenler
- Olay Üreticisi - Olayları yayınlayan API uç noktası
- Olay Veri Yolu/Kuyruğu - Olayları yönlendirir (RabbitMQ, Kafka, SQS)
- Olay Tüketicisi - Olayları işleyen arka plan çalışanları
- Web Kancaları (Webhooks) - Harici istemcileri bilgilendirir
Akış
İstemci → POST /orders → API
API → "order.created" olayını yayınla → Kuyruk
API → 201 Created döndür → İstemci
Çalışan → Olayı tüket → Siparişi işle
Çalışan → "order.completed" olayını yayınla → Kuyruk
Webhook Çalışanı → Web kancası gönder → İstemci
Harici Olaylar İçin Web Kancaları
Web kancaları, harici istemcileri olaylar hakkında bilgilendirir.
// Publish event when order created
app.post('/v1/orders', async (req, res) => {
const order = await createOrder(req.body);
await eventBus.publish('order.created', {
orderId: order.id,
userId: order.userId,
total: order.total
});
res.status(201).json(order);
});
// Background worker sends webhooks
eventBus.subscribe('order.completed', async (event) => {
const webhooks = await getWebhooks(event.userId, 'order.completed');
for (const webhook of webhooks) {
await sendWebhook(webhook.url, {
event: 'order.completed',
data: event
});
}
});
Dahili Olaylar İçin Mesaj Kuyrukları
Mesaj kuyrukları, dahili olay işlemeyi yönetir.
RabbitMQ Örneği
// Publisher
await publishEvent('order.created', { orderId: '019b4132' });
// Consumer
await consumeEvents('order.*', async (event) => {
await processOrder(event);
});
Modern PetstoreAPI Olay Tabanlı API'leri Nasıl Uygular?
Sipariş İşleme
- POST /orders hemen 201 döndürür
- order.created olayını yayınla
- Ödeme çalışanı ödemeyi işler
- Envanter çalışanı stoğu günceller
- E-posta çalışanı onay gönderir
- Webhook çalışanı istemciyi bilgilendirir
Modern PetstoreAPI olay mimarisine bakın.
Apidog ile Test Etme
Apidog, olay tabanlı API testini destekler:
- Web kancası teslimatını test etme
- Olay yüklerini doğrulama
- Eşzamansız işlemeyi simüle etme
- Yeniden deneme mantığını test etme
Sonuç
Olay tabanlı API'ler performansı ve ölçeklenebilirliği artırır. Harici bildirimler için web kancalarını ve dahili işlemeler için mesaj kuyruklarını kullanın. Modern PetstoreAPI, üretim ortamına hazır olay tabanlı desenleri sergiler.
Sıkça Sorulan Sorular
Web kancaları ve mesaj kuyrukları arasındaki fark nedir?
Web kancaları, harici istemcileri HTTP üzerinden bilgilendirir. Mesaj kuyrukları ise dahili hizmet iletişimini yönetir.
Hangi mesaj kuyruğunu kullanmalıyım?
Basitlik için RabbitMQ, yüksek verim için Kafka, yönetilen hizmet için AWS SQS.
Web kancası hataları nasıl ele alınır?
Üstel geri çekilmeyle (exponential backoff) yeniden deneme mantığı uygulayın (web kancası güvenilirliği rehberimize bakın).
Mesaj kuyrukları olmadan olayları kullanabilir misiniz?
Evet, ancak kuyruklar dayanıklılık, yeniden deneme ve ayrıştırma (decoupling) sağlar.
Olay tabanlı API'ler nasıl test edilir?
Web kancalarını test etmek ve olay akışlarını doğrulamak için Apidog'u kullanın.
