Mikro hizmetlerde çoktan çoğa dernekler


13

Şu anda iki mikro hizmetim var. Onları arayacağız Ave B.

Mikro hizmet altındaki veritabanı Aaşağıdaki tabloya sahiptir:

A
|-- users

Mikro hizmet altındaki veritabanı Başağıdaki tabloya sahiptir:

B
|-- trackers

Gereksinimler bunu belirtir usersve trackersçoktan çoğa bir ilişkiye sahiptir.

Bunu bir mikro hizmet mimarisi içinde nasıl düzgün bir şekilde ele alacağımdan emin değilim.

Bunun üç şekilde çalıştığını görebiliyordum:

  1. user_trackersMikro hizmete bir tablo eklenir A. Bu, usersve öğelerine "yabancı anahtarlar" içeren bir birleştirme tablosuna benzer şekilde davranır trackers.
  2. ownersMikro hizmete bir tablo eklenir B. Bu tablo, polimorfik birleştirme tablosuna benzer şekilde hareket eder. Bu, herhangi bir hizmetin bir izleyici ile ilişkilendirme yapmasına izin verir. Bu şöyle görünebilir: B |-- trackers |-- owners |-- owner_id |-- owner_type |-- tracker_id
  3. Her mikro hizmet için usersve trackersher bir mikro servis için kayıt tutun . Bir çeşit pubsub sistemi ile senkronize halde tutun.

Başlangıçta seçenek 2 ile gidecektim çünkü işlem sınırlarını korumayı sevdim. Bir izleyici oluşturabilir ve atomik bir şeyle ilişkilendirebilirim. Ancak, mikro hizmet kapsamı dışında görünüyor B. Mikro Bhizmet neden mikro hizmetin Abir ilişki oluşturmak istediğine dikkat etmelidir ?

Burada farkında olmadığım muhtemelen iyi bir model olduğunu hissediyorum. Ortaya koyduğum seçeneklerden herhangi biri anlamlı mı? Daha anlamlı olabilecek başka bir seçenek var mı?

Yanıtlar:


12

Her şeyden önce, alan açıklaması ile başlardım. Ne hakkında bahsetmedin (tahmin edebilirim, ama sadece bir tahmin olurdu). Bundan sonra, değer zinciri analizi veya iş yeteneği eşlemesi kullanarak ayrıştırmaya çalışacağım . Ve ancak bundan sonra uygulamayı düşünürdüm.

Sorununuzu göz önünde bulundurarak, aklıma gelen ilk şey, hizmet sınırlarınızı yanlış tanımlamanızdır, çünkü birbirlerinin verilerine ihtiyaç duydukları için. Dağıtılmış monolitle sonuçlanmak istemiyorsun, değil mi?

İkinci şey, muhtemelen alan adınızda yeterince iyi çalışmamanızdır. usersTablo ile hangi kavram temsil edilir ? Bir mı registered userkayıt için gerekli bilgi ve davranış, tüm ile? Onunla iletişim kurmak için doğru kavram olduğundan emin misiniz trackers(ne olursa olsun)? Yani, doğru anladıysam, 2. seçeneğiniz tam olarak bununla ilgilidir: owneralanınıza çok daha yakın olan kavramı tanıtmak . Gerçekten böyleyse, ben de 2. seçenek için geldim.

Bununla birlikte, mikro hizmet B'nin kapsamı dışında görünmektedir. Mikro hizmet B neden mikro hizmet A'nın bir ilişki kurmak istediğine dikkat etmelidir?

Her şey sınırlarla ilgili. Sanırım varlıklar etrafında mikro hizmetler oluşturmak istiyorsunuz. İşte bu noktada SOA onun başarısız oldu katmanlı hizmet mimarisi . Daha iyi yaklaşım, bazı iş işlevlerini temsil eden hizmetler oluşturmaktır, böylece hem verileri hem de davranışı kapsamaktadırlar. Daha pratik bakış açısından, iş süreçleri veya kullanım örnekleri etrafında hizmet yaratmakla ilgilidir. Örneğin, kullanıcı kaydı için bir hizmetiniz olabilir. Bir kullanıcının kaydedilmesi için gereken verileri ve davranışı içerir. Böylece kavramı userdoğal olarak oluşur ve sadece A hizmetine aittir. Bu da beni bir sonraki noktaya getirir: hizmetler hakkında düşünmenin diğer yolu sınırlı bağlamdır . Hizmetleri ve sınırlı bağlamları hizalamak iyi bir uygulamadır.

Kullanıcı kaydedildiğinde, UserCreatedetkinlik yayınlanabilir. Sanırım ikinci servisiniz bununla ilgileniyor. Böylece, onu aldıktan sonra tamamen farklı bir varlık yaratılabilir, örneğin Ownervarlık (her ne olursa olsun). Ben ve trackervarlık arasında birçok ilginç işbirliği olduğundan eminim - onları tek bir hizmette tutun.

3. seçenek konusunda son derece dikkatli olun. Verileri kopyalarsanız, işlevsellik izler. Sıkı kavrama ile sonuçlanır. Ve CQRS terimini kapsamaz , bu olaylar aracılığıyla hizmetler arasında veri senkronizasyonu ile ilgili değildir.


"Dağıtılmış monolit" terimini seviyorum, ancak verdiğiniz bağlantıda tanımlanma şekli, buradaki soru ile doğrudan ilişkili görünmüyor. Bunu kullandığınızı düşündüğüm yol, hizmetler arasındaki bağlantıyla ilgilidir ve makale ikili bağımlılıklara odaklanır. Bence kullanma şekliniz daha üstün ama bunu bu şekilde açıkça tanımlayan bir referans bulmakta zorlanıyorum.
JimmyJames

Her zaman yaygın olarak yaygın olmayan "dağıtılmış monolit" kategorisine konuşkan hizmetler ekledim.
Vadim Samokhin

6

Zapadlo'nun cevabı içinde birçok iyi bilgi ve muhakeme var. Buraya, sorunlarınızla çalışmanızı kolaylaştıracak küçük bir pratik tavsiye ve bu yanıttaki önerileri ekleyeceğim.

Tasarım sorunuzu çerçevelemeniz, veritabanı yapıları ve yapılarınız için yeni bir gereksinimin nasıl buna uygun olacağı üzerinedir. Bu, hizmet tasarımını veri modelinizden oluşturduğunuzu gösterir. Örneğin, göremediğim, kullanıcılar ve izleyiciler arasındaki ilişkiye nasıl erişileceği veya kullanılacağıdır.

Hizmet tasarımında, arayüzün yapısı tasarımla ilgili en önemli şeydir. Aslında, uygulama özellikle mikroservisler söz konusu olduğunda neredeyse anlamsızdır. Bunun nedeni, hizmetinizi bir kez yerleştirdiğinizde, hizmetinize ilişkin tüm bağımlılıkların yalnızca arabirimde bulunması gerekir. Doğru yaparsanız, herhangi bir tüketici olmadan uygulamayı tamamen yeniden yazabilmeniz gerekir. Bu özerkliğin temel yararıdır. Kimse nasıl inşa ettiğin umrunda değil. İhtiyaç duyduğunuz şekilde çalışabilmeleri için buna ihtiyaçları var.

Herkes bunun veritabanında nasıl göründüğünü veya nerede istediğinizi belirleyebilmeden önce, bu bilgilerin nasıl kullanılacağını açıklamanız gerekir. Bu, bir hizmet aracılığıyla ortaya çıkarılacak bir şey mi yoksa analitik için karıştırmak istediğiniz bir tür veri mi?

Bir yan notta, neredeyse tüm maliyetlerle iki yönlü bağımlılıklardan kaçınırım. Bağımlılıklarınız varsa, gerçekten sadece bir tarafın diğerini bilmesini istersiniz. Bağımlılıklar her iki yönde olduğunda, hizmetler esasen bir atom birimi haline gelir.


0

Birçoğu alan adının kendisine geliyor. Sıfır izleyiciye sahip bir kullanıcı anlamsızsa, kullanıcı hizmetinin izleyiciler hakkında bilgi sahibi olması gerekir. Bir izleyicinin bir kullanıcısı olması gerekiyorsa, izleyicilerin kullanıcılar hakkında bilgi sahibi olması gerekir. Birden fazla sahibi olan bir izleyiciye sahip olmak veya bir izleyiciyi bir kullanıcıdan diğerine aktarabilmek gibi bir şey mantıklıysa, bu bilgi başka bir hizmete ait olabilir.


0

Soru: Verileriniz Datatables boyunca neden ayrılıyor?

Seçenek 3 ile gitmek eğilimindedir: hizmetler tamamen ayrı ve cevaplamaları gerekebilir ilgili soruları cevaplayabilir. Dahası, çok daha dayanıklıdırlar. Ancak dikkatli olun, hizmetleriniz etkinlikleri kaçırırsa senkronizasyonu kaldırabilir, ancak bu durum sonuç tutarlılığıyla çözülebilir.

Ayrıca, her iki hizmeti de birleştirmeyi düşünebilirsiniz - her ikisi de birbirini bilmeden cevap veremezse, muhtemelen tek bir etki alanının parçası oldukları için onları birleştiririm.


Bu, her hizmetin tam özerkliğe ihtiyaç duyduğu mikro hizmet dininin bir parçasıdır. Thomas Erl bunu "Hizmet Tasarımının Prensipleri" nde hizmet yönlendirme ilkelerinden biri olarak tanımlar c. 2008.
JimmyJames

@JimmyJames Kendim bir ms-mimarisi yazan biri olarak: Bir ms'nin ne kadar büyük olması gerektiği konusunda birçok tartışma var. Bu durumda, hizmet (ler) doğru şekilde ayrılamayabileceğinden boyut bile önemli olmayabilir - örneğin tabloları kesmeyin, iş alanları boyunca kesmeyin.
Christian Sauer

Sağ. Sorun şu anda mikro hizmetlerin etrafında büyük bir kargo tarikatı var. Bir çok insanın mikro hizmetler uyguladığını görüyorum çünkü havalı çocuklar bunu yapıyor ve ödünleşmeyi düşünmüyor ya da anlamıyor. Örneğin, birçok insanın MS özerkliğinin teknoloji ve 'bulut' ile ilgili olduğunu düşündüğünü hissediyorum. Bunu daha çok örgütsel bir soruna çözüm olarak görüyorum. Ağ G / Ç için alım satım işaretçisi silme işlemi oldukça pahalıdır. Bunu düşüncesizce uygulayamaz ve işlerin iyi geçmesini bekleyemezsiniz.
JimmyJames

@JimmyJames Bence bu teknolojiyle de ilgili olabilir - özellikle certian teknolojileri bazı alanlar için çok uygunken, diğerleri için uygun olmadığında. MS'lerimiz için C # ve Python kullanıyoruz. Bunlardan bazıları örgütsel sorunlardan kaynaklanmaktadır ("20 yıldır c # programladım, yeni çıkmış tiplenmemiş dil öğrenmem gerekmiyor!"). - ama aynı zamanda sistemimizin doğası gereği. Veri bilimi bölümleri en iyi python'da yapılırken, bazı altyapı ve web görevleri en iyi C # 'da yapılır.
Christian Sauer

Elbette, bu oldukça geçerli bir neden. Gördüğüm sorun, her şeyi aynı platformda aynı kodla yazılmış ve hizmetler arasında bir ton bağımlılık olsa bile, insanların her hizmeti ayrı bir düğüme ayırmak isteyecekleri. Bu durumda mikro hizmetlerin gerçekten fazla bir yararı yoktur ve bir dizi yeni sorun eklediniz.
JimmyJames
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.