Hizmetlerin SOA'da bir veritabanı paylaşması kötü bir uygulama mıdır?


17

Son zamanlarda Hohpe ve Woolf'un Kurumsal Entegrasyon Kalıpları, Thomas Erl'un SOA hakkındaki bazı kitaplarını okudum ve Udi Dahan ve ark. CQRS ve Olay Odaklı sistemlerde.

İş yerimdeki sistemler yüksek kuplajdan muzdarip. Her sistemin teorik olarak kendi veri tabanı olmasına rağmen, aralarında çok fazla birleşme vardır. Uygulamada bu, tüm sistemlerin kullandığı büyük bir veritabanı olduğu anlamına gelir. Örneğin, müşteri verilerinin bir tablosu vardır.

Okuduğum şeylerin çoğu, her bir sistemin sadece veritabanını kullanması ve bir sistemde yapılan güncellemelerin mesajlaşma kullanılarak diğerlerine yayılması için verileri normalleştirmeyi öneriyor gibi görünüyor.

Bunun SOA'daki sınırları zorlamanın yollarından biri olduğunu düşündüm - her hizmetin kendi veritabanına sahip olması gerekir, ancak sonra bunu okudum:

/programming/4019902/soa-joining-data-across-multiple-services

ve bunun yanlış bir şey olduğunu gösteriyor.

Veritabanlarını ayırmak, sistemleri ayırmanın iyi bir yolu gibi görünüyor, ama şimdi biraz kafam karıştı. Bu, izlenmesi gereken iyi bir rota mı? SOA hizmeti, DDD Sınırlı bağlam, uygulama vb. Üzerinde bir veritabanı ayırmanız hiç önerildi mi?


Bağladığınız orijinal soru yanlış. Soruların çoğu yanlıştır, çünkü cevapların çoğu kaçmaktadır. SOA, tek bir uygulamayı ayrı hizmetlere bölmek ve verilerini bölümlere ayırmakla ilgili değildir.
Jeremy

Sorunun yanlış olduğunu anlıyorum, düşüncemi yeniden değerlendirmemi sağlayan cevaplar oldu.
Paul T Davies

Hizmetlerin birleştirilmesi gerektiğini düşünüyorum
B Seven 14

Yanıtlar:


12

Dekuplaj sadece gerçekten ayrılma olduğunda işe yarar. Bir sipariş sisteminiz olup olmadığını düşünün:

  • Tablo: MÜŞTERİ
  • Tablo: SİPARİŞ

Elinizde olan tek şey buysa, bunları ayırmak için bir neden yoktur. Öte yandan, eğer varsa:

  • Tablo: MÜŞTERİ
  • Tablo: SİPARİŞ
  • Tablo: CUSTOMER_NEWSLETTER

O zaman ORDER ve CUSTOMER_NEWSLETTER'ın tamamen ayrı iki modülün (sipariş ve pazarlama) bir parçası olduğunu iddia edebilirsiniz. Belki de bunları ayrı veritabanlarına taşımak (her tablo için bir tane) ve her iki modülün de kendi veritabanındaki ortak MÜŞTERİ tablosuna erişimi paylaşması mantıklıdır.

Bunu yaparak her modülü basitleştiriyorsunuz, ancak veri katmanınızın karmaşıklığını artırıyorsunuz. Uygulamanız büyüdükçe ayrılmanın avantajını görebiliyorum. Birbirleriyle gerçekten ilişkisi olmayan daha fazla "veri adası" olacak. Ancak, her zaman tüm modülleri kesen bazı veriler olacaktır.

Bunları farklı fiziksel veritabanlarına koyma kararı, genellikle yedekleme sıklığı, güvenlik kısıtlamaları, farklı coğrafi konumlara çoğaltma vb. Gibi gerçek dünyadaki kısıtlamalara dayanacaktır. Bu, farklı şemalar veya görünümlerle daha basit bir şekilde ele alınabilir.


5
-1. Bunları yalnızca oraya koymak için bir neden varsa ayrı veritabanlarında olmalıdır. Kesinlikle uygulamanızı daha karmaşık hale getirdiğinden, "bir şey çıkarmanız" gerekir.
scottschulthess

1
Veri katmanındaki iki işlevsellik alanını ayırmanın önemine (ayrı şemalar ya da başka bir şey kullansanız da) vurgu yapmaya değer olduğunu düşünüyorum. Her modül diğer modülün verilerine yalnızca diğer modülün API'sı üzerinden erişmelidir - bu OO kapsülleme ilkelerine benzer. Birden çok modül arasında bir şema paylaşmıyorum. Ayrıca, görüntülemelere karşı tavsiye ederim, bunun yerine verileri göstermeyi tercih ederim. bir API.
Chris Snow

@scottschulthess evet, karmaşıklık maliyetini tartmanız gerekiyor ve buna değmezse, hizmetlere ayrılamazsınız. Bölündüm ama paylaşılan bir veritabanı kullanarak buldum 3 seçenek en kötü.
Adamantish

8

Çalıştığım yerde ESB var6 farklı uygulamanın bağlı olduğu (veya "uç noktalar" demeliyim). Bu 6 uygulama, 2 veritabanı örneğinde 3 farklı Oracle şeması ile çalışır. Bu uygulamalardan bazıları, ilişkili oldukları için değil, veritabanı altyapımızın harici bir sağlayıcı tarafından yönetildiği ve yeni bir şema elde etmesinin sonsuza dek sürdüğü için aynı şemada bir arada var (ayrıca, elbette DBA erişimine de sahip değiliz) ... gerçekten o kadar uzun sürüyor ki, bir noktada mevcut bir şemayı geliştirmeye devam edebilmek için "geçici olarak" yeniden kullanmayı düşündük. Verilerin "ayrılmasını" zorunlu kılmak için, tablo adları ön eklidir; örneğin, müşteri için "CST_". Ayrıca, bazı geçerli nedenlerden ötürü değişimi mutlak yapamayacağımız bir şema ile çalışmak zorundayız ... Biliyorum tuhaf. Tabii ki, her zaman olduğu gibi, "geçici"

Farklı uygulamalarımız ilgili veritabanı şemalarına bağlanır ve kendi PL / SQL paketleriyle çalışır ve uygulama alanımızın dışındaki tablolar / verilerle doğrudan etkileşime girmemizi kesinlikle yasaklarız.

ESB'ye bağlı uygulamalardan birinin etki alanı dışındaki bilgilere ihtiyacı olduğunda, bu bilgiler aslında aynı şemada olsa bile teorik olarak sadece küçük bir birleşim bildirimi gerektiren ESB'deki ilgili hizmeti çağırır . SQL isteklerinden biri .

Bunu, uygulama alanımızı farklı şemalara / veritabanlarına ayırabilmek için ve ESB'deki hizmetlerin gerçekleştiğinde hala düzgün çalışması için (yakında Noel, parmakları düzeltiyoruz)

Şimdi, bu dışarıdan garip ve korkunç görünebilir, ancak bunun nedenleri var ve sadece bir veya daha fazla veritabanının o kadar önemli olmadığını göstermek için bu somut deneyimi paylaşmak istedim. Bekle, öyle! , birçok nedenden ötürü (Scott Whitlock için +1, yedekleme ile ilgili son paragrafa bakın ve mya sizi belaya sokacak) Ama SOA hizmetlerinizin düzgün bir şekilde tasarlanmasını düşünüyorum, en azından benim görüşüm ve ben Ben bir DBA değilim. Sonuçta, tüm veritabanlarınız "kurumsal veri ambarı" nıza aittir, değil mi?

Son olarak, Scott Whitlock'un son paragrafını, özellikle de

Sadece endişeleri ayırdığım için tabloları farklı fiziksel veri tabanlarına ayırmam.

gerçekten çok önemli. Sebep yoksa yapmayın.


8

Veri entegrasyonu nedeniyle yazılım mimarisindeki en kötü kabusları gördüm ve şimdiye kadar karşılaştığım karmaşaya karşı en iyi silah DDD-Style Bounded Contexts id. Belirli bir anlamda, "SOA doğru yapıldı" dan çok uzak değil.

Ancak, verilerin kendisi soruna saldırmanın en iyi yolu değildir. Beklenen / ihtiyaç duyulan davranışa odaklanılmalı ve veriler önemli olduğu yere getirilmelidir. Sonuç olarak bu şekilde bir tekrar elde edebiliriz, ancak bu normalde neredeyse her zaman veriye entegre mimarilerle ilişkili sistem evriminin bloklarıyla karşılaştırıldığında bir sorun değildir.

Basitleştirmek gerekirse: gevşek bağlı sistemler arıyorsanız, veriler üzerinde bağlı kalmayın. "Lingua franca" olarak görev yapan, ağzı kapalı sistemleri ve iyi yapılandırılmış bir iletişim kanalını tercih edin .


1
Ve ... doğrudan başlık sorusuna cevap: "Evet, bir SOA'da bir veritabanını paylaşmanın riskli bir uygulama olduğunu düşünürdüm", Yapılması en makul şey gibi görünüyorsa, muhtemelen bazı ciddi tasarım hataları var.
ZioBrando

7

Veritabanlarının ayrıştırılması ve verilerin aralarında tutarlı tutulması uzman düzeyinde bir görevdir. Mevcut sistemin kaçınmak için tasarlandığı yanlışlaşmak ve kopyaların vb. Açıkçası, bir çalışma sistemi almak ve bunu yapmak, kullanıcılara gerçek bir değer için yeni hatalar getirmenin garantisidir.


1

Doğru bir şekilde yapılırsa, iş kaygılarını farklı veritabanlarına (veya en azından farklı şemalara) ayırmak bir erdemdir .

Lütfen Martin Fowler'in CQRS Kalıbı açıklamasına bakın :

İhtiyaçlarımız daha karmaşık hale geldikçe [CRUD veri deposu gibi bir bilgi sistemine muamele etme] 'den sürekli uzaklaşıyoruz ... CQRS'nin getirdiği değişiklik, bu kavramsal modeli güncelleme ve görüntüleme için ayrı modellere ayırmaktır ... buraya. Bellek içi modeller aynı veritabanını paylaşabilir, bu durumda veritabanı iki model arasındaki iletişim görevi görür. Ancak , ayrı veritabanlarını da kullanabilirler ve sorgu tarafının veritabanını gerçek zamanlı bir ReportingDatabase tarafından etkin bir şekilde oluştururlar. Bu durumda, iki model veya veritabanları arasında bir iletişim mekanizması olması gerekir.

Ve NServiceBus Mimari İlkeleri :

Komut Sorgu Ayırma

Bu sorunu önleyen bir çözüm, komutları ve sorguları sistem düzeyinde, hatta istemci ve sunucunun üzerinde ayırır. Bu çözümde hem istemci hem de sunucuya yayılan iki "hizmet" vardır - biri komutlardan sorumlu (oluşturma, güncelleme, silme), diğeri sorgulardan sorumlu (okuma). Bu hizmetler sadece mesajlarla iletişim kurar - biri diğerinin veritabanına erişemez ...

Ve Komuta ve Sorgu Sorumluluk Ayırma (CQRS)

Komut ve Sorgu Sorumluluğu Ayrımı

Çoğu uygulama, verileri veri yazdıklarından daha sık okur. Bu ifadeye dayanarak, kolayca okumak için daha fazla veritabanı ekleyebileceğiniz bir çözüm yapmak iyi bir fikir olurdu, değil mi? Peki ya sadece okumaya adanmış bir veritabanı kurarsak? Daha iyi; veritabanını daha hızlı okunacak şekilde tasarlarsak ne olur? Uygulamalarınızı CQRS mimarisinde açıklanan kalıplara göre tasarlarsanız, veri okumada ölçeklenebilir ve hızlı bir çözümünüz olacaktı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.