{"id":15841,"date":"2022-09-12T07:00:00","date_gmt":"2022-09-12T05:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=15841"},"modified":"2023-02-16T13:17:40","modified_gmt":"2023-02-16T12:17:40","slug":"aplikacje-multi-tenant-w-azure","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/aplikacje-multi-tenant-w-azure\/","title":{"rendered":"Aplikacje multi-tenant w Azure"},"content":{"rendered":"\n<p>Wed\u0142ug definicji aplikacja multi-tenant pozwala u\u017cytkownikom nale\u017c\u0105cym do wielu tenant\u00f3w korzysta\u0107 ze wsp\u00f3\u0142dzielonej instancji oprogramowania. Dzi\u0119ki temu mo\u017cemy oszcz\u0119dzi\u0107 sporo koszt\u00f3w, gdy\u017c stosuj\u0105c osobne aplikacje dla ka\u017cdego tenanta, koszty pomno\u017c\u0105 si\u0119 o liczb\u0119 tenant\u00f3w.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Infrastructure as code (IaC)<\/strong><\/h2>\n\n\n\n<p>Aby unikn\u0105\u0107 manualnych prac w zakresie devops, najlepszym podej\u015bciem jest IaC, realizowany w Azure za pomoc\u0105 ARM templates. Do niedawna standardem ARM templates by\u0142 format JSON, ale pojawi\u0142 si\u0119 nowy j\u0119zyk mocno promowany przez Mocrosoft, mianowicie <strong>Bicep<\/strong>.<\/p>\n\n\n\n<p>Bicep ma jedn\u0105 przewag\u0119 nad poprzednikiem, kt\u00f3ra jest nieoceniona przy rozwi\u0105zaniach multi-tenant. Jest to mo\u017cliwo\u015b\u0107 <strong>definiowania p\u0119tli w kodzie<\/strong>. Dzi\u0119ki temu mo\u017cemy stworzy\u0107 generyczny kod, kt\u00f3ry bazuj\u0105c na kolekcji nazw lub konfiguracji tenant\u00f3w, tworzy instancje serwisu w kontek\u015bcie ka\u017cdego tenanta.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-2.png\"><img decoding=\"async\" width=\"445\" height=\"383\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-2.png\" alt=\"fragment kodu\" class=\"wp-image-15842\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-2.png 445w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-1-2-300x258.png 300w\" sizes=\"(max-width: 445px) 100vw, 445px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-2-1.png\"><img decoding=\"async\" width=\"587\" height=\"402\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-2-1.png\" alt=\"Architektura jako kod\" class=\"wp-image-15844\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-2-1.png 587w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-2-1-300x205.png 300w\" sizes=\"(max-width: 587px) 100vw, 587px\" \/><\/a><figcaption>Ryc. 1 Architektura jako kod<\/figcaption><\/figure><\/div>\n\n\n\n<p>Z punktu widzenia wsp\u00f3\u0142czesnego podej\u015bcia do architektury oprogramowania, tendencje s\u0105 takie, aby raczej tworzy\u0107 wiele niezale\u017cnych instancji, gdy\u017c w\u00f3wczas minimalizujemy skutki awarii oprogramowania. Je\u015bli zawiedzie jedna instancja, to dalej przy dobrej architekturze pozosta\u0142e powinny dzia\u0142a\u0107.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-3-1.png\"><img decoding=\"async\" width=\"810\" height=\"509\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-3-1.png\" alt=\"Przyk\u0142adowe po\u0142\u0105czenia podej\u015bcia multi-tenant z modularyzacj\u0105\" class=\"wp-image-15846\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-3-1.png 810w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-3-1-300x189.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-3-1-768x483.png 768w\" sizes=\"(max-width: 810px) 100vw, 810px\" \/><\/a><figcaption>Ryc. 2 Przyk\u0142adowe po\u0142\u0105czenia podej\u015bcia multi-tenant z modularyzacj\u0105<\/figcaption><\/figure><\/div>\n\n\n\n<p>Postaram si\u0119 na przyk\u0142adzie rozwi\u0105za\u0144 opartych o serwisy Azure, pokaza\u0107 r\u00f3\u017cne sposoby po\u0142\u0105czenia podej\u015bcia multi-tenant z modularyzacj\u0105. Powy\u017cszy diagram przedstawia, jak mog\u0142oby wygl\u0105da\u0107 takie rozwi\u0105zanie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>DNS<\/strong><\/h2>\n\n\n\n<p>Je\u017celi mamy aplikacj\u0119 internetow\u0105 z zarejestrowan\u0105 domen\u0105 (domena.com), to mo\u017cemy stworzy\u0107 w us\u0142udze DNS subdomeny dla ka\u017cdego tenanta: tenant1.domena.com, tenant2.domena.com &#8230; Subdomeny rejestrujemy jako wpisy CNAME wskazuj\u0105ce na serwis Azure front door. W ten spos\u00f3b ka\u017cdy tenant wysy\u0142a \u017c\u0105danie do tego serwisu z informacj\u0105 kim jest \u2013 identyfikuje go subdomena.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-4.png\"><img decoding=\"async\" width=\"1008\" height=\"224\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-4.png\" alt=\"Tworzenie subdomen w us\u0142udze DNS\" class=\"wp-image-15848\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-4.png 1008w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-4-300x67.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-4-768x171.png 768w\" sizes=\"(max-width: 1008px) 100vw, 1008px\" \/><\/a><figcaption>Ryc. 3 Tworzenie subdomen w us\u0142udze DNS<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Front door<\/strong><\/h2>\n\n\n\n<p>Serwis Azure front door nie jest jedynym mo\u017cliwym rozwi\u0105zaniem, ale z kilku powod\u00f3w najlepszym. Jest serwisem globalnym, czyli definiuj\u0105c go w Azure, nie podajemy konkretnego regionu. Wysy\u0142aj\u0105c \u017c\u0105danie, zostajemy przekierowani do najbli\u017cszej brzegowej instancji front door, kt\u00f3ra u\u017cywaj\u0105c firewalla, silnika regu\u0142 oraz routera, zweryfikuje nas oraz ewentualnie przekieruje do odpowiedniej us\u0142ugi app service.<\/p>\n\n\n\n<p>Front door potrafi doda\u0107 do \u017c\u0105dania HTTP(S) dodatkowe informacje, bazuj\u0105c na zdefiniowanych regu\u0142ach. Nie musimy tego robi\u0107, je\u015bli dla ka\u017cdego tenanta u\u017cywamy innej subdomeny, gdy\u017c w\u00f3wczas w app service mo\u017cemy przeczyta\u0107 adres z nag\u0142\u00f3wka HTTP \u2013 Referer i bazuj\u0105c na tej informacji, mo\u017cemy wybra\u0107 elementy konfiguracji w kontek\u015bcie tenanta.<\/p>\n\n\n\n<p>Front door posiada tak\u017ce wbudowany globalny load balancer, kt\u00f3ry w po\u0142\u0105czeniu z mo\u017cliwo\u015bciami skalowania app service, umo\u017cliwia bardzo szybkie przesy\u0142anie \u017cada\u0144 i opowiedzi. U\u017cywaj\u0105c Azure front door, dobr\u0105 praktyk\u0105 jest zablokowanie na firewallach we wszystkich us\u0142ugach app service pakiet\u00f3w sieciowych z innym \u017ar\u00f3d\u0142em\/punktem przeznaczenia ni\u017c front door. W ten spos\u00f3b mocno podniesiemy poziom bezpiecze\u0144stwa.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-5-1.png\"><img decoding=\"async\" width=\"757\" height=\"485\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-5-1.png\" alt=\"Serwis Azure Front door - dzia\u0142anie\" class=\"wp-image-15850\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-5-1.png 757w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-5-1-300x192.png 300w\" sizes=\"(max-width: 757px) 100vw, 757px\" \/><\/a><figcaption>Ryc. 4 Serwis Azure Front door &#8211; dzia\u0142anie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Azure Active Directory Business to Customer (AAD B2C)<\/strong><\/h2>\n\n\n\n<p>Mimo \u017ce front door przekierowuje nas bezpo\u015brednio do app service, to bardzo cz\u0119sto app service wymaga, aby\u015bmy si\u0119 uwierzytelnili. W zwi\u0105zku z tym zanim zd\u0105\u017cymy zobaczy\u0107 jak\u0105kolwiek stron\u0119 aplikacji, zostajemy przekierowani do identity service \u2013 w przypadku Azure jest to przewa\u017cnie Active Directory lub Active Directory Business to Customer.<\/p>\n\n\n\n<p>Druga opcja daje wi\u0119ksze mo\u017cliwo\u015bci. W zale\u017cno\u015bci od potrzeb poszczeg\u00f3lnych tenant\u00f3w mo\u017cemy mie\u0107 jeden identity service dla wszystkich tenant\u00f3w, osobny dla ka\u017cdego lub co\u015b pomi\u0119dzy. Aby umo\u017cliwi\u0107 uwierzytelnianie w AAD (B2C) dedykowanym dla konkretnego tenanta, mo\u017cemy uwarunkowa\u0107 warto\u015bci konfiguracji AAD (B2C) w app service od informacji wys\u0142anych w oryginalnym \u017c\u0105daniu lub dodanych przez front door.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-6.png\"><img decoding=\"async\" width=\"422\" height=\"260\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-6.png\" alt=\"Uwierzytelnienie Azure AD B2C\" class=\"wp-image-15852\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-6.png 422w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-6-300x185.png 300w\" sizes=\"(max-width: 422px) 100vw, 422px\" \/><\/a><figcaption>Ryc. 5 Uwierzytelnienie Azure AD B2C<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-7-1.png\"><img decoding=\"async\" width=\"482\" height=\"258\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-7-1.png\" alt=\"Uwierzytelnianie w AAD (B2C) dedykowane dla konkretnego tenanta\" class=\"wp-image-15854\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-7-1.png 482w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-7-1-300x161.png 300w\" sizes=\"(max-width: 482px) 100vw, 482px\" \/><\/a><figcaption>Ryc. 6 Uwierzytelnianie w AAD (B2C) dedykowane dla konkretnego tenanta<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>App service<\/strong><\/h2>\n\n\n\n<p>Jak wspomnia\u0142em, mo\u017cemy posiada\u0107 wiele instancji app service w jednym lub wielu regionach. Niezale\u017cnie od lokalizacji, mamy mo\u017cliwo\u015b\u0107 optymalizacji koszt\u00f3w za pomoc\u0105 serwisu app service plan. Jeden plan w zale\u017cno\u015bci od wybranego pricing tier, mo\u017ce zawiera\u0107 od 10 do nieograniczonej liczby aplikacji oraz skalowa\u0107 si\u0119 nawet do 100 instancji w najwy\u017cszym planie.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-8.png\"><img decoding=\"async\" width=\"948\" height=\"203\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-8.png\" alt=\"App service - regiony\" class=\"wp-image-15856\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-8.png 948w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-8-300x64.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-8-768x164.png 768w\" sizes=\"(max-width: 948px) 100vw, 948px\" \/><\/a><figcaption>Ryc. 7 App service &#8211; regiony<\/figcaption><\/figure><\/div>\n\n\n\n<p>Kiedy do app service dotrze request, przewa\u017cnie mamy w nim dodatkowe informacje identyfikuj\u0105ce tenanta. Aplikacja osadzona w app service u\u017cywa tych danych do wybrania odpowiedniej konfiguracji. Sama konfiguracja przewa\u017cnie zapisana jest w us\u0142udze key vault. App service odczytuj\u0119 j\u0105 jednorazowo przy uruchomieniu serwera WWW.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Key vault<\/strong><\/h2>\n\n\n\n<p>Przechowujemy tu najbardziej wra\u017cliwe dane takie jak has\u0142a, klucze i connection stringi do baz danych oraz storage. Poniewa\u017c dobr\u0105 polityk\u0105 jest posiadanie oddzielnych baz danych oraz storage dla poszczeg\u00f3lnych tenant\u00f3w, r\u00f3wnie\u017c konfiguracja zapisana w key vault powinna by\u0107 oddzielna dla ka\u017cdego tenanta. Wydawa\u0142oby si\u0119, \u017ce mo\u017cliwo\u015bci key vault, kt\u00f3ry przechowuje proste pary klucz-warto\u015b\u0107, nie daj\u0105 takich opcji. Istnieje jednak spos\u00f3b na struktury drzewaste:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-9-1.png\"><img decoding=\"async\" width=\"592\" height=\"283\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-9-1.png\" alt=\"fragment kodu\" class=\"wp-image-15858\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-9-1.png 592w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-9-1-300x143.png 300w\" sizes=\"(max-width: 592px) 100vw, 592px\" \/><\/a><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-10-1.png\"><img decoding=\"async\" width=\"518\" height=\"396\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-10-1.png\" alt=\"fragment kodu\" class=\"wp-image-15860\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-10-1.png 518w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-10-1-300x229.png 300w\" sizes=\"(max-width: 518px) 100vw, 518px\" \/><\/a><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Bazy danych i storage<\/strong><\/h2>\n\n\n\n<p>App service prawie zawsze potrzebuje persystencji danych. Najcz\u0119\u015bciej u\u017cywane s\u0105 tutaj serwisy Azure storage oraz SQL Server, chocia\u017c ostatnio coraz wi\u0119ksz\u0105 popularno\u015b\u0107 zyskuj\u0105 rozwi\u0105zania typu NoSQL, na przyk\u0142ad Cosmos DB. Storage daje pewne mo\u017cliwo\u015bci multi-tenancy, nawet w ramach pojedynczego serwisu, za spraw\u0105 kontener\u00f3w. Jednak bardziej naturalne wydaje si\u0119 posiadanie wielu storage accounts. Aby zaoszcz\u0119dzi\u0107, mo\u017cna mie\u0107 jeden storage account z wieloma kontenerami zawieraj\u0105cymi pliki, czyli blobs.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-11-1.png\"><img decoding=\"async\" width=\"891\" height=\"374\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-11-1.png\" alt=\"Schemat dzia\u0142ania Storage accounts, kontener\u00f3w i plik\u00f3w\" class=\"wp-image-15862\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-11-1.png 891w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-11-1-300x126.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-11-1-768x322.png 768w\" sizes=\"(max-width: 891px) 100vw, 891px\" \/><\/a><figcaption>Ryc. 8 Schemat dzia\u0142ania Storage accounts, kontener\u00f3w i plik\u00f3w<\/figcaption><\/figure><\/div>\n\n\n\n<p>SQL Server w Azure mo\u017cna zamodelowa\u0107 na kilka sposob\u00f3w. Je\u017celi chcemy mie\u0107 wiele instancji baz danych, musimy mie\u0107 na wzgl\u0119dzie koszty, gdy\u017c akurat SQL Server w Azure do tanich nie nale\u017cy. <strong>Aby zaoszcz\u0119dzi\u0107<\/strong>, warto zastanowi\u0107 si\u0119 nad serwisem <strong>SQL Server elastic pool<\/strong>. W\u00f3wczas definiujemy maksymalne rozmiary dla samego poola, a zdefiniowane w nim bazy danych musz\u0105 mie\u015bci\u0107 si\u0119 w tych ramach.<\/p>\n\n\n\n<p>Mo\u017cemy tak\u017ce zdefiniowa\u0107 regu\u0142y skaluj\u0105ce. Koszty naliczane s\u0105 na podstawie parametr\u00f3w elastic pool, a nie poszczeg\u00f3lnych instancji baz danych.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-12-1.png\"><img decoding=\"async\" width=\"818\" height=\"378\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-12-1.png\" alt=\"R\u00f3\u017cnica pomi\u0119dzy SQL Server Azure a SQL Server elastic pool\" class=\"wp-image-15864\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-12-1.png 818w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-12-1-300x139.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Ryc.-12-1-768x355.png 768w\" sizes=\"(max-width: 818px) 100vw, 818px\" \/><\/a><figcaption>Ryc. 9 R\u00f3\u017cnica pomi\u0119dzy SQL Server Azure a SQL Server elastic pool<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>Opisane przeze mnie rozwi\u0105zanie jest tylko jednym z wielu mo\u017cliwych. Multi-tenancy, w zale\u017cno\u015bci od skali i mo\u017cliwo\u015bci systemu, mo\u017ce u\u017cywa\u0107 innych, nieopisanych przeze mnie serwis\u00f3w Azure, takich jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>kolejki,<\/li><li>serwery mail,<\/li><li>szyny danych,<\/li><li>app functions,<\/li><li>logic apps<\/li><li>i wiele innych.<\/li><\/ul>\n\n\n\n<p>Podobnie jak w opisanych przyk\u0142adach b\u0119dziemy mogli wybra\u0107 pomi\u0119dzy wsp\u00f3\u0142dzieleniem serwisu przez tenanty, osobnymi instancjami per tenant lub kombinacjami obu.<\/p>\n\n\n\n<p>Finalnie, b\u0119dzie to zawsze jaka\u015b analogia do serwis\u00f3w kt\u00f3re opisa\u0142em. Najwa\u017cniejsze, aby podj\u0119te decyzje by\u0142y przemy\u015blane i oparte o rzeczywiste potrzeby i wymagania.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Ci\u0119 tematyka Azure, polecamy r\u00f3wnie\u017c inne artyku\u0142y naszych specjalist\u00f3w np.: <a href=\"https:\/\/sii.pl\/blog\/azure-arc-rozwiazanie-dla-infrastruktury-hybrydowej-i-multicloud\/?category=development-na-miekko&amp;tag=azure,azure-devops,infrastruktura\" target=\"_blank\" rel=\"noreferrer noopener\" title=\"Azure Arc \u2013 rozwi\u0105zanie dla infrastruktury hybrydowej i multicloud\">Azure Arc \u2013 rozwi\u0105zanie dla infrastruktury hybrydowej i multicloud<\/a>, <a href=\"https:\/\/sii.pl\/blog\/skalowalny-monitoring-dla-srodowisk-azure\/?category=development-na-miekko&amp;tag=automatyzacja,azure-devops,azure-lighthouse,software-development\" target=\"_blank\" rel=\"noreferrer noopener\">Skalowalny monitoring dla \u015brodowisk Azure<\/a> oraz <a href=\"https:\/\/sii.pl\/blog\/uslugi-azure-policy-i-azure-blueprint\/?category=development-na-miekko&amp;tag=azure,centrum-kompetencyjne-it-operations,devops\" target=\"_blank\" rel=\"noreferrer noopener\">Us\u0142ugi Azure Policy i Azure Blueprint<\/a>. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;15841&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;7&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 7)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Aplikacje multi-tenant w Azure&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 7)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Wed\u0142ug definicji aplikacja multi-tenant pozwala u\u017cytkownikom nale\u017c\u0105cym do wielu tenant\u00f3w korzysta\u0107 ze wsp\u00f3\u0142dzielonej instancji oprogramowania. Dzi\u0119ki temu mo\u017cemy oszcz\u0119dzi\u0107 sporo &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/aplikacje-multi-tenant-w-azure\/\">Continued<\/a><\/p>\n","protected":false},"author":406,"featured_media":19588,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":5,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[1516,118,961],"class_list":["post-15841","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-multi-tenant","tag-active-directory","tag-azure"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/09\/Aplikacje-multi-tenant-w-Azure-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/15841"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/406"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=15841"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/15841\/revisions"}],"predecessor-version":[{"id":19590,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/15841\/revisions\/19590"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19588"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=15841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=15841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=15841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}