Çok sayıda giriş verisi gerektirdiğinde bir kural motoru mikro hizmet mimarisine nasıl yerleştirilir?


12

Mevcut durum

Mikro hizmet mimarisinde bir çevrimiçi alışveriş web uygulaması uyguluyoruz (ve şimdi de sürdürüyoruz).

Şartlardan biri, işletmenin, deneyimlerini ve nihai siparişini özelleştirmek için müşterilerimizin sepetlerine ekledikleri kurallar uygulayabilmesidir. Oldukça açık bir şekilde, bir iş kuralları motoru devreye sokulmalıydı ve bunun için belirli bir "mikro hizmet" uyguladık (eğer hala böyle diyebilirsek).

Bir yıl boyunca, bu kural motoru gittikçe daha karmaşık hale geldi ve daha fazla veri (ör. Alışveriş sepetinin içeriği, aynı zamanda kullanıcı bilgileri, rolü, mevcut hizmetleri, bazı fatura bilgileri vb.) bu kuralları hesaplar.

Şu an için shopping-cartmikro hizmetimiz tüm bu verileri diğer mikro hizmetlerden topluyor. Bu verilerin bir kısmı tarafından kullanılmasına shopping-cartrağmen, çoğunlukla kural motorunu beslemek için kullanılır.

Yeni gereksinimler

Şimdi benzer uygulamalar için kural motorunu yeniden kullanmak için diğer uygulamalara / mikro hizmetlere ihtiyaç duyulmaktadır. Mevcut durumda, bu nedenle aynı tür verileri iletmeleri, aynı mikro hizmetleri çağırmaları ve kural motorunu çağırabilmek için (neredeyse) aynı kaynakları inşa etmeleri gerekecektir.

Olduğu gibi, bazı sorunlarla karşılaşacağız:

  • herkes (kural motoru olarak adlandırılır), kendileri için ihtiyaç duymasalar bile verilerin getirilmesini yeniden uygulamak zorundadır;
  • kural motoru talepleri karmaşıktır;
  • bu yönde devam ederek, bu verileri birçok istek için ağın her yerine taşımamız gerekecek (μs A çağırma μs B'yi kural motorunu çağırıyor, ancak A zaten kural motorunun ihtiyaç duyduğu verilerin bazılarına sahip);
  • shopping-cart tüm veri getirme nedeniyle çok büyük oldu;
  • Muhtemelen bir çok unutacağım…

Bu sıkıntılardan kaçınmak için ne yapabiliriz?

İdeal olarak, kural motoruna daha fazla karmaşıklık eklemekten kaçınırız. Bunun bir darboğaz haline gelmediğinden de emin olmalıyız - örneğin, bazı verilerin getirilmesi oldukça yavaştır (10s veya daha fazla), bu nedenle shopping-cart, kuralları çağırmadan önce verilerin orada olma olasılığı daha yüksek olacak şekilde ön getirme uyguladık kullanın ve kabul edilebilir bir kullanıcı deneyimi sağlayın.

Bazı fikirler

  1. Kural motoru, ihtiyaç duyduğu verileri getirsin. Bu, tek sorumluluk ilkesini ( daha da fazla… ) ihlal ederek ona daha da karmaşıklık katacaktır ;
  2. Verileri almak için kural motorundan önce bir proxy μs uygulayın;
  3. Kural motorunun ihtiyaç duyduğu tüm verileri bir kerede almak için çağırdığı bir "veri getirici" μs uygulayın (bileşik sorgulama).

Bunu özetleyeyim (sorularla): bir mağaza için uygulanan birkaç mikro hizmetiniz var. Bunlardan biri bir alışveriş sepeti . Arabaya bir kural motoru (homebrew veya bir ürün) dahil edilmiş, değil mi? Bir kullanıcı sepete bir öğe eklediğinde, kurallar motoru iş mantığının bir parçası olarak devreye girer ve sepeti bir şekilde değiştirir (örn. İndirim veya paket ürünler), değil mi? Şimdi başka microservice da kuralları kullanmak isteyen olabilir , değil benzer girdi-verileri temel? Ve giriş verileri diğer mikro hizmetler tarafından sağlanır, değil mi? Verilerin getirilmesi neden bu kadar karmaşık?
Andy

3
Bu sıkıntılardan kaçınmak için en iyi seçim kural motorundan kurtulmaktır.
whatsisname

@Andy Kural motoru ayrı bir mikro hizmettir. API'sı biraz uyarlanmıştır shopping-cart, ancak diğer mikro hizmetlerin ihtiyaçlarına göre kolayca uyarlayabiliriz (yine de kullanıcılar, ürünler ve siparişle ilgilidir). Gördüğümüz gibi, onlar olacaktır iş uygulamak için yüklemler seçim yapabiliyor, özellikle de aynı giriş veri gerekir. Tüm veriler, alışveriş sepeti içeriğinin kendisi dışındaki diğer mikro hizmetler tarafından sağlanır. Verilerin getirilmesi kendi başına karmaşık değildir, ancak ~ 10 başka mikro hizmet çağırmanız ve kural motoru tarafından beklenen yapıyı korumanız gerektiğinde karmaşık hale gelir.
Didier L

@whatsisname Genelde bir kural motoruna sahip olmanın büyük bir hayranı değilim ama şu anda bununla ve yine de başa çıkmak zorundayız ve iş, yapılandırmasını günlük olarak değiştiriyor. Bundan kurtulmuş olsak bile, aynı girişleri yapmak için aynı şeyleri yapmak için bazı yapılandırılabilir bileşenlere ihtiyacımız olacaktı ... Yine de kural motoru olacaktı, sadece başka bir isimle ve yine aynı sorunlarla karşı karşıya kalacağız.
Didier L

Yanıtlar:


8

Şimdi bir saniye için bir adım geriye gidelim ve yeni olması muhtemel bu cevabı yazmadan önce başlangıç ​​yerimizi değerlendirelim. Var:

  • Büyük bir yekpare (kural motoru)
  • Toplu olarak gönderilen çok sayıda modülerleştirilmemiş veri
  • Kural motoruna / kural motorundan veri almak zor
  • Kural motorunu kaldıramazsınız

Tamam, bu mikro hizmetler için o kadar da iyi değil. Hemen göze çarpan bir sorun, siz mikro hizmetlerin ne olduğunu yanlış anladığınız anlaşılıyor.

herkes (kural motoru olarak adlandırılır), kendileri için ihtiyaç duymasalar bile verilerin getirilmesini yeniden uygulamak zorundadır;

Mikro hizmetlerinizin kullandığı bir çeşit API veya iletişim yöntemi tanımlamanız ve ortak olması gerekir. Bu, hepsinin içe aktarabileceği bir kütüphane olabilir. Bir mesaj protokolü tanımlıyor olabilir. Mevcut bir araç kullanıyor olabilir ( iyi bir başlangıç ​​noktası olarak mikro hizmet mesajı veriyollarına bakın ).

Hizmet içi iletişim sorunu, kendiliğinden "çözülmüş" bir sorun değil, aynı zamanda bu noktada "kendi başınıza dön" sorunu da değildir. Mevcut araç ve stratejilerin çoğu hayatınızı bir ton kolaylaştırabilir.

Ne yaparsanız yapın, tek bir sistem seçin ve bunu kullanmak için iletişim API'larınızı uyarlamaya çalışın. Hizmetlerinizin etkileşimi için belirli bir yol olmadan, mikro hizmetlerin ve monolitik hizmetlerin tüm dezavantajlarına sahip olacaksınız ve ikisinin de avantajlarından hiçbirine sahip olmayacaksınız.

Sorunlarınızın çoğu bundan kaynaklanıyor.

kural motoru talepleri karmaşıktır;

Onları daha az karmaşık hale getirin.

Onları daha az karmaşık hale getirmenin yollarını bulun. Ciddi anlamda. Ortak veri modelleri, tek kural motorunuzu daha küçük olanlara ayırın veya başka bir şey. Kural motorunuzun daha iyi çalışmasını sağlayın. "Sorguya her şeyi sıkıştır ve bunları karmaşık hale getirmeye devam et" yaklaşımını kullanmayın - ne yaptığınıza ve nedenine ciddi bir şekilde bakın.

Verileriniz için bir tür protokol tanımlayın. Benim tahminim , (yukarıda belirtildiği gibi) tanımlanmış bir API planınız yok ve gerektiğinde REST çağrıları ad hoc yazmaya başladınız. Artık her şey güncellendiğinde her mikro hizmetin bakımını yapmanız gerektiğinden bu durum giderek karmaşıklaşıyor.

Daha da iyisi, bir çevrimiçi alışveriş aracını uygulayan ilk şirket siz değilsiniz . Diğer şirketleri araştırın.

Şimdi ne olacak...

Bundan sonra, en azından en büyük sorunlardan bazılarını tetiklediniz.

Sonraki konu, kural motorunuzun bu sorusudur. Umarım bu durum oldukça vatansızdır, öyle ki ölçekleyebilirsiniz. Eğer öyleyse, en azından en az bir ihtişamla ölmeyecek ya da çılgınca çözümler üretmeyeceksiniz.

Kural motorunuzun vatansız olmasını istiyorsunuz. Yalnızca verileri işleyecek şekilde yapın. Bir darboğaz olarak bulursanız, bir proxy / yük dengeleyicisinin arkasından birkaçını çalıştırabilmeniz için yapın. İdeal değil, ama yine de uygulanabilir.

Mikro hizmetlerinizin gerçekten kural motorunuza konulup konulmayacağını düşünerek biraz zaman ayırın. Sadece bir "mikro hizmet mimarisi" elde etmek için sistem yükünü önemli ölçüde artırıyorsanız, bunu planlamak için daha fazla zaman harcamanız gerekir.

Alternatif olarak, kural motorunuz parçalara ayrılabilir mi? Sadece kural motorunuzun belirli hizmetlerinin parçalarını yaparak kazanç elde edebilirsiniz.

Ayrıca, bunun bir darboğaz haline gelmediğinden de emin olmalıyız - örneğin, bazı verilerin getirilmesi oldukça yavaştır (10s veya daha fazla)

Bu sorunun yukarıdaki sorunları çözdükten sonra var olduğunu varsayarsak, bunun neden olduğunu ciddi bir şekilde araştırmanız gerekir. Bir kabus görüyorsunuz, ancak neden alışveriş portalı verilerini göndermek için neden (10 saniye?) Hanedan olarak adlandırın, ama bu biraz saçma görünüyor) semptomlara neden olan soruna bakmaktansa semptomları yamalamak gibi görünüyor ilk sırada.

"Veri getiriliyor" ifadesini tekrar tekrar kullandınız. Bu veriler bir veritabanında mı? Değilse, bunu yapmayı düşünün - veriyi "elle" almak için çok fazla zaman harcıyorsanız, gerçek bir veritabanı kullanmak iyi bir fikir olacaktır.

Getirdiğiniz veriler için veritabanına sahip bir tasarıma sahip olabilirsiniz (bunun ne olduğuna bağlı olarak, birçok kez bahsetmiştiniz), birkaç kural motoru ve müşterileriniz.

Son bir not, API'larınızın ve hizmetlerinizin doğru sürümünü kullandığınızdan emin olmaktır. Küçük bir sürüm geriye dönük uyumluluğu bozmamalıdır. Çalışmanız için tüm hizmetlerinizi aynı anda serbest bırakırsanız, bir mikro hizmet mimariniz yok, dağıtılmış bir yekpare mimariniz var.

Ve nihayetinde, mikro hizmetler tek bedene uyan bir çözüm değildir. Lütfen, kutsal olan her şey uğruna, sadece bunu yapma çünkü yeni kalça işi.


Cevabınız için teşekkürler, @enderland. Gerçekten de mikro hizmet mimarisi bizim için hala nispeten yeni, dolayısıyla bu soru. Bu kural motoru bizi burada yönlendirmek için organik olarak biraz gelişti, bu yüzden şimdi düzeltmek için yol tariflerine ihtiyacımız var. (Neyse ki) tamamen vatansızdır, dolayısıyla girdi olarak aldığı veri miktarıdır. Ve bunu tekrar kullanılabilir bir bileşen haline getirmek için önce ele almak istediğimiz şey. Ancak mevcut tahminleri azaltmadan giriş verisi miktarını nasıl azaltabilirim? Sanırım verileri tek başına alabilen bir API'ye ihtiyacımız var, ancak düzgün bir şekilde nasıl mimarilebiliyoruz?
Didier L

Performans sorunlarıyla ilgili olarak, bunlar arka uçların uyguladığı yavaş JMS ve SOAP hizmetlerini çağıran mikro hizmetlerden gelir. Kendi veritabanlarına sahipler, ancak performans gerçekten ilk hedefleri değil (yükü ele aldığı sürece). Ve onların verilerini çoğaltmayı ve korumayı düşünecek çok fazla var (bazıları için bunu yapıyoruz). Yapabileceğimiz en iyi şey önbelleğe almak ve önceden getirmektir.
Didier L

" Birkaç kural motoru " ndan bahsettiğinizde , sadece 1 tip girdi ile tahminleri değerlendiren özel kural motorları anlamına geldiğini anlıyorum, değil mi? İhtiyaç duydukları verileri getirmelerini önerir misiniz yoksa önceden getirilmesi mi gerekir? Ayrıca, tahminlerin kombinasyonunu düzenlemek için bazı bileşenlere ihtiyacımız var, değil mi? Ve bu düzenleme nedeniyle çok fazla ağ ek yükü eklememeye dikkat edin.
Didier L

1

Kural motoru, girdileri ve çıktıları hakkında sunulan bilgi miktarı ile, öneri no. 2 doğru yolda.

Kural motorunun mevcut tüketicileri, gerekli bilgileri daha özel amaçlı bir bileşene toplama sürecini dış kaynaklardan kullanabilirler.

Örnek: Şu anda alışveriş sepetinin içeriğine uygulanması gereken indirimleri hesaplamak için kurallar motorunu kullanıyorsunuz. Önceki satın alımlar, coğrafya ve mevcut teklifler buna dahil.

Yeni gereksinim, aynı bilgilerin çoğunun, yaklaşan özel kampanyalara ve önceki satın alma işlemlerine dayanarak önceki müşterilere e-posta göndermek için kullanılmasıdır. Önceki satın alımlar, mevcut ve gelecek teklifler buna dahil.

Bunun için iki ayrı hizmetim olacaktı. Her biri, ağır kaldırmasının bir kısmı için kural motoru hizmetine güvenecekti. Her biri kural motoruna istekleri için gerekli verileri toplar.

Kural motoru sadece kuralları uygular, tüketicilerin motorun belirli bir bağlam için tam olarak hangi verilere ihtiyacı olduğu konusunda endişelenmeleri gerekmez ve bu yeni aracı hizmetler sadece bir şey yapar: Bağlamı birleştirin ve isteği kural motoruna iletin ve değiştirilmemiş yanıtı döndürür.


0

Karar için gerekli verilerin toplanması kural motoru dışında yapılmalıdır. Bunun nedeni, mümkün olan en iyi durumda vatansız hizmetler olarak tasarlanmasıdır. Veri getirme zorunlu olarak eşzamansız işlemeyi ve durum tutmayı içerir. Getirmenin karar servisini önleyen bir vekil, arayanlar veya bir iş süreci tarafından yapılması önemli değildir.

Uygulama için pratik bir konu olarak, IBM Operasyonel Karar Yöneticisi'nin belgelendirmeye başladığını ve ürünün liman işçiliği konteynırları içinde kullanımını zaten desteklediğini belirteceğim . Diğer ürünlerin de bu desteği sağladığından ve ana akım olacağından eminim.


0

Basit düşünceme göre, sanırım, müşteri verileri satın almaya ve önbelleğe almaya başlar başlamaz veri alma hizmetlerine bir dizi zaman uyumsuz çağrı yaparak tüm gerekli verileri önceden almanıza yardımcı olacaktır. Kurallar servisini çağırmanız gerektiğinde veriler zaten oradadır. Ve oturum sırasında diğer hizmetler için de kullanılabilir olmaya devam edin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.