Yazılım Mimarileri ve Tasarım Desenleri Üzerine

.NET’te Rebus Kütüphanesiyle Saga Orchestration Yaklaşımının Uygulanması

Merhaba,

Malumunuz, microservice mimarisiyle tasarlanmış yazılımlarımızda kullanıcılar tarafından başlatılan işlem ya da görevlerin, bir servis tarafından alınıp ardından belirli servisler üzerinde mantıksal bir tetikleme silsilesiyle işlenme ve koordine edilme süreçlerini yürütmemize ve biryandan da bu süreçlerde data consistency’i(veri tutarlılığı) sağlıklı bir şekilde sağlayabilmemize imkan tanıyan Saga pattern’ını kullanmakta ve özellikle bu pattern’ın uygulandığı senaryolar da servis sayısının adil kotadan fazla olduğu durumlarda uygulanma zorluğu ve geliştirme maliyeti eğrisini düşürebilmemizi sağlayacak olan Orchestration yaklaşımını tercih etmekteyiz.

Eğer ki konuya dair bilgi sahibi olmaksızın direkt olarak bu içeriğe merak saldıysanız öncelikle Saga pattern’ının ne olduğunu anlayabilmek için Microservice Mimarilerde Saga Pattern İle Transaction Yönetimi başlıklı makaleyi, ardından da Orchestration implementasyonunu ele aldığımız Microservice – Saga – Commands/Orchestration Implementasyonu İle Transaction Yönetimi başlıklı içeriği okumanız gerekmektedir. Ha ayriyeten Microservice mimarisinde Saga’nın bir diğer alternatif yaklaşımı olan Choreography implementasyonunu da Microservice – Saga – Events/Choreography Implementasyonu İle Transaction Yönetimi başlıklı makaleden inceleyerek olayın dibini sıyırabilir ve bu içerikten istifade edebilecek altyapıyı kusursuz bir hale getirebilirsiniz.

Velhasıl, eğer ki konunun terminolojisine tam teferruatlı bir hakimiyet sağladıysanız bu içeriğimizde Orchestration yaklaşımının Rebus kütüphanesiyle farklı bir tekniğini pratik ağırlıklı olarak ele alacağımızı düşünebilirsiniz.

Rebus Nedir?

Rebus, distributed sistemlerde servisler arası asenkron mesajlaşma için kullanılan bir mesajlaşma kütüphanedir. Azure Service Bus, RabbitMQ, SQL Server, InMemory vs. gibi mesaj taşıma görevinden sorumlu olan transporter isimli birçok sistemi desteklemektedir. Ayrıca, belirli bir düzen içinde çalışan iş adımlarını veya microservice’lerin görev gerçekleştirme süreçlerini yönetmek için de kullanılabilmektedir.

Rebus İle Orchestration İmplementasyonu

Bunu direkt örnek bir senaryo üzerinden adım adım inceliyor olacağız. Senaryomuz temsilen, klasik e-ticaret sistemlerindeki sipariş süreçlerine karşın olacaktır. Senaryo sürecinde aşağıdaki servislerden istifade ediyor olacağız;

Servis Türü Açıklama
Order.API Web API Kullanıcı tarafından başlatılan siparişin alınmasını ve siparişe dair stok ve ödeme sürecinin başlatılmasını sağlayacak olan servistir.
Order.Saga Worker Service İlgili siparişe dair servisler arasındaki adım adım işleyiş neticesinin yürütüldüğü handler’ların barındırılacağı servistir. Düşündüğünüz zaman bu servisin sorumluluğunu direkt Order.API’ın alabileceğine ve sanki lüzumsuz olduğuna kanaat getirebilirsiniz. Ancak, Order.API’ın kullanıcıyla etkileşime girmekten başka mesaj tüketme sorumluluğunu üstlendirmek ilkelere aykırı olacağından dolayı bu sorumluluğu farklı bir servise yüklemek best practice açısından daha uygun olacaktır.
Stock.Service Worker Service Stok işlemlerinin yürütüleceği servistir.
Payment.Service Worker Service Ödeme işlemlerinin yürütüleceği servistir.
Shared Class Library Servisler arasında kullanılacak tüm ortak message ve event yapılanmalarını ve bunların yanında belli başlı queue isimleri gibi konfigürasyonları barındıracak olan ortak bir katmandır.
Saga.Orchestration.Service Worker Service Servisler arasındaki iş ve görev sürecini merkezi bir noktadan yönetmek üzere tasarlanacak olan ve böylece Orchestration yaklaşımını sağlayacak olan servisin ta kendisidir.

Ve bu servisler arasındaki iş akışı da aşağıdaki gibi olacaktır;

  1. Kullanıcı Order.API üzerinden bir sipariş talebinde bulunacak ve süreci başlatacaktır.
  2. Order.API siparişi veritabanına ekleyecek ve bunu Saga.Orchestration.Service‘e bildirecektir.
  3. Saga.Orchestration.Service ise oluşturulan siparişe dair Stock.Service‘e bilgide bulunacaktır. Stock.Service siparişteki ürünlere göre stok çalışması gerçekleştirilecektir. Stok işlemleri başarılı ya da başarısız olmak üzere sonuçlanacak ve neticeye göre Saga.Orchestration.Service‘e bildiride bulunulacaktır.
    1. Eğer ki, Stock.Service siparişe dair stok işlemlerini başarıyla gerçekleştirdiyse o taktirde Payment.Service‘e ödeme işlemleri için bilgide bulunacaktır.
    2. Yok eğer başarısız bir durum söz konusuysa işte o taktirde Order.Saga servisine siparişin başarıyla sonuçlanamadığına dair bilgi mesaj gönderecek ve ilgili sipariş iptal edilecektir.
  4. Payment.Service‘te ise ilgili siparişe dair ödeme başarılıysa eğer bunun için Saga.Orchestration.Service‘e bildiride bulunulacak ve o da, Order.Saga‘ya siparişin başarıyla sonuçlandığına dair mesaj yayınlayacaktır.
  5. Yok eğer ödeme gerçekleştirilemediyse hem siparişin iptal edilmesi hem de Stock.Service‘te ilgili siparişe dair yapılan stok işlemlerinin geri alınması için Saga.Orchestration.Service‘e bildiride bulunacak, o da, siparişi iptal etmesi için Order.Saga‘ya ve yapılan stok çalışmalarının geri alınması için de Stock.Service‘e mesaj yollayacaktır.
İlk Adım

Her şeyden önce yukarıda oluşturduğumuz projelere ilk adım olarak aşağıdaki kütüphanelerin yüklenmesi gerekmektedir;

Kazmayı Vuralım

Projelere ilgili kütüphaneleri yüklediğimize göre artık genel senaryonun inşasına başlayabiliriz. Bunun için aşağıdaki adımları sırasıyla seyretmemiz yeterli olacaktır kanaatindeyim…

İşte bu kadar 🙂

Nihai olarak;
Saga Orchestration implementasyonunu Rebus kütüphanesiyle, test adımı da dahil olmak üzere 19 adımda uygulamış ve MassTransit’e nazaran konuya dair alternatif bir yaklaşımı tecrübe etmiş bulunmaktayız. Nacizane fikrim, Rebus kütüphanesi MassTransit’e karşın yapılandırma açısından düşük bir komplikasyona sahip olsa da onun kadar geniş bir yelpazede entegrasyon imkanı sağlamamakta ve küçük yahut orta ölçekli uygulamalarda daha pratik çözümler sunmaktadır.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek çalışmaya aşağıdaki github adresinden erişebilirsiniz.
https://github.com/gncyyldz/Saga.Orchestration.Example.With.Rebus

Mobil sürümden çık