Microservice Mimarisinde Servisler Arası İletişim ve Event-Driven Mimari

Microserviceden microservice iletişim
  • Kodumuzda olduğu gibi microserviceler arasında da loosely coupled bir yapı elde etmemiz gerekiyor. Yani bir servisin diğerlerine olan bağımlılığı olabildiğince az olmalıdır.
  • Deployment için diğer servislere ihtiyaç olmamalıdır.
  • Bağımsızca test edilebilir olmalıdır.

Senkron İletişim

Monolitik uygulamaların konsepti oldukça açık ve kolaydır. Client uygulamaya istekte bulunur, uygulama tek bir parçadan oluştuğu için işlemlerini tek bir koldan yaparak cevap döner. Microservice mimarisinde ise her zaman birbiriyle iletişim kuran birçok farklı servis vardır. Senkron iletişim ise microserviceler arası iletişimi sağlamak içi kullanılan yöntemlerinden biridir.

Senkron Payment Request
  • Servisler ilk olarak çalıştığında Service Discovery servisine kendilerini kaydeder.
  • Bir ödeme gerçekleştiğinde Payment servisine bu request iletilir.
  • Sonrasında bu bilgilere göre payment işlemi banka ile iletişime geçmek üzere banking servisine gönderilir ve bu gönderim yapılırken sadece servisin ismi bilinerek bu gerçekleştirir. Servis Discovery sayesinde ip ve port bilgileri gibi bilgiler gönderici servisi tarafından bilinmesine gerek kalmaz.
  • Banking servisine gelen bilgiler ile ödeme gerçekleştiğinde banking servisi bir response üretir.
  • Üretilen response’u hali hazırda cevabı bekleyen payment servisi alarak gerekli işlemleri kendi içinde gerçekleştirir ve kullanıcıya cevabını döner.

Asenkron İletişim

Asenkron işlemlerde istekte bulunan servis, hizmet aldığı servisten yanıt beklemez. Böylece istekte bulunan servis hizmet aldığı serviste bağımlı hale gelmez ve bu da microservice mimarisinde tam olarak istediğimiz bir durumdur (Loosely coupled servisler). Asenkron istek başarısız olduğunda bile servis sorunsuzca çalışmaya devam eder. Başarısız olma durumu ise farklı tekniklerle çözümlenir ama bu durum herhangi bir işlemin devam etmesine engel olmaz. Yani istekte bulunan servis threadleri bloke olmamıştır.

Notification ve Request/Non-blocking Response

Notification asenkron iletişimin en basit formudur. Başka bir servise istek gönderilir ancak cevap beklemeksizin işlemlere devam edilir ve non-blocking olarak gönderilen işlem başarılı sayılır. Uygulaması ise diğer asenkron yöntemlere göre oldukça basittir. Direkt olarak diğer servise yapılan bir asenkron istek başarılı sayılarak bloklanmadan devam edilir ve dolayısıyla bağımlılık aza indirgenmiş olur yani loosely coupled yapıda olduğunu gösterir.

Notification Örneği

Message-Driven Mimari ile Asenkron İletişim

Message-Driven mimarisinde HTTP ile iletişimin aksine, ilgili servisler birbirleriyle doğrudan iletişim kurmaz. Mesaj tabanlı mimaride publish/subscriber ilkesi üzerine konumlandırılmış bir yapı mevcuttur.

Event-Driven Mimari ile Asenkron İletişim

Event-Driven mimari microservice ekosisteminde servislerin birbirine olan bağını tamamen birbirinden bağımsız hale getirerek ortadan kaldırmayı amaçlar. Yani amaç, bağımsız microservicelerden oluşmuş bir cumhuriyettir. Servislerin ortak bir mesaj yapısını bilmesi gereken mesajlaşma modelinin aksine, event odaklı bir yaklaşımda mesajın tam olarak ne olduğu ve mesaj sonucunda her servis ne yapmalı gibi bir duruma ihtiyaç yoktur. Servisler arasındaki iletişim, servislerde oluşan olaylar sonucunda gerçekleşir.

Event Driver Architecture örneği
  • Mağaza (Market,Depo) bilgilendirilmeli,
  • Kullanıcıya siparişin oluştuğuna dair e-mail atılmalı,
  • Kurye siparişi teslim edebilmek üzere bilgilenmeli ve bu sırada başka sipariş almamalı,
  • İlgili ürünler mağaza stoğundan düşürülmeli,
  • Order service’inden Order Created event şeklinde Message Bus’a bildirilir.
  • Email servisi aldığı event’ı kendi içerisindeki bilgiler ile birleştirerek ilgili kullanıcıya email göndermektedir.
  • Paralelde ise Courier servisi aracılığıyla kurye atama işlemleri gerçekleştirilir
  • Yine paralelde siparişin oluştuğu bilgisi Shop servisine düşmüştür, oluşan bilgi ile birlikte shop servisi üzerinden işlemler yapılır ve siparişin içeriklerine uygun şekilde sipariş hazırlanmış olur.

TL, DR;

Microservice mimarisinde asenkron ve senkron olmak üzere iki iletişim yöntemi kullanılmaktadır. Senkron iletişim HTTP üzerinden genellikle Rest ile yürütülmektedir. Senkron iletişim servisler arasındaki iletişimin kesinlikle tamamlanması gerektiği ve cevap beklendiği durumlarda kullanılmaktadır. Geri kalan tüm durumlarda Asenkron iletişim yöntemi tavsiye edilir. Asenkron iletişim için en iyi yol Event-Driven mimarisiyle birlikte message bus üzerinden iletişimin konumlandırılmasıdır. Event-Driven mimari ile her bir olay message bus’a iletilir ve o event ile ilgili servisler bu event’ı dinleyerek gerekli işlemleri kendi üzerlerinde başka bir bilgiye ihtiyaç duymadan, bağımsız ve paralel olarak yürütebilir.

Kaynakça’da bulunan ilk yazıdan esinlenilmiştir.

--

--

Software Engineer @Yemeksepeti • #Java • #Spring Boot • #Kotlin • #Spark • #Microservices • https://gokhana.dev

Love podcasts or audiobooks? Learn on the go with our new app.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store
Gökhan Ayrancıoğlu

Gökhan Ayrancıoğlu

Software Engineer @Yemeksepeti • #Java • #Spring Boot • #Kotlin • #Spark • #Microservices • https://gokhana.dev