Hibernate Multitenant

0

Witam
naszym celem jest zrobienie aplikacji typu SaaS gdzie w jednej aplikacji znajdują się konta użytkowników nie powiązanych ze sobą..różne firmy. Aplikacja składa się z wielu schematów. Jak teraz rozdzielić te firmy. Naturalnym rozwiązaniem są różne bazy danych i odpowiedni ConnectionProvider który w zależności od id zalogowanej firmy kieruje ruch do odpowiedniej bazy...jednak problemem jest tu pula połączeń bo mając 1000 firm (po 8 userów) i dając dla każdej firmy po 2 połączenia to wychodzi 2000 połączeń gdzie jedno na podstawie naszych obserwacji waży około 50mb czyli 100 GB ramu...gdzie normalnie taki ruch został by obsłużony przez 30 połączeń

Czy macie jakieś doświadczenia, jak sobie z tym radzicie?

0

Ale to jak to w końcu, liczba firm = liczba userów? I dla każdego użytkownika będzie inny schemat bazy danych? Trochę dziwnie, ja bym proponował tabelę z tenantami i na podstawie ich id robić odpowiednią logikę biznesową.

0

Różne schematy baz danych czy różne bazy danych to raczej podział wymagany przy "grubych" klientach - tzn gdy jeden klient jest bardzo zasobożerny albo ma specyficzne wymagania.
Jeśli tak jest to dzielisz bazę na n komputerów albo robisz ją w NoSQL (na n komputerach - na jedno wychodzi).

100 GB RAM na serwer to już nie jest dużo na dzień dzisiejszy, ale raczej mało sensowne jest robienie tego na jednej maszynie.
http://www.ebay.co.uk/itm/HP-C7000-G2-16x-HP-BL460c-G6-128-Cores-1024GB-1TB-RAM-Blade-Server-Solution-/272344674863?hash=item3f6901f22f:g:cjAAAOSwxcRW8sUq

Obsługa tego co chcesz jak pewnie wiesz jest w Hibernate 4 wbudowana:
https://docs.jboss.org/hibernate/orm/4.3/devguide/en-US/html/ch16.html
(zawiera opis jak jednym połączeniem obsłużyć n schematów)

To widziałeś?
http://www.ibm.com/developerworks/library/os-hibernatesaas/
http://www.devx.com/Java/Article/47817

0

Problemem jest, że system jest już napisany. Liczba firm to 1000 w każdej około 8 userów. Tabela tenantów odpada bo jak powiedizałem system jest już napisany więc dodanie wszędzie kolumny i whereów do zapytań jest nieosiągalne

Rozwiązanie hibernate jest naraize tylko wspierano jak schema lub db. Ze schema jest problem bo nasza aplikacja korzysta z 10 schematów nie jest tylko w jednym a rozwiązanie hibernate zakłada ze aplikacja korzysta tylko z jednego schematu i wtedy przy multitenant przełancza się między nimi....co w sytuacji jak mam 10 schematów?

Przy db jak opisałem pula połączeń jest problemem...

0

A może tak:

  • osobne bazy danych dla klientów – fizyczna separacja danych.
  • każda podpięta pod bazę "zbiorczą" za pomocą symlinków, albo podobnego mechanizmu/userzy nie mają bezpośredniego dostępu do tabel, ale jeszcze dodatkową warstwę aliasów – ujednolicony punkt dostępu do danych.
  • i teraz magia, bo baza ma założone ograniczenia na rekordach, tzn. user może pobrać tylko rekordy, które utworzył – bezpieczeństwo przesunięte na bazę + separacja logiczna.

Dodatkowo całość rozbita na kilka maszyn na bazie tego co przy logowaniu. Tak by user trafiał na konkretną maszynę JEE jak się loguje (regułka loadbalancera).

1 użytkowników online, w tym zalogowanych: 0, gości: 1