Bu son zamanlarda bir röportaj sırasında sordum klasik bir soru Nasıl birden fazla web hizmetleri aramak ve hala görev ortasında bir tür hata işleme korumak. Bugün, yüksek performanslı hesaplamada, iki aşamalı taahhütlerden kaçınırız. Yıllar önce işlemler için "Starbuck modeli" olarak adlandırılan şey hakkında bir makale okudum: Starbuck'ta sipariş ettiğiniz kahveyi sipariş etme, ödeme, hazırlama ve alma sürecini düşünün ... Bir şeyleri basitleştiririm ama iki aşamalı bir taahhüt modeli tüm işlemin, kahvenizi alana kadar tüm adımlar için tek bir sarma işlemi olmasını öneririz. Bununla birlikte, bu modelle, tüm çalışanlar kahvenizi alana kadar bekler ve çalışmayı bırakır. Resmi görüyor musun?
Bunun yerine, "Starbuck modeli", "en iyi çaba" modelini izleyerek ve süreçteki hataları telafi ederek daha verimlidir. İlk olarak, ödeme emin olun! Ardından, siparişiniz bardağa eklenmiş mesaj kuyrukları vardır. Süreçte bir şeyler ters giderse, kahvenizi almadıysanız, sipariş ettiğiniz şey değildir, vb., Tazminat sürecine gireriz ve istediğinizi aldığınızdan veya size geri ödeme yaptığınızdan emin oluruz, Bu en verimli modeldir artan verimlilik için.
Bazen, starbuck bir kahve harcıyor, ancak genel süreç verimli. Web hizmetlerinizi, istediğiniz zaman çağrılabilecek şekilde tasarlama ve yine de aynı sonucu verebilme gibi tasarlarken düşünmeniz gereken başka numaralar da vardır. Benim tavsiyem:
Web hizmetlerinizi tanımlarken çok iyi olmayın (bu günlerde meydana gelen mikro-hizmet abartısı konusunda ikna olmadım: çok ileri gitme riski çok fazla);
Async performansı artırır, bu nedenle async olmayı tercih edin, mümkün olduğunda e-postayla bildirim gönderin.
Her adımda iş kurallarını doğrulayarak, sonuna kadar alttan üste doğru sıralamayı izleyecek bir kullanıcı kimliği veya görev kimliği ile işleyerek onları istediğiniz kadar "yeniden doldurulabilir" hale getirmek için daha akıllı hizmetler oluşturun;
İleti kuyruklarını (JMS veya diğerleri) kullanın ve ters işlemleri uygulayarak "geri alma" işlemlerini uygulayacak olan hata işleme işlemcilerine yönlendirme yapın; bu arada, zaman uyumsuz siparişle çalışmak, işlemin geçerli durumunu doğrulamak için bir tür kuyruk gerektirir, bu yüzden düşünün;
Son çare olarak, (sık sık olmayabileceğinden), hataların manuel olarak işlenmesi için bir sıraya koyun.
Gönderilen ilk sorunla geri dönelim. Bir hesap oluşturun ve bir cüzdan oluşturun ve her şeyin yapıldığından emin olun.
Diyelim ki tüm operasyonu düzenlemek için bir web servisi çağrıldı.
Web servisinin sözde kodu şöyle görünecektir:
Hesap oluşturma mikro hizmetini arayın, bazı bilgileri ve benzersiz bir görev kimliğini iletin 1.1 Hesap oluşturma mikro hizmeti ilk önce o hesabın oluşturulup oluşturulmadığını kontrol eder. Bir görev kimliği hesabın kaydı ile ilişkilendirilir. Mikro hizmet hesabın bulunmadığını algılar, böylece hesabı oluşturur ve görev kimliğini depolar. NOT: Bu hizmet 2000 kez çağrılabilir, her zaman aynı sonucu verecektir. Hizmet, "gerekiyorsa geri alma işlemini gerçekleştirmek için en az bilgi içeren bir makbuz" ile yanıt verir.
Hesap oluşturma ve görev kimliği vererek Cüzdan oluşturma işlevini arayın. Diyelim ki bir koşul geçerli değil ve cüzdan oluşturma gerçekleştirilemiyor. Çağrı bir hata ile geri dönüyor ancak hiçbir şey oluşturulmadı.
Orkestratör hata hakkında bilgilendirilir. Hesap oluşturma işlemini iptal etmesi gerektiğini biliyor ancak bunu kendisi yapmayacak. 1. cüzdanın sonunda alınan "minimal geri alma makbuzunu" geçerek cüzdan servisinden bunu yapmasını isteyecektir.
Hesap hizmeti geri alma fişini okur ve işlemin nasıl geri alınacağını bilir; geri alma makbuzu, işin bir parçası yapmak için kendisini çağırabileceği başka bir mikro hizmet hakkında bilgi içerebilir. Bu durumda, geri alma makbuzu Hesap Kimliği'ni ve muhtemelen ters işlemi gerçekleştirmek için gereken bazı ek bilgileri içerebilir. Bizim durumumuzda, işleri basitleştirmek için, hesap kimliğini kullanarak hesabı silmek olduğunu varsayalım.
Şimdi, web hizmetinin Hesap oluşturma işleminin geri alınmasının başarılı veya başarısız olduğunu (bu durumda) hiç almadığını varsayalım. Hesabın geri alma hizmetini tekrar çağırır. Ve bu hizmet normalde asla başarısız olmamalıdır çünkü hedefi artık hesabın mevcut olmamasıdır. Böylece var olup olmadığını kontrol eder ve geri almak için hiçbir şey yapılamayacağını görür. Böylece operasyonun başarılı olduğu sonucuna varır.
Web hizmeti, hesabın oluşturulamadığı kullanıcıya döner.
Bu senkronize bir örnektir. Sistemin hatayı tamamen düzeltmesini istemiyorsak, bunu farklı bir şekilde yönetebilir ve davayı yardım masasına yönelik bir mesaj kuyruğuna koyabilirdik. " Durumları düzeltmek için arka uç sistemine kancalar sağlanabilir Yardım masası başarıyla gerçekleştirilenleri içeren mesajlar aldı ve geri alma makbuzumuzun tam otomatik bir şekilde kullanılabileceği gibi şeyleri düzeltmek için yeterli bilgiye sahipti.
Bir arama yaptım ve microsoft web sitesinin bu yaklaşım için bir desen açıklaması var. Dengeleme işlem modeli denir:
Telafi edilen işlem modeli