Benim rahat ettiğimden daha fazla taviz veren birçok çözüm var. Kullanım durumunuz farklı bankalar arasında para taşımak gibi karmaşıksa, daha keyifli alternatifler imkansız olabilir. Ancak, ortak senaryoda neler yapabileceğimize bakalım, burada mikro hizmet kullanımının veritabanı veritabanı işlemlerimizle etkileşime girdiği görülebilir.
Seçenek 1: Mümkünse, işlem gereksiniminden kaçının
Daha önce açık ve belirtilmiş, ancak başarabilirsek ideal. Bileşenler aslında aynı mikro hizmete ait miydi? Veya işlem gereksiz olacak şekilde sistem (ler) ini yeniden tasarlayabilir miyiz? Muhtemel olmayan işlemeyi kabul etmek en uygun fedakarlıktır.
Seçenek 2: Bir sıra kullanın
Diğer hizmetin ne yapmasını istediğimizde başaracağına kesin olarak karar verirsek, bir tür kuyruk aracılığıyla arayabiliriz. Sıraya alınan öğe daha sonra alınmaz, ancak öğenin sıraya alındığından emin olabiliriz .
Örneğin, bir varlık eklemek ve tek bir işlem olarak bir e-posta göndermek istediğimizi söyleyin. Posta sunucusunu aramak yerine, e-postayı bir tabloda sıraya koyarız.
Begin transaction
Insert entity
Insert e-mail
Commit transaction
Net bir dezavantajı, çoklu mikro servislerin aynı tabloya erişmesi gerekmesidir.
Seçenek 3: Dış işi en son, işlemi tamamlamadan önce yapın
Bu yaklaşım, işlem yapmanın başarısız olma ihtimalinin düşük olduğu varsayımına dayanmaktadır.
Begin transaction
Insert entity
Insert another entity
Make external call
Commit transaction
Sorgular başarısız olursa, harici arama henüz gerçekleşmedi. Dış arama başarısız olursa, işlem asla gerçekleştirilmez.
Bu yaklaşım yalnızca bir dış görüşme yapabileceğimiz ve son olarak yapılması gereken sınırlamalarla gelir (yani sonuçlarını sorgularımızda kullanamayız).
Seçenek 4: Bekleyen bir durumda bir şeyler oluşturun
Yayınlandığı gibi burada , biz, birden microservices farklı bileşenleri oluşturmak bekleme durumunda her olmayan transactionally sahip olabilir.
Herhangi bir doğrulama yapılır, ancak kesin bir durumda hiçbir şey oluşturulmaz. Her şey başarıyla oluşturulduktan sonra, her bir bileşen etkinleştirilir. Genellikle, bu işlem çok basittir ve yanlış giden bir şey olma olasılığı o kadar küçüktür ki, aktivasyonu işlemsiz olarak yapmayı bile tercih edebiliriz.
En büyük dezavantajı muhtemelen bekleyen öğelerin varlığını hesaba katmamız gerektiğidir. Herhangi bir seçim sorgusu, bekleyen verilerin eklenip eklenmeyeceğini dikkate almalıdır. Çoğu bunu görmezden gelmeli. Ve güncellemeler tamamen başka bir hikaye.
Seçenek 5: Mikro hizmetin sorgusunu paylaşmasına izin verin
Diğer seçeneklerin hiçbiri sizin için yapmıyor mu? Öyleyse sıradışı olsun .
Şirkete bağlı olarak, bu kabul edilemez olabilir. Farkındayım. Bu sıra dışı. Kabul edilebilir değilse, başka bir rotaya gidin. Ancak bu durumunuza uygunsa, sorunu basit ve güçlü bir şekilde çözer. Sadece en kabul edilebilir uzlaşma olabilir.
Sorguları birden fazla mikro hizmetten basit ve tek bir veritabanı işlemine dönüştürmenin bir yolu var.
Sorguyu yerine çalıştırmak yerine döndürün.
Begin transaction
Execute our own query
Make external call, receiving a query
Execute received query
Commit transaction
Ağ üzerinden, her mikro hizmetin her bir veritabanına erişebilmesi gerekir. Bunu gelecekteki ölçeklendirme konusunda da aklınızda bulundurun.
İşlemde yer alan veritabanları aynı sunucudaysa, bu normal bir işlem olacaktır. Farklı sunuculardalarsa, dağıtılmış bir işlem olur. Kod ne olursa olsun aynıdır.
Sorgu, bağlantı türü, parametreleri ve bağlantı dizesi dahil olmak üzere alınır. Akışı okunabilir kılarak, temiz bir çalıştırılabilir Command sınıfına sarabiliriz: Mikro hizmet çağrısı, işlemimizin bir parçası olarak yürüttüğümüz bir Komutla sonuçlanır.
Bağlantı dizesi, kaynak mikro hizmetin bize verdiği şeydir, bu nedenle tüm amaç ve amaçlar için, sorgunun hala bu mikro hizmet tarafından gerçekleştirildiği kabul edilir. Sadece fiziksel olarak müşteri mikro servisini yönlendiriyoruz. Bu bir fark yaratır mı? Başka bir sorgu ile aynı işleme koymamızı sağlıyor.
Eğer uzlaşma kabul edilebilirse, bu yaklaşım bize bir mikro hizmet mimarisinde, bir monolith uygulamasının basit işlemselliğini verir.