Mikroserwisy a architektura multitenant

Mikroserwisy a architektura multitenant
C1
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:8
1

Witam,
staram się zrozumieć działanie mikroserwisów i chciałbym testowo napisać jakąś małą aplikację z ich wykorzystaniem, ale także, żeby aplikacja miała wielu "dierżawców" (np. dane dla dzierżawcy byłyby udostępniane po subdomenie). Zrobiłem sobie małą strukturę w dockerze i wykorzystałem Keycloack do autoryzacji i uwierzytelnania. Połączyłem to z ApiGateway (Kong), co sprawdza czy użytkownik jest zalogowany i przesyła JWT dalej do mikroserwisu. W serwisie (na razie tworzyłem w Symfony jakieś api ze zleceniami - ale to chyba mało ważne w czym). I teraz nasuwa mi się takie pytanie jak to działa w mikroserwisach, żeby rozdzielić dane w każdych serwisach na tego "realm'a" z Keycloacka? Bo w Keycloacku tworzyłbym oddzielny Realm dla każdego dzierżawcy. Teraz w serwisie z tokena moge sobie wyodrębnić nazwę dzierżawcy. Ale czy w tym sewisie muszę mieć także tabelę users zreplikowaną z użytkownikami z keycloaka ? I jeśli będę miał 5/10/15 serwisów, które w jakiś sposób są powiązane z realmem lub tylko userem, muszę tworzyć w bazie dla serwisu tabelkę realm/user z jakimś identyfikatorem?

I od razu może drugie pytanko, bardziej powiązane z samym z systemami IAM (tu Keycloakiem) a nie ze multiteant. Chodzi mi o to że chciałbym aby każdy użytkownik był przypisany do np. "salonu sprzedaży". W Keycloak mogę chyba utworzyć niestandardowy atrybut -> id_salonu ale pytanie gdzie mam trzymać tą jedną tabelę "salon sprzedaży"? W podejściu w którym nie używałbym gotowego rozwiązania do autoryzacji, zrobiłbym tabelę użytkownicy(id, imie, nazwisko, salon_id) oraz tabelę powiązaną salony(id, nazwa). A jak do tego podejść używając IAM, czy to Keycloak czy innego rozwiązania?
Mam nadzieję, że napisałem zrozumiale.

artur52
  • Rejestracja:ponad 10 lat
  • Ostatnio:9 miesięcy
  • Lokalizacja:Warszawa
  • Postów:223
4

Obejrzyj sobie to:

Powinno dostarczyć Ci trochę odpowiedzi

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:23 minuty
  • Postów:5108
1

Muszę przyznać że wsparcie dla multi-tenancy brzmi jak fajne ćwiczenie z modelowania systemów, taki np. multi-tenant monolith i jego różne warianty (one db, many dbs, etc)

edytowany 4x, ostatnio: WeiXiao
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Wrocław
2

Ale to w dzisiejszych, tak bardzo pochmurnych czasach, jest sens bawić się w inne multitenancy niż całkowita kopia infrastruktury, usług i aplikacji?

edytowany 1x, ostatnio: somekind
C1
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:8
0

@somekind: Kopia wszystkiego na każdego klienta? Nie jestem znawcą, dopiero szukam i sprawdzam sobie różne rozwiązania jak to działa w apliakcjach Saas. Ale wymyślając przypadek 1000 firm chce korzystać z aplikacji i będzie miało 5/10 pracowników. Robię wtedy 1000x np. klaster K8s ? Do tego bazy na każdy serwis. Czy nie łatwiej zarządzać w takim podejściu multi-tenancy?

markone_dev
  • Rejestracja:około 3 lata
  • Ostatnio:około 7 godzin
  • Postów:812
3
ciastko1742 napisał(a):

@somekind: Kopia wszystkiego na każdego klienta? Nie jestem znawcą, dopiero szukam i sprawdzam sobie różne rozwiązania jak to działa w apliakcjach Saas. Ale wymyślając przypadek 1000 firm chce korzystać z aplikacji i będzie miało 5/10 pracowników. Robię wtedy 1000x np. klaster K8s ? Do tego bazy na każdy serwis. Czy nie łatwiej zarządzać w takim podejściu multi-tenancy?

Oczywiście że łatwiej jeśli się współdzieli infrastrukturę. Dlatego część firm oferujących produkty w modelu SaaS ma możliwość uruchomienia dedykowanej instancji platformy dla dużych klientów o dużych wymaganiach, którzy są w stanie za to zapłacić dużo pieniędzy. Cała reszta musi się zadowolić byciem na instancji współdzielonej. I nie ma w tym nic złego. Wszystko zależy od modelu biznesowego firmy dostarczającej rozwiązanie.


Programujący korpo architekt chmurowy.
Udzielam konsultacji i szkoleń w obszarze szeroko pojętego cloud computingu (Azure, AWS) i architektury systemów IT. Dla firm i prywatnie.
DevOps to proces nie stanowisko.
edytowany 1x, ostatnio: markone_dev
piotrpo
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 dni
  • Postów:3277
1

Za bardzo skupiasz się na tym "jak", za mało "po co". Sporo zależy od wymagań, przewidywanej liczby tenantów, rodzaju przechowywanych danych.
Możesz zrobić wersję bieda i np. mieć dedykowane instancje usług (tam gdzie trzeba), przekierowując sobie na API Gateway żądania do odpowiedniej instancji.
Inna opcja, to każdy mikroserwis sprawdza id tenanta (np. z tego JWT) i jakoś rozdziela rekordy - albo na poziomie rekordu, schematu, bazy danych.
Może się zdarzyć, że w wymaganiach masz okreslone, że dane nie moga być przechowywane razem z cudzymi danymi, albo przetwarzane razem z obcymi danymi, albo wręcz masz wymaganie, że konkretny tenant chce mieć wszystko oddzielnie, bo bezpieczeństwo i takie tam. Z tego co pamiętam, filmik parę postów wyżej omawia to całkiem nieźle.

Ogólnie główny powód robienia usług multitenant to optymalizowanie kosztów chmury i utrzymania. @somekind - odpowiedź na twoje pytanie. Znacznie lepiej się to skaluje, ale trudniej (kosztowniej) rozwija, no i traci się na bezpieczeństwie, bo potencjalnie każdy włam, to dostęp do wszystkich danych i istnieje ryzyko jakiegoś głupiego błędu, gdzie tenant zobaczy dane innego tenanta.

somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:3 minuty
  • Lokalizacja:Wrocław
1
ciastko1742 napisał(a):

@somekind: Kopia wszystkiego na każdego klienta? Nie jestem znawcą, dopiero szukam i sprawdzam sobie różne rozwiązania jak to działa w apliakcjach Saas. Ale wymyślając przypadek 1000 firm chce korzystać z aplikacji i będzie miało 5/10 pracowników. Robię wtedy 1000x np. klaster K8s ? Do tego bazy na każdy serwis. Czy nie łatwiej zarządzać w takim podejściu multi-tenancy?

Tak, a to jakiś problem ten 1000 klastrów?
Jest bezpieczniej, każdy klient może się skalować niezależnie, jak dla mnie same zalety.

markone_dev napisał(a):

Oczywiście że łatwiej jeśli się współdzieli infrastrukturę.

Co nazywasz infrastrukturą?

piotrpo napisał(a):

Ogólnie główny powód robienia usług multitenant to optymalizowanie kosztów chmury i utrzymania. @somekind - odpowiedź na twoje pytanie. Znacznie lepiej się to skaluje, ale trudniej (kosztowniej) rozwija, no i traci się na bezpieczeństwie, bo potencjalnie każdy włam, to dostęp do wszystkich danych i istnieje ryzyko jakiegoś głupiego błędu, gdzie tenant zobaczy dane innego tenanta.

Każdy tenant ma swoją domenę, sieć, swoje instancje usługi i swoje bazy. Wydaje mi się, że w takim podejściu jest raczej trudniej o podglądanie sobie nawzajem danych niż gdy baza jest jedna.

C1
  • Rejestracja:prawie 3 lata
  • Ostatnio:prawie 2 lata
  • Postów:8
1
somekind napisał(a):

Tak, a to jakiś problem ten 1000 klastrów?

Myślę, że koszt. Spojrzałem na cenę AWS EKS. Cena jednego klastra działającego nieprzerwanie przez miesiąc to 73 USD. Zakładam, że jest 100 firm które generują mały ruch i jedną która generuje taki sam ja te 100. Także tej jednej można postawić oddzielną infrastrukturę. Ale reszcie, za ich wiedzą i przyzwoleniem oraz przez to że zapłacą mniej, robię wersję współdzieloną (tak jak opisał @markone_dev). I właśnie w takim przypadku chciałbym sprawdzić to podejście. Rozumiem, że optymalizacja kosztów obniża bezpieczeństwo i odwrotnie. Ale myślę, że trzeba dobrać rozwiązanie po środku. Czyli jeśli można współdzielić to tam dodaje tego tenanta, przy czym tworząc usługę kładę nacisk na testy bezpieczeństwa.

W wracając do kwestii technicznych:
@piotrpo

Inna opcja, to każdy mikroserwis sprawdza id tenanta (np. z tego JWT) i jakoś rozdziela rekordy - albo na poziomie rekordu, schematu, bazy danych.

Tak chciałbym spróbować to zrobić. I co to tego było bardziej moje pytanie. Czy prawidłowym podejściem jest to że każda mikrousługa powinna w swojej bazie danych mieć swoją tabelę tenant i user. Po przesłanym JWT sprawdzam nazwa tenanta i użytkownika, jeśli go nie ma ich w bazie usługi to je dodaje i po tych danych filtruje wszystkie inne operacje z bazy? I tak w każdej usłudze.

No i mam jeszcze ten jeden problem.

I od razu może drugie pytanko, bardziej powiązane z samym z systemami IAM (tu Keycloakiem) a nie ze multiteant. Chodzi mi o to że chciałbym aby każdy użytkownik był przypisany do np. "salonu sprzedaży". W Keycloak mogę chyba utworzyć niestandardowy atrybut -> id_salonu ale pytanie gdzie mam trzymać tą jedną tabelę "salon sprzedaży"? W podejściu w którym nie używałbym gotowego rozwiązania do autoryzacji, zrobiłbym tabelę użytkownicy(id, imie, nazwisko, salon_id) oraz tabelę powiązaną salony(id, nazwa). A jak do tego podejść używając IAM, czy to Keycloak czy innego rozwiązania?

M0
  • Rejestracja:ponad 11 lat
  • Ostatnio:minuta
  • Postów:363
2

Utrzymuję jeden projekt na multitenancie. Każdy tenant ma swoją oddzielną schemę w bazie danych. Fronty wysyłają odpowiedni nagłówek w zapytaniu z nazwą tenanta i na tej podstawie jest wybierana baza danych. Fronty biorą nazwę tenanta z url strony, Więc trzeba skonfigurować odpowiednia subdomenę lub jeżeli klient chce, fronty mogą również działać pod jego własnym adresem. Dzięki temu mamy jeden serwer na AWS z frontami i jeden serwer z backendem (faktycznie jest ich więcej, ze względu na skalowalność i niezawodność).

KA
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 2 lata
  • Postów:594
2

Tak, a to jakiś problem ten 1000 klastrów?

PTSD wśród SRE lub DevOpsów, zwał jak zwał.

Koszt samej chmury i ludzi co beda to utrzymywać ze względu na operational complexity
Datacenters też mają określone capacity i jak rośniesz to możesz sie nie zmieścić

Jak dochodzi skalowanie cross region to juz w ogole zaczyna sie complicated gdzie czesc uslug nie umie w cross region i musi byc osobna instancja

Ja zawsze staram sie traktować EKS itp. jako Runtime i nic tam nie trzymać, data, storages, logs zawsze mozna wyizolowac

edytowany 4x, ostatnio: karsa
KA
  • Rejestracja:prawie 11 lat
  • Ostatnio:około 2 lata
  • Postów:594
1

Przede wszystkim zastanowiłbym sie od definicji tenanta i aktorów
Tenant - co to? user z internetu, firma, kraj, region, whatever

Mikroserwisy imo najlepiej sprawdzaja sie w przypadku tego pierwszego robisz super-saas.com public service i sklalujesz globalnie
Jak ktos jest Software House i musi miec wszystko osobno, to najlepiej jakby to stało u tego klienta.

Jak robisz takiego Confluent Kafka https://www.confluent.io/confluent-cloud/pricing/
To dajesz wybor, swoja infra, dedytkowane konto z osobnym billingiem

Ewentualnie mozna pomyslec o deployu do infry klienta i dac wjazd ludziom od takiej Produktu typu Kafka

edytowany 1x, ostatnio: karsa
markone_dev
  • Rejestracja:około 3 lata
  • Ostatnio:około 7 godzin
  • Postów:812
0
somekind napisał(a):
markone_dev napisał(a):

Oczywiście że łatwiej jeśli się współdzieli infrastrukturę.

Co nazywasz infrastrukturą?

To przy pomocy czego i na czym jest uruchomiona aplikacja, czyli serwery aplikacji, bazy danych, kolejki, sieć, load balancery, itd. Przykładowo można aplikację uruchomić na k8s a można na tradycyjnych vm-kach, w modelu serverless lub kombinacji tego wszystkiego.


Programujący korpo architekt chmurowy.
Udzielam konsultacji i szkoleń w obszarze szeroko pojętego cloud computingu (Azure, AWS) i architektury systemów IT. Dla firm i prywatnie.
DevOps to proces nie stanowisko.
edytowany 1x, ostatnio: markone_dev
somekind
No dobrze, a ja piszę o sytuacji, w której stawiasz klona całości. To co tam jest współdzielone?
markone_dev
Wiem o czym pisałeś. Ja nawiązałem do tego, że nie zawsze jest to opłacalne (klonowanie całości) z powodów o których już inni napisali i bardzo duża część rozwiązań multi-tenant współdzieli warstwę aplikacji oraz infrastruktury bo tak jest łatwiej i taniej.
somekind
Ok, teraz rozumiem.
SK
  • Rejestracja:około 12 lat
  • Ostatnio:3 dni
  • Postów:133
1

Tutaj +/- jest opisane jak do MTA podchodzi Salesforce:
https://developer.salesforce.com/wiki/multi_tenant_architecture

Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)