it-swarm-eu.dev

Navrhování platformy: jedna databáze nebo více databází?

Vytváříme webovou platformu, která zahrnuje více služeb, z nichž každá má vlastní podkladová data. Tyto služby jsou vytvářeny nezávisle na principech Service-Oriented Architecture , ale obchodují s potenciálně souvisejícími daty. Zvažujeme, zda by tyto služby měly sdílet jednu velkou databázi nebo každá z nich má svou vlastní databázi. (Plánujeme používat SQL Server 2008 Enterprise v clusteru Windows 2008.)

Mezi výhody, které jsme již zvažovali, patří:

Jednotná databáze

  • Vztahy s daty z různých služeb mohou být spojeny omezením cizího klíče
  • Analytické výpisy se snadněji zapisují a provádějí rychleji
  • V případě katastrofy je snazší obnovit platformu do konzistentního stavu
  • U dat, na která odkazuje více služeb, budou data mezipaměti jedné služby pravděpodobně použita brzy po jiné službě
  • Administrace a sledování je jednodušší a levnější dopředu

Více databází

  • Údržbářské práce, problémy s hardwarem, narušení bezpečnosti atd. Nemusí mít nutně dopad na celou platformu
  • Za předpokladu, že každá databáze je na samostatném hardwaru, zvětšení více počítačů přinese více výhod výkonu než zvětšení jednoho velkého

Z provozního hlediska je výhodnější, aby každá služba v této platformě získala svou vlastní databázi, nebo aby všichni chodili do stejné databáze? Jaké klíčové faktory poskytují odpověď na tuto otázku?

31
Nick Chammas

Podle mého názoru je klíčovým rozlišovačem systémů true SOA (přes pseudo SOA, ntier/distribuované systémy, které se stávají všudypřítomné)) to, že by měla existovat nulová interakce mezi diskrétními službami. , každá aplikace, kterou z těchto služeb vytvoříte, může a měla by být vytvořena tak, aby tolerovala selhání jakékoli konsistentní součásti. Selhání snižuje funkčnost, ale služba je udržována.

V tomto scénáři je logické nebo nutné oddělit základní databázi pro každou službu. Pokud však máte služby, které jsou na sobě vzájemně závislé, z rozdělení se dá jen málo (možná nic).

Doporučil bych si přečíst stránky jako HighScalability.com , které se kopí do architektur přijatých webovými stránkami typu nikdy. Jeden z mých oblíbených pozdě byl příběh Netflix Chaos Monkey , který byl zmíněn o Coding Horror .

Řešení několika bodů ve vaší otázce:

V případě katastrofy je snazší obnovit platformu do konzistentního stavu.

To je pravda, ale možná byste měli přemýšlet o tom, jak lépe oddělit tyto služby, takže to přestane být problémem. Alternativně existují způsoby, jak zajistit synchronizaci napříč více databázemi, například transakční značky na serveru SQL .

U dat, na která odkazuje více služeb, budou data mezipaměti jedné služby pravděpodobně použita brzy po jiné službě.

Zde mohou pomoci distribuovaná řešení mezipaměti (memcached a kol.), Ale porušujete zásady nezávislosti služby. To by bylo srovnatelné s přímou vzájemnou komunikací dvou služeb nebo s horším datovým úložištěm přístupu ke službě, které by obcházelo servisní rozhraní úplně. Data nevyhnutelně budou souviset a budou mezi službami přenášena volající platformou, ošemetná rozhodnutí bývají kolem toho, která služba bude vlastnit které části dat. StackOverflow nebo weby programátorů mohou být lépe umístěny, aby pomohly s obecnějšími problémy SOA).

Předpokládejme, že každá databáze je na samostatném hardwaru, zvýšení měřítka přináší další výhody výkonu.

Určitě může být levnější měřítko na více strojích s nižším rozlišením, než zvětšit jeden stroj. Nižší náklady na hardware však mohou být pokryty celkovými náklady na vlastnictví, pokud se zohlední měkké náklady na další vývojové úsilí a provozní složitost.

Pokud to není SOA) a máte jen případ, kdy služby komponentů této platformy staví různé týmy/dodavatelé z logistických důvodů, držte se jedné databáze a úplně ignorujte vše výše ! :)

18