Mikro hizmetler ve veritabanı birleştirme


112

Monolitik uygulamaları mikro hizmetlere ayıran insanlar için, veritabanını parçalama bağlantılarını nasıl ele alıyorsunuz? Üzerinde çalıştığım tipik uygulamalar, performans ve basitlik nedenleriyle çok sayıda veritabanı entegrasyonu yapıyor.

Mantıksal olarak farklı iki tablonuz varsa (sınırlandırılmış bağlamlar), ancak genellikle bu verilerin büyük hacimleri üzerinde toplu işlem yapıyorsanız, monolitte büyük olasılıkla nesne oryantasyonundan kaçınır ve bunun yerine veritabanınızın standardını kullanırsınız. Birleştirilmiş görünümü uygulama katmanınıza geri döndürmeden önce veritabanındaki verileri işlemek için BİRLEŞTİR özelliği.

Bu tür verileri mikro hizmetlere bölmeyi nasıl haklı çıkarırsınız, muhtemelen verileri veritabanından ziyade bir API aracılığıyla 'birleştirmeniz' istenecektir.

Sam Newman'ın Mikro Hizmetler kitabını okudum ve Monolith'i bölme ile ilgili bölümde, bir API üzerinden birleştirme yapmanın daha yavaş olacağını kabul ettiği "Yabancı Anahtar İlişkilerini Kırma" örneğini veriyor - ancak şöyle devam ediyor: Başvurunuz zaten yeterince hızlı, öncekinden daha yavaş olması önemli mi?

Bu biraz nazik görünüyor mu? İnsanların deneyimleri nelerdir? API birleştirmelerinin kabul edilebilir performans göstermesi için hangi teknikleri kullandınız?


2
Güzel soru, ben de aynı sorunu yaşıyorum ve sonunda somut bir görüşe sahip oldum ve bu konuda birleşmeler yaptım. Hoşuma gitmiyor, ancak sanırım bu Micro Services için zor olacak. Bunu yapmanın doğru bir yolu yok, sadece yapılacak bir tasarım seçimi. Pek çok insanın somut bir görüşe sahip olabileceğimizi söylediğini biliyorum, ancak toplu yanıtlar bir sorun haline geliyor. Daha iyi bir şey bulursan bana haber ver.
PavanSandeep

Bunun eski olduğunu biliyorum, ama bu, graphql'nin çözdüğü bir şey mi? Ayrıca bölümlere ayrılmış bir geçiş için bunu araştırıyorum ve görünüşe göre bunu sorunsuz hale getirmenin yolu graphql.
themightybun

Bir noktada dogmatik olmanın gidilecek yol olmadığını anlamalısın. GraphQL, veri kaynağı dışında toplama yapmanın iyi bir örneğidir ve genellikle gayet iyi çalışır.
Christian Ivicevic

Yanıtlar:


26
  • Performans veya gecikme çok fazla önemli olmadığında (evet, bunlara her zaman ihtiyacımız yok), ihtiyacınız olan ek verileri sorgulamak için yalnızca basit RESTful API'leri kullanmak tamamen iyidir. Farklı mikro hizmetlere birden çok çağrı yapmanız ve bir sonuç döndürmeniz gerekiyorsa API Ağ Geçidi modelini kullanabilirsiniz .

  • Polyglot kalıcılık ortamlarında fazlalık olması tamamen iyidir . Örneğin, mikro hizmetleriniz için mesaj sırasını kullanabilir ve bir şeyi her değiştirdiğinizde "güncelleme" olayları gönderebilirsiniz. Diğer mikro hizmetler, gerekli olayları dinler ve verileri yerel olarak kaydeder. Bu nedenle, sorgulamak yerine, gerekli tüm verileri belirli mikro hizmetler için uygun bir depoda tutarsınız.

  • Ayrıca, önbelleğe almayı da unutmayın :) Diğer veritabanlarını çok sık sorgulamaktan kaçınmak için Redis veya Memcached gibi araçları kullanabilirsiniz .


25
Tüm iyi öneriler, ancak yine de mantıklı bulmayı zor buluyorum, Belki de bunun nedeni veritabanında çok fazla işlem yapmaya çok alışkın olmamızdır. Mevcut uygulamamız, büyük hacimli verileri işleyen ve ardından küçük bir sonuç kümesi döndüren karmaşık saklı yordamlara sahiptir. Bir mikro hizmet mimarisinde, bu varlıkların farklı sınırlı bağlamlara bölünmesi gerektiğini düşünüyorum. Mevcut yaklaşımın çirkin olduğunu biliyoruz, ancak tüm verileri işlemek için uygulama katmanına geri getirmeyi haklı çıkarmak zor. Belki daha fazla denormalizasyon veya önceden hesaplanmış toplu görünümler yardımcı olabilir.
Martin Bayly

1
Evet, görüyorum. Mikro hizmetler yaklaşımı herkese uygun değildir ve dikkatli bir şekilde uygulamalısınız. Muhtemelen daha küçük değişikliklerle başlayabilirsiniz.
sap1ens

Muhtemelen programcılar StackExchange bu soruyu sormak için daha iyi bir yer olabilirdi: programmers.stackexchange.com/questions/279409/… ve mikro hizmetler programmers.stackexchange.com/questions/tagged/microservices
Martin Bayly

9

Hizmetlerin, diğer hizmetlerden belirli referans verilerinin salt okunur kopyalarına sahip olması sorun değildir.

Monolitik bir veritabanını mikro hizmetlere yeniden düzenlemeye çalışırken (yeniden yazmak yerine)

  • hizmet için bir db şeması oluşturun
  • Bu şemadaki verileri diğer hizmetlere sunmak için bu şemada sürümü belirlenmiş * görünümler ** oluşturun
  • bu salt okunur görüşlere karşı birleşir

Bu, diğer uygulamaları bozmadan tablo verilerini / yapısını bağımsız olarak değiştirmenize izin verecektir.

Görünümleri kullanmak yerine, verileri bir şemadan diğerine kopyalamak için tetikler kullanmayı da düşünebilirim.

Bu, doğru yönde artan bir ilerleme, bileşenlerinizin dikişlerini belirleme ve daha sonra REST'e geçiş yapılabilir.

* Görünümler genişletilebilir. Son bir değişiklik gerekiyorsa, aynı görünümün bir v2'sini oluşturun ve artık gerekmediğinde eski sürümü kaldırın. ** veya Tablo Değerli İşlevler veya Dişliler.


5

CQRS --- Komut Sorgusu Birleştirme Modeli, Chris Richardson'a göre bu sorunun cevabıdır. Her mikro hizmetin kendi veri Modelini güncellemesine ve önceki mikro hizmetlerden gerekli birleştirme verilerine sahip olan materyalleştirilmiş görünümü güncelleyecek olayları oluşturmasına izin verin.Bu MV, herhangi bir NoSql DB veya Redis veya sorgu için optimize edilmiş elasticsearch olabilir. Bu teknikler, kesinlikle kötü olmayan ve gerçek zamanlı uygulama tarafı birleşimlerini engelleyen Nihai tutarlılığa yol açar. Umarım bu cevaplar.


2

Çözümleri kullanım alanına göre, operasyonel ve raporlama diyelim.

Diğer mikro hizmetlerden veri gerektiren tek formlar için veri sağlamak üzere çalışan mikro hizmetler için (bu operasyonel durumdur) API birleştirmelerini kullanmanın yolu olduğunu düşünüyorum. Büyük miktarda veriye gitmeyeceksiniz, hizmette veri entegrasyonu yapabilirsiniz.

Diğer durum, toplama vb. Yapmak için büyük miktarda veri üzerinde büyük sorgular yapmanız gerektiğinde (raporlama durumu). Bu ihtiyaç için, orijinal şemanıza benzer şekilde paylaşılan bir veritabanını sürdürmeyi ve mikro hizmet veritabanlarınızdaki olaylarla güncellemeyi düşünürdüm. Bu paylaşılan veritabanında, çabalarınızı azaltacak ve veritabanı optimizasyonlarını destekleyecek şekilde depolanan prosedürlerinizi kullanmaya devam edebilirsiniz.


1

Mikro Hizmetlerde fark yaratırsınız. modelleri okuyun, örneğin: iki farkınız varsa. sınırlı bağlam ve birisi her iki veride de arama yapmak isterse, birisinin olayları hem sınırlı bağlamdan dinlemesi hem de uygulamaya özel bir görünüm oluşturması gerekir.

Bu durumda daha fazla alana ihtiyaç duyulacaktır, ancak hiçbir birleştirme veya birleştirme gerekmeyecektir.

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.