Hizmetler bir mikro hizmet mimarisinde birbirleriyle doğrudan konuşmalı mıdır?


10

Bir web uygulaması oluşturan bir dizi web hizmetim var. İstemciler bu hizmetlere REST API'lerinin çağrıları aracılığıyla erişebilir.

Bu hizmetler birbirleriyle doğrudan konuşabilmeli mi? Eğer öyleyse bu onları mikro hizmetler kavramına aykırı hale getirmez mi?

Müşteri, istemciye bir web sayfasını yüklemek için ihtiyaç duyduğu verileri almak için bunları birbiri ardına doğrudan aramalı mıdır?

Yoksa hizmetlerimin üstünde, istemciden gelen bir isteği işleyen, bu istekle ilgili verileri alan ve daha sonra istemciye geri gönderen başka bir katmanım olmalı mı?


Eğer işler tamamen birbirinden ayrılırsa tamamen ayrı ürünlerdir. Bu yüzden kullanıcının Contoso Login'e giriş yapması gerekir, ardından Contoso Login "Şimdi giriş yaptınız!" Der ve Contoso Sensitive Data Storage'a gidip "Evet, giriş yaptım "... sonra verileri kopyalayıp Contoso Veri İşlemcisine yapıştırın ...
user253751

Yanıtlar:


16

Hizmetlerinizin bu resimdeki gibi görünmesini istiyorsanız, evet: resim açıklamasını buraya girin Yapamayacağınız gibi değil, ancak çoğu zaman kötü sonuçları olacaktır. REST aracılığıyla iletişim, hizmetlerinizi önemli ölçüde bozmaz. Bazı servis arabirimi değiştiğinde, tüm bağımlı servislerin değiştirilmesi ve yeniden konuşlandırılması büyük olasılıktır. Ayrıca hizmeti yeniden dağıtırken, yüksek kullanılabilirlik standartları için iyi bir tasarım olarak kabul edilmeyen tüm bağımlı hizmetleri kaldırmanız gerekecektir.

Sonunda, alternatif monolit uygulaması olurdu daha yavaş, ancak hemen hemen aynı sorunları sahip mikro hizmet uygulaması olacak!

@Robert Harvey ile aynı fikirde değilim

Bununla birlikte, pratikte, mikro hizmetlerinizin biri veya daha fazlası (belki de hepsi) bir SQL veritabanı gibi bazı merkezi veri deposuyla konuşacaktır.

Entegrasyon veritabanı iyi bilinen bir antipatterndir

Çok daha iyi bir çözüm, hizmetleriniz arasında iletişimi senkronize olmayan hale getirmek için yayınlama-abone olma kalıbını kullanmaktır:

resim açıklamasını buraya girin

Lütfen bu iletişim yöntemini uygulamak için CQRS / ES yöntemine bir göz atın, Greg Young ve diğer çocuklar konuyla ilgili tonlarca güzel video sunuyor . Sadece "CQRS / ES" anahtar kelimesi için google. Bu yaklaşımda, her hizmet aynı anda yayıncı ve abone olacak ve hizmetlerin daha az birleşmesine izin verecektir.

İşte konuyla ilgili tartışmalara ışık tutan mikro hizmetlerle ilgili iyi bir dizi makale . Güzel resimlerle çok detaylı bir açıklama.


2
Öncelikle Fowler dışında hiçbir yerde "entegrasyon veritabanı" terimini duymadım. Sadece bir adam söylediği için müjde gibi bir şey alma. İkincisi, "entegrasyon veritabanı" olarak tanımladığım şeyi aramak için yeterli bilgiye sahip değilsiniz. Üçüncüsü, Fowler aslında bu tür veritabanlarını, bağlandığınız makalede doğru koşullar altında yararlı olarak adlandırır. Bir etkinlik veri yolu fikrini seviyorum, ancak verimliliği artıramadığınız sürece mikro hizmetin normal API'sini çağırmaktan ne kadar farklı olduğunu görmüyorum.
Robert Harvey

Teşekkürler Robert, Otoriteden tartışmamak için fikri daha iyi göstermek için Fowler'in makalesini bağladım. Bu yaklaşımı tanımladığınız yol, entegrasyon veritabanı olana çok benziyor. Farklıysa - bu hiç de açık değil. Doğru koşullarla ilgili olarak - mikro hizmetlerin veritabanına entegre edilmesinin, bizi monolitik bir mimariye geri ittiği için iyi bir fikir olmadığını düşünüyorum.
IlliakaillI

1
Elbette: her mikro hizmet, kendi ayrı veritabanlarıyla veya aynı veritabanındaki diğer hizmetlerin tablolarıyla ilgili olmayan tablolarla konuşacaktır. Bu şekilde servisler veri tabanından asla bilgi alışverişinde bulunmazlar, yani yatay olarak kolayca ölçeklendirebilirsiniz ve çok daha az darboğaz olacaktır. Ve aynı tabloları paylaşmadıkları için - uygulamanın bir bölümündeki değişikliklerin diğer bölümleri etkilemesi daha az olasıdır.
IlliakaillI

1
Bunu kesin olarak kategorik olarak ifade edemezsiniz. Aynı veritabanında aynı bilgilere ihtiyaç duyan iki hizmet olabilir, sadece ara sıra ihtiyaç duyarlar, bu şekilde erişmek için ölçekleme sorunu yoktur, iki hizmet zaten başka amaçlarla veritabanına erişiyor, bu yüzden bir servis veriyolu ayakta veya API uç noktası sadece bunu başarmak saçma olurdu.
Robert Harvey

1
Ancak iş değerini elde etmek için verileri birleştirmek istersiniz - "gelen yağmurun aşağıdaki radar verileri göz önüne alındığında yetersiz depolama kapasitesine sahip tüm kanalizasyon sistemlerini göster ve sonucu kullanarak belediyelerin bu haritasını renklendir". Tüm verilerinizi hizmetlere böldüğünüzde, yalnızca verileri daha sonra birleştirebileceğiniz anlamına gelir. Hizmetlerin birbirleriyle konuşmasını yasaklarsanız, tüm verileri bir istemciye taşımaya ve oradaki verilere katılmaya zorlarsınız. Verileri bir yerde birleştirmek istersiniz, çünkü sonunda bir uygulama değeri verir.
RemcoGerlich

8

Udi Dahan'ın SOA hakkında söylediklerini okuyarak birçok iyi fikir edineceksiniz .

Hizmet, belirli bir iş kapasitesi için teknik otoritedir. Herhangi bir veri veya kural parçası yalnızca bir hizmete ait olmalıdır.

Bunun anlamı, hizmetler birbirlerinin etkinliklerini yayınlıyor ve abone olsa bile, her veri ve kural için yetkili hakikatin ne olduğunu her zaman biliyoruz.

Ayrıca, iş yetenekleri merceğinden hizmetlere baktığımızda, gördüğümüz şey, birçok kullanıcı arayüzünün farklı yeteneklere ait bilgileri sunmasıdır - bir ürünün stokta olup olmadığının yanı sıra fiyatı. Yukarıdaki hizmet tanımına uymamız için, bu, bu tür kullanıcı arayüzlerinin aslında bir karışım olduğunu anlamamıza yol açmaktadır - her hizmet, kendi verileriyle ilgilenen UI parçasına sahiptir.

Özellikle UI kompozisyonu ile ilgili olarak Mauro Servienti'nin UI Kompozisyonu hakkındaki makalesi iyi bir başlangıç ​​noktasıdır. Ayrıca burada bulunan Udi'nin videosuna bakın .

Bu hizmetler birbirleriyle doğrudan konuşabilmeli mi? Eğer öyleyse bu onları mikro hizmetler kavramına aykırı hale getirmez mi?

İki hizmet birbiriyle mesaj alışverişi yapıyorsa, bazı bağlantılar elde edersiniz. Birincil cevap, diğer hizmetin API'sı ile eşleşmeleridir - iç hizmet değiştiğinde bile hizmetin sabit kalmayı vaat ettiği sözleşme.

Bunun ötesinde, servis keşfi gibi teknikler belirli bir servis sağlayıcıya bağımlılığı azaltabilir ve mesaj brokerleri üreticileri ve tüketicileri birbirinden ayırabilir (yine de birbirlerinin mesajlarını ve mesaj aracının API'sı ile nasıl etkileşimde bulunmaları gerektiğini bilmeleri gerekir) sihir yoktur ).


7

"Doğrudan" ile ne demek istediğinize bağlıdır.

Mikro hizmet mimarisine göre, kendi sunucunuzda, hatta harici sunucularda, REST gibi bir arabirim aracılığıyla diğer mikro hizmetlerin çağrılmasını sağlayan mikro hizmetlere sahip olmak mükemmeldir.

İyi olmayan şey, bir mikro hizmetin doğrudan yöntem çağrılarını kullanarak başka bir hizmet çağrısında bulunmasıdır; bu da her iki mikro servisi aynı monolitin bir parçası haline getirir.


bu iyi değildir ve kötü sonuçları olacaktır. Daha fazla ayrıntı için cevabıma bakın.
IlliakaillI

@IlliakaillI "mikro hizmet mimarisine göre" iyi olduğunu söylüyorum. Mikro hizmet mimarisinin sonuçlardan arınmış olduğunu ya da bu konuda yapılabilecek hiçbir iyileştirme olmadığını önermiyorum. Buradaki soru "kitap tarafından X mi, değil mi?" ve doğru cevap, X'in doğru tanımı göz önüne alındığında, kitabın kendisidir.
Mike Nakis

Size gerçek "mikro hizmet mimarisini" nasıl oluşturacağınızı anlatan bir "referans kitap" var mı? Günümüzde mikro hizmetler bir moda haline geliyor ve birçok insan REST'in üzerine monolitlerin nasıl inşa edileceği hakkında kitaplar yazdı. Cevabımdaki ilk şemaya bak, sistemi bu şekilde kurmak mantıklı değil. Tuhaf bir nedenden dolayı yaparsanız - kesinlikle yanlış yapıyorsunuz. Onun yerine yekpare ile gitsen iyi olur. Tasarım seçimlerinizi bazı kitaplara körü körüne başvurarak (otoriteden bir tartışma yaparak) desteklerseniz, yazılım tasarımına yaklaşmanın doğru yolu bu değildir.
IlliakaillI

5

Bu hizmetler birbirleriyle doğrudan konuşabilmeli mi? Eğer öyleyse bu onları mikro hizmetler kavramına aykırı hale getirmez mi?

Eşleşme kötü bir kelime değildir. Her uygulamanın zaten belirli bir dereceye kadar bağlantısı vardır; mikro hizmetlerinizle konuşan uygulamalar mikro hizmetlere zaten bağlıdır , aksi takdirde çalışmazlar.

Mikro hizmetlerle gerçekten peşinde olduğunuz şey gevşek bağlantıdır ; bunu bir mikro hizmetin diğerini genel API'sı üzerinden sorgulaması veya bir olay veri yolu kullanarak gerçekleştirmesi ile elde edebilirsiniz.

Uygulamada, ancak mikro hizmetlerinizin biri veya daha fazlası (belki de hepsi) SQL veritabanı gibi bazı merkezi veri deposuyla konuşacaktır. Hedefinize nasıl ulaşmak istediğinize bağlı olarak, bir mikro hizmetin veritabanı verilerini bir şekilde değiştirmesi, diğer mikro hizmetin değişikliği almak için sorgulayacağı basitçe olabilir.


3
"Entegrasyon veritabanı" iyi bilinen bir antipattern, daha fazla bilgi için cevabım bakın.
IlliakaillI

2

Görünüşe göre SOA'lar ve genel olarak mimarlık hakkında konuşurken insanlar anlambilim ve jargona yakalanıyorlar. Bir hizmeti "mikro" yapan nedir? Sonuçta, kullandığınız "puanlama sistemi" ne olursa olsun, hizmeti açıkça "mikro olmayan" yapmayan bazı özellikler dizisidir. Yargıtay adaletinin ahlaksızlık hakkında söylediği şey neydi? "Gördüğümde bileceğim."

Eminim bazı insanlar bunun cevapsız olduğunu söyleyecektir, ama sonra noktayı kaçırıyorlar. Mikro hizmet mimarileri, aralarında "sıkı bağlantı" sorunu olmak üzere çeşitli sorunlardan kaçınmayı amaçlamaktadır. Yani, birbirinizin çok fazla ince ayrıntısına bağlı bir mikro hizmet karmaşası oluşturursanız, bir pub / alt mesaj veri yolu veya doğrudan çağrılar kullansanız da yok olan sıkı bir bağlantı oluşturdunuz. parçalardan yeni çözümler oluşturma, tüm sistemi düşürmeden parçaları ayrı ayrı yeniden yapılandırma vb.


1

Müşteri, istemciye bir web sayfasını yüklemek için ihtiyaç duyduğu verileri almak için bunları birbiri ardına doğrudan aramalı mıdır?

Değişir; ancak, müşteriye doğrudan kullanılabilir yetenekler sağlamanızı ve sonuçların nasıl toplandığının ayrıntılarını gizlemeyi (kapsülleyerek) öneririm (örneğin, birden fazla mikro servis aracılığıyla).

Müşteri tarafından bireysel mikro hizmet sonuçlarının birleştirilmesinde çok fazla mantık varsa, bu yanlışlıkla bazı iş mantığının istemciye sızmasına neden olabilir. Ayrıca, iç mimarinizin daha fazlasını istemciye gösterebilir ve mikro hizmetlerin daha sonra yeniden düzenlenmesini engelleyebilir.

Yani, bu mikro hizmetlerle, bazen müşteriye yararlı soyutlamalara sahip bir uç nokta sağlayan ve diğer (belki de şimdi daha fazla dahili) mikro hizmetlerin daha yüksek düzeyde koordinasyonunu sağlayan bir sargı mikro hizmetine sahip olmak yararlı olabilir.


(Ayrıca, müşteriye gidiş-dönüş gezileri, mikro hizmetlerinizden birbirlerine göre daha pahalıdır.)


Örneğin, GraphQL tarafından alınan yöne bakarsanız, bir uç noktaya doğrudan ilgili sorgular yayınlayan istemcileri bulabilirsiniz; bu, bir mikro hizmet koleksiyonu olarak uygulanabilir veya uygulanmayabilir. Mikro hizmetlerin mimarisi GraphQL'in arkasına gizlendiğinden, mimariyi yeniden düzenlemeyi ve aynı zamanda istemci için daha kolay hale getirir. Örneğin, bkz . Https://stackoverflow.com/a/38079681/471129 .


1

Mikro hizmetlerin temel amacı, uygulamanızı gevşek bir şekilde birleştirmektir. Bu nedenle, hizmetler birbirini arayamaz. Aksi takdirde, bağlı olarak bağlanır. Ancak, veri paylaşması gereken iki hizmetimiz varsa ne yapacağız? Cevap Message Broker. Böylece, istemciden veri alan hizmet, verileri merkezi ileti aracısına paylaşabilir, daha sonra hizmetlerin bu verileri kullanması, dönüştürmesi ve kendi veri deposuna koyması gerekir. Kafka'yı öneriyorum çünkü Kafka Stream ile farklı konulara ait verileri anında birleştirebilirsiniz. PS. mikro hizmetlerinizi özelliğe göre ayırmak daha iyidir.

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.