Bir mikro hizmet mimarisinde paylaşılan kavramları nasıl ele alırsınız?


39

Geliştirdiğim bir uygulama için mimari kalıpları araştırıyorum ve bir mikro hizmet yaklaşımı iyi bir seçim olacak gibi görünüyor, ancak hizmetler arasındaki etkileşimi nasıl kullanacağımdan emin değilim.

Uygulama öncelikle kullanıcılarla, kullanıcıların sahip olduğu profillerle, fotoğraflarla ve bir fotoğraftaki birden çok profili temsil eden etiketlerle ilgilenir. Bir kullanıcı tarafından yüklenen fotoğrafları döndürmek, belirli bir etiketlenmiş profil içeren fotoğrafları döndürmek vb. Makul yöntemler olabilirdi.

Bu, mikro hizmet tabanlı bir mimari tasarlamadaki ilk adımım ve monolitik esque alan modelinden esinlenilmiş bir tarihten geliyorum . Bu dünyada, kontrolörler bu etki alanı nesnelerini birbirine dikiyorlardı, ancak kafamı bunun mikro-çekişli bir şekilde nasıl çalışacağı etrafına sarmakta güçlük çekiyorum.

Yanıtlar:


34

Genellikle, servisler kendi verilerine erişmeleri gerektiğinde diğer servisleri de arar. Her veri parçası, bu verilere erişmek ve bunları değiştirmek için tek giriş noktası olacak belirli bir hizmete ait olmalıdır. Bazı servisler basit olacaktır ve genellikle etki alanı modelinize (örn. Kullanıcıların kullanımı için bir servis) yakından bakacak, diğerleri ise yüksek seviyede olacak ve diğer servislerden gelen verileri kullanacaktır (örneğin, onları yükleyen kullanıcılar hakkındaki bilgilerle birlikte bir fotoğraf listesini görüntüleme) ).

Kullanım durumunuzda, dışarıdan başlamalı ve bir API üzerinden kullanıcınıza hangi işlemleri yapmak istediğinizi (bir arka uç servisi ise) veya bir web uygulaması ise GUI'de hangi işlemleri yapabileceğinizi düşünmelisiniz. GUI bölümünün genellikle kendi denetleyicileri olan normal bir uygulama olduğunu unutmayın: işlemler REST aracılığıyla çağrılabilir (AngularJS'deki gibi), ancak bu bitiş noktaları yalnızca GUI uygulamasının kullanımı için tasarlanır ve sağduyulu mikro hizmetler değildir.

Fotoğrafları yükleyicilerle ilgili bilgilerle birlikte görüntülemek istediğinizi varsayalım. Kullanıcı kimliği verilen bir kullanıcı hakkında bilgi döndüren bir kullanıcı servisine ve fotoğrafları listeleyebilen bir fotoğraf servisine sahip olabilirsiniz (örneğin, bazı kriterlere göre arama yaparak). Fotoğrafların listesi, her fotoğraf için, yükleyen kullanıcının kimliğini içerir. Bu şekilde, bu iki hizmet birleştirilmez - fotoğraf hizmeti yalnızca kullanıcı kimliklerini bilir, ancak kullanıcı verileri hakkında hiçbir şey bilmez. Bu iki hizmetin üzerine, diğer iki hizmeti çağıracak ve döndürdükleri verileri birleştirecek olan "yükleyicilerle ilgili bilgileri içeren fotoğrafları listeleme" gibi bir işlemle üçüncü bir hizmet oluşturabilirsiniz. Alternatif olarak, bu işlem web uygulamanız tarafından bir servis yerine yapılabilir.


1
Bu bana çok yardımcı oldu. Yığın kullanan ve her şey çoğunlukla yerine düşen birkaç UI kullanım vakası yazarak başladım.
anjunatl

1
Bu özel örnekte, örneğin yapmamız gerekiyordu. Listemizde 10 fotoğraf varsa, kullanıcı verilerini almak için kullanıcı servisine 10 çağrı var mı? Çok fazla ek yük olmaz mıydı?
Ricardo Souza

1
@ rcdmk Girdi olarak birden fazla ID'nin listesini alan ve çıktı olarak birden fazla fotoğraf döndüren bir REST bitiş noktası ekleyebilirsiniz. Bu genellikle performans nedenleriyle pratikte yapılır. Bazen, API tasarımı saflık ve pratik düşünceler arasında bir uzlaşmadır.
Michał Kosmulski

@ MichałKosmulski Tartışmaya başlamam gerekiyor, ancak StackExchange tasarım onları caydırıyor :) Bu özel örnekte mikro hizmet yaklaşımı hakkında hoşuma gitmeyen şey, altta yatan veritabanına (kullanıcıların ve görüntülerin depolandığı) yapılan doğrudan sorgulamanın çok daha etkili olabileceğidir. Bu yukarı havza hizmetlerinin diğer yukarı havza hizmetlerine vb. Bağlı olup olmadığını hayal edin. Veri deposuna doğrudan sorgu çok daha güvenlidir. sadece 5 sentim - daha fazlası değil. Yine konuyla ilgili verimli bir tartışma yapmak istiyorum, ancak StackExachange bunun için iyi bir yer değil (mikro hizmetler tartışma forumları tavsiye eder misiniz?)
ajukraine

@ajukraine Tartışma için iyi bir yer olabilecek yığın değişimi üzerine sohbetler olduğunu düşünüyorum. Performans gelince: 1. Mikro hizmetler bir performans maliyeti ile gelir ve 2. Mikro hizmetler bazı durumlar için iyidir ancak diğerleri için iyi değildir. Bağımlılıklara gelince: mikro hizmet mimarilerinde, sık sık yerel veri kopyaları yapar ve bağımlılık sayısını azaltmak için asenkron mesajlaşma kullanırsınız. Bir uygulamanın her modülünü ayrı bir uygulamaya otomatik olarak değiştirmekle kalmaz, gerçek bir mimari değişimdir.
Michał Kosmulski

4

Uygulama öncelikle kullanıcılarla, kullanıcıların sahip olduğu profillerle, fotoğraflarla ve bir fotoğraftaki birden çok profili temsil eden etiketlerle ilgilenir. Bir kullanıcı tarafından yüklenen fotoğrafları döndürmek, belirli bir etiketlenmiş profil içeren fotoğrafları döndürmek vb. Makul yöntemler olabilirdi.

Peki, profil hizmeti kullanıcı nesnesiyle çalışmamalıdır. Yalnızca veri döndürmesi istenen kullanıcının kimliğini öğrenebilir, daha fazlasını bilmeyebilir. Bu şekilde, kullanıcı servisi ile profil servisi arasında etkileşim kurmanız gerekmez.

Bu sorunuza cevap vermezse, lütfen uğraştığınız durumu açıklayarak açıklığa kavuşturur musunuz?


Bu ve Michal'ın cevabı anlamama yardımcı oldu, ancak önerisi ihtiyacım olan hizmetleri belirlememe yardımcı oldu. Sadece bir nesneye referans vermek yerine tam bir nesneyi temsil etmek zorunda olan bir zihniyete sıkışıp kaldım (user object vs user ID). Çok takdir, teşekkürler!
anjunatl,

@anjunatl Hoşgeldiniz;)
Vladislav Rastrusny
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.