İş mantığı mikro hizmet mimarisinde nerede oturmalıdır?


12

Monolitik bir yaklaşıma alıştığım için hala kafamı mikro hizmet mimarisinin etrafına sarmaya çalışıyorum

Diyelim ki son derece basitleştirilmiş bir Uber rezervasyon sistemi oluşturmaya çalışıyoruz . : Şeyler basitleştirmek için biz en biz 3 hizmetler ve müşteri için bir ağ geçidi API var diyelim Booking, Drivers, Notificationve aşağıdaki iş akışını vardır:

Yeni rezervasyon oluştururken:

  1. Mevcut kullanıcının zaten bir rezervasyonu olup olmadığını kontrol edin
  2. Mevcut sürücülerin listesini alın
  3. Rezervasyonu almak için sürücülere bildirim gönderin
  4. Sürücü rezervasyonu alıyor

Diyelim ki tüm mesajlar, işleri basitleştirmek için kafka gibi bir mesajlaşma otobüsü yerine bir http çağrısı ile yapılıyor.

Bu durumda, Bookinghizmetin mevcut rezervasyon için kontrol yapabileceğini düşündüm . Ancak, mevcut sürücülerin ve bildirimlerin listesini kim almalıdır? Bunu ağ geçidi düzeyinde yapmayı düşünüyorum ama şimdi mantık bir şekilde iki yere ayrılıyor:

  • Gateway - mevcut sürücülerin listesini alın + bildirim gönderin
  • Booking - mevcut rezervasyonu kontrol et

Ve eminim ağ geçidi bunu yapmak için doğru yer değil ama biz Bookinghizmet yapıyoruz gibi hissediyorum , sıkıca bağlı hale geliyor?

Daha karmaşık hale getirmek için, rezervasyon sistemini yeniden kullanmak isteyen ancak kendi iş mantığıyla başka bir projemiz varsa ne olur? Bu yüzden ağ geçidi düzeyinde yapmayı düşündüm, böylece yeni proje ağ geçidinin kendi iş mantığı mevcut olandan ayrı olabilir.

Bunu yapmanın başka bir yolu, her projeye çekirdek rezervasyon hizmeti ile konuşacak kendi rezervasyon hizmeti var ama burada en iyi yaklaşımın ne olduğundan emin değilim :-)


2
Bütün bağlam olmadan cevaplamak gerçekten zor. Ve bunu bile bilmek, iş mantığını mikro servislere yayan bir projeye başlamak her zaman iyi bir fikir değildir ve bu yüzden bazı insanlar "Monolit İlk" i benimser, çünkü başlangıçta her bir bölümün sorumluluklarını gerçekten bilmiyorsunuzdur. başvurunuz. Bu ancak daha sonra netleşir.
Dherik

Yanıtlar:


14

İnsanlar genellikle "mikro-servis" duyar ve "nano-servis" düşünür ve bu biraz karışıklığa neden olabilir. Bunlar mikro hizmetlerdir, bu nedenle her bir varlık için ayrı bir hizmete ihtiyacınız yoktur. Yapmaya çalıştığınız her şey bookingve notificationhizmetlerinde olmalıdır. driverServise ihtiyacınız yok (tarif ettiğiniz herhangi bir etkinlik için).

Mevcut sürücülerin bir listesini alma kitabın altına düştüğünde bookinghizmet. Yaygın bir sorun, ilgili faaliyetleri aynı hizmette gruplamamaktır, buna düşük tutarlılık denir ve çok kötüdür. Unutmayın, şeyleri varlığa göre değil, sorun etki alanına göre gruplandırırsınız.

Şimdi, yeniden kullanımda olduğu gibi, ayrı bir mikro hizmete sahip olmanın avantajı, artık tüketiciye dönük uygulamalar yapan üç ayrı ekibiniz olabilir. Standart html web uygulaması, bir android uygulaması ve bir ios uygulaması için bir ekip. Tüm bu farklı uygulamalar tamamen farklı şekilde inşa edilebilir ve kendi platformları için uygun görünebilir (kodu tekrar etmeden). bookingHer üç uygulamalar yerine kendi rezervasyon kodunu sahip hizmetine çağrı yapmak http çünkü servis kodu, bu uygulamaların tümünü üçe yeniden kullanılır.

Tipik bir rezervasyon akışı şuna benzer:

  1. Android uygulaması booking, mevcut sürücülerin bir listesini almak için hizmeti çağırır
  2. Rezervasyon hizmeti, uygulamaya bir sürücü listesi döndürür
  3. Kullanıcı daha sonra sürücüsünü seçer ve uygulama bookinghizmetin "kitap" yöntemini çağırır
  4. bookingServis hizmeti çağıran notificationrezervasyon detayları ile hizmet
  5. notificationServis rezervasyon onu bilgilendiren, sürücüye bir bildirim gönderir
  6. Sürücü uygulaması notification, müşterinin bir mil yakınında olduklarında hizmete bir mesaj gönderir
  7. notificationOnların sürücü neredeyse olduğu hizmet müşteriye uyarı gönderir

Umarım bu yardımcı olmuştur; Unutmayın, nano-hizmetler değil, mikro-hizmetlerdir, aynı problem alanını bölmeye çalışmayın. Bu nedenle, sorunuzun başlığını yanıtlamak için, bir mikro hizmeti uygun boyutta tuttuğunuzda, bu sorun alanı için iş mantığının tamamı veya çoğu, bu mikro hizmet içinde yaşayabilir.


1

Her şey tam gereksiniminize bağlıdır.

Diyelim ki rezervasyonu yapan iki uygulamanız var:

  1. İlk durum: Bir uygulama bir kullanıcının birden çok kez rezervasyon yapmasına izin verirken diğeri yalnızca bunlara izin verebilir. Bu, rezervasyon kısıtlamanızın uygulama düzeyinde olduğu anlamına gelir, çünkü ya rezervasyon sisteminizde iki giriş noktası vardır (çoklu rezervasyona izin veren, olmayan bir giriş) ya da sadece ilgili mikro servislerde uygulama.
  2. İkinci durum: bir uygulama ne olursa olsun bir kullanıcının birden fazla sahip olamayacağı bir "Rezervasyon" tanımının bir parçasıdır, bu kural tüm sistem için geçerlidir: bu, rezervasyon mikro servisine çek koyabileceğiniz anlamına gelir.

Bildirim sistemine gelince, herhangi bir yeni rezervasyonu dinlemek için rezervasyon hizmetinize düşen mikro hizmetlere sahip olabilirsiniz. Bu nedenle rezervasyon mikro hizmeti tüm aboneleri bilgilendirecek ve buna göre hareket edecektir.

Bu tür mimarideki tek sorun, bildirim yayınlandıktan sonra bir şey başarısız olursa ne olacağıdır, çünkü iki mikro hizmet aynı veritabanı işleminde çalışan iki işlev gibi çalışmaz, hataları zarif bir şekilde ele almanız ve sonunda süreçleri yeniden oynatmanız gerekir başarısız olan (otomatik veya manuel)


0

Bunun basit cevabı, mikro hizmet istemcilerinin iş mantığını 'saf' mikro hizmet mimarisinde yöneten şeydir. Anlamayı kolaylaştırmak için daha basit bir örnek düşünün. Bir URI'ye dayalı olarak sadece bayt akışları döndüren bir hizmet. Kendi başına, çok yararlı değil. Hangi URI'lerin içinde ne olduğunu bilmenin bir yolu olmadan, sadece bir şeyleri nereye çekeceğini tahmin edebilirsiniz. Şimdi, arama yeteneği sağlayan farklı bir mikro hizmetiniz olduğunu varsayalım. Bir sorgu dizesiyle istek gönderirsiniz ve istek URI'leri döndürür. Şimdi işler daha ilginç hale geliyor. İlk hizmet için URI'lere bir dizine referanslar koyabilirim.

Ama yine de, bu ikisi arasında bir şekilde koordinasyon yapmamız gerekiyor. Basit bir yanıt var: dizin hizmetinden URI'leri almak için bir tarayıcı kullanın ve ardından veri hizmetinden veri alın. Her iki hizmet de diğerini 'bilmez' ve aralarında kesinlikle hiçbir bağlantı yoktur. Dizin hizmetini başka herhangi bir veri hizmetiyle kullanabilirim.

Bunun tüm senaryolarda en iyi yaklaşım olması zorunlu değildir, ancak şu anda bilinmeyen senaryolarda yeniden kullanılabilirlik gibi şeyleri bu şekilde oluşturmanın birçok faydası vardır.

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.