Cloud Computing & Event-Driven Mimariler 5 dk okuma 9 okunma

Cloud Events ve Event Grid

CloudEvents, CNCF tarafından desteklenen, olay verilerini tanımlamak için açık bir standarttır. Azure Event Grid ise bu standardı yerel olarak destekleyen, tam yönetilen bir olay yönlendirme servisidir. Bu yazıda, iki kavramın ilişkisi, CloudEvents şemasının yapısı, Event Grid'de giriş/çıkış şeması yapılandırması, teslimat garantileri ve .NET entegrasyonu ele alınır.

Cloud Events ve Event Grid

CloudEvents ve Event Grid

Dağıtık sistemlerde olaylar (events), sistemde meydana gelen bir değişikliği temsil eden yapılandırılmış veri paketleridir. Ancak her platform, her üretici ve her tüketici olayları farklı formatlarda tanımlarsa, entegrasyon kabusa döner. İşte CloudEvents, bu kaosu ortadan kaldırmak için doğmuş açık bir standarttır. Azure Event Grid ise bu standardı yerel olarak destekleyen, tam yönetilen bir olay yönlendirme servisidir.


1. CloudEvents Nedir?

CloudEvents, Cloud Native Computing Foundation (CNCF) tarafından desteklenen, olay verilerini tanımlamak için kullanılan açık bir spesifikasyondur . Amacı, farklı platformlar ve servisler arasında olayların ortak bir şema ile taşınmasını sağlayarak birlikte çalışabilirliği (interoperability) artırmaktır .

Temel Faydaları:

  • Standartlaşma: Olaylar, her platformda aynı yapıda tanımlanır.

  • Araç Bağımsızlığı: Aynı araçlar, farklı sistemlerdeki olayları işleyebilir.

  • Genişletilebilirlik: İhtiyaca özel ek alanlar (extension attributes) tanımlanabilir.

  • Protokol Agnostik: HTTP, AMQP, Kafka gibi farklı protokoller üzerinde taşınabilir.

CloudEvents Zorunlu Alanları:
Bir CloudEvents olayı, aşağıdaki zorunlu alanları içerir:

Alan Açıklama
id Olayın benzersiz kimliği
source Olayın kaynağı (URI)
specversion CloudEvents sürümü (ör. "1.0")
type Olayın türü (ör. "com.example.order.created")
time Olayın gerçekleşme zamanı (opsiyonel ama önerilir)

Opsiyonel Alanlar: datacontenttype, dataschema, subject, ve özel extension alanları.


2. Azure Event Grid Nedir?

Azure Event Grid, yayınla-abone ol (publish-subscribe) modeliyle çalışan, tam yönetilen bir olay yönlendirme servisidir . Olayları push (itme) yöntemiyle abonelere iletir; yani abonelerin sürekli sorgulama (polling) yapmasına gerek yoktur.

Temel Kavramlar:

Kavram Açıklama
Event Source (Olay Kaynağı) Olayın meydana geldiği yer (Azure Blob Storage, IoT Hub, özel uygulama)
Topic (Konu) Olayların yayınlandığı hedef; sistem konuları ve özel konular (custom topics) vardır
Event Subscription (Olay Aboneliği) Hangi olayların, nereye iletileceğini tanımlar
Event Handler (Olay İşleyici) Olayı alan servis (Azure Functions, Webhook, Event Hubs, Logic Apps)

Öne Çıkan Özellikler:

  • At-least-once teslimat: Her olay en az bir kez iletilir; tüketiciler idempotent olmalıdır .

  • Otomatik retry: Başarısız teslimatlar için üstel geri çekilme ile 24 saate kadar yeniden deneme .

  • Dead-lettering: Tüm denemelere rağmen iletilemeyen olaylar, Azure Storage'a yazılabilir .

  • Fiyatlandırma: Ayda ilk 100.000 işlem ücretsiz; sonrası milyon işlem başına 0,60 USD .


3. Event Grid ve CloudEvents İlişkisi

Event Grid, CloudEvents 1.0 spesifikasyonunu (JSON implementasyonu ve HTTP protokol bağlaması) yerel olarak destekler . Bu, Event Grid'in CloudEvents formatındaki olayları herhangi bir dönüşüm yapmadan kabul edebileceği ve iletebileceği anlamına gelir.

Desteklenen CloudEvents Modları:

Mod Destek
Structured JSON ✅ Evet
Binary ❌ Hayır

Event Grid'in Kendi Şeması (Proprietary Schema):
Event Grid ayrıca kendi özel olay şemasını da destekler. Ancak yeni uygulamalar için CloudEvents önerilir, çünkü standarttır ve Azure dışı sistemlerle de uyumludur .


4. Giriş ve Çıkış Şeması Yapılandırması

Event Grid, olayları alırken (input schema) ve iletirken (output schema) farklı formatlar kullanabilir. Desteklenen dönüşümler:

Giriş Şeması Çıkış Şeması Destek
CloudEvents CloudEvents ✅
Event Grid CloudEvents ✅
Event Grid Event Grid ✅
CloudEvents Event Grid ❌ Desteklenmez

Neden CloudEvents → Event Grid Dönüşümü Desteklenmiyor?
CloudEvents, extension (genişletme) alanlarını destekler. Event Grid'in kendi şeması ise bu alanları temsil edemez. Bu nedenle, CloudEvents formatındaki bir olayı Event Grid şemasına dönüştürmek veri kaybına yol açacağı için desteklenmez .

Yapılandırma Örnekleri (Azure CLI):

bash

# Özel konu oluştururken CloudEvents giriş şeması belirtme
az eventgrid topic create \
  --name mytopic \
  --resource-group myrg \
  --location westus2 \
  --input-schema cloudeventschemav1_0

# Olay aboneliği oluştururken CloudEvents çıkış şeması belirtme
az eventgrid event-subscription create \
  --name mysub \
  --source-resource-id $topicId \
  --endpoint https://myapp/api/events \
  --event-delivery-schema cloudeventschemav1_0

5. Event Grid'de Teslimat Garantileri ve Dayanıklılık

Event Grid, at-least-once teslimat garantisi sunar. Bu, bir olayın birden fazla kez iletilebileceği anlamına gelir. Bu nedenle, tüm aboneler idempotent olmalıdır .

Retry Mekanizması:

  • Webhook aboneleri için: 10 saniyeden başlayarak 1 saate kadar üstel geri çekilme ile 24 saat boyunca yeniden deneme .

  • Azure servis aboneleri (Functions, Event Hubs) için: 24 saat boyunca sürekli yeniden deneme .

Dead-Letter Queue (DLQ):
Tüm denemeler başarısız olursa, olay bir Azure Storage container'ına dead-letter olarak yazılabilir. Bu, olayın kaybolmasını önler ve daha sonra manuel olarak incelenip yeniden işlenmesine olanak tanır . DLQ yapılandırılmazsa, teslim edilemeyen olaylar kaybolur .


6. .NET ile Event Grid Entegrasyonu

Azure Functions ile CloudEvents Alma:

Event Grid tetikleyicisi ile CloudEvents formatındaki olayları almak için Microsoft.Azure.WebJobs.Extensions.EventGrid paketinin 3.3.1 veya üzeri sürümü kullanılmalıdır .

csharp

[Function("ProcessCloudEvent")]
public void Run([EventGridTrigger] CloudEvent cloudEvent)
{
    _logger.LogInformation("CloudEvent alındı: Id={Id}, Type={Type}, Source={Source}",
        cloudEvent.Id, cloudEvent.Type, cloudEvent.Source);
    
    // Olayı işle (idempotent olmalı!)
}

Event Grid'e CloudEvent Yayınlama (HTTP):

csharp

using Azure.Messaging;

var cloudEvent = new CloudEvent(
    source: "/myapp/orders",
    type: "com.myapp.order.created",
    jsonSerializableData: new { OrderId = 123, Total = 1500.00m }
);

var content = new CloudEventContent(cloudEvent, ContentMode.Structured, new JsonEventFormatter());
await httpClient.PostAsync(topicEndpoint, content);

7. Ne Zaman CloudEvents, Ne Zaman Event Grid Şeması?

Senaryo Öneri
Yeni uygulama geliştiriyorsanız CloudEvents kullanın
Azure dışı sistemlerle entegrasyon CloudEvents (standart, taşınabilir)
Mevcut Event Grid şeması kullanan sistemler Event Grid şeması (geriye dönük uyumluluk)
Azure Functions ile hızlı prototip Her ikisi de çalışır; CloudEvents önerilir

8. En İyi Pratikler

Pratik Açıklama
Idempotency Sağlayın At-least-once teslimat nedeniyle aynı olay birden fazla gelebilir.
Dead-Letter Queue Yapılandırın Teslim edilemeyen olayların kaybolmasını önleyin .
CloudEvents Kullanın Yeni projelerde standart format tercih edin .
Retry ve Timeout Yönetin Abone tarafında hata durumunda Event Grid otomatik retry yapar; ancak abone hızlı yanıt vermelidir.
Monitoring Kurun DeadLetteredCount ve DeliveryAttemptFailCount metriklerini izleyin .
Filtreleme Kullanın Abonelik seviyesinde olay filtreleme ile gereksiz çağrıları azaltın .

Sonuç

CloudEvents, olay verileri için evrensel bir dil oluşturur; Azure Event Grid ise bu dili yönetilen bir servis olarak konuşur. İkisi birlikte kullanıldığında, farklı platformlar ve servisler arasında standart, taşınabilir ve güvenilir bir olay iletişimi sağlanır. Event Grid'in yerel CloudEvents desteği sayesinde, olaylarınızı dönüştürmeden yayınlayabilir ve tüketebilirsiniz. Yeni projelerde CloudEvents kullanmak, sizi Azure ekosistemine bağımlı olmaktan kurtarır ve gelecekteki entegrasyonları kolaylaştırır. Unutmayın: Event Grid at-least-once teslimat yapar; bu nedenle aboneleriniz idempotent olmalı ve dead-letter mekanizmasını mutlaka yapılandırmalısınız.

Tüm yazılar Soru ya da yorumun mu var? Yaz