SaaS Architektura Multitenant Michał Mac Architekt, Comarch MCPD Win Developer, MCITP DBA, Developer
Agenda
Agenda Długi ogon/SaaS Reguły biznesowe Rozszerzalność danych Pojemnik na dane Sql Server
Długi ogon
Jak zrealizować ideę długiego ogona w IT? $ / Klient Najwięksi klienci Co jeśli obniżymy koszt wyprodukowania i dostarczenia oprogramowania? Typowi klienci Nowy rynek >> aktualny rynek Rynek (aktualnie) poza zasięgiem
Za co płaci klient?
Za co płaci klient?
Sprzęt u dostawcy: efekt skali Dostawca może zainwestować w olbrzymie Data-Center
Sprzęt u dostawcy: efekt skali Microsoft Data Center (Chicago, IL) Koszt inwestycji $500m, wielkość 10 boisk football
SaaS – zyski użytkownika Nie kupuje sprzętu Nie instaluje oprogramowania Nie ponosi dużego kosztu na starcie Model abonamentowy Reklamy Większe możliwości sprzętowe producenta – high availability
SaaS – zyski producenta Ciągłe i stałe przychody Lepsza ochrona własności intelektualnej Aktualizacje aplikacji odbywają się centralnie
Za co płaci klient?
Za co płaci klient?
SaaS – modele dojrzałości
SaaS – modele dojrzałości Przykład 10 000 baz.
SaaS – modele dojrzałości
SaaS – modele dojrzałości
SaaS – modele dojrzałości
3 własności Konfigurowalność Multitenancy Skalowalność
SaaS
Przykładowa aplikacja
Założenia Wymienialne reguły biznesowe Rozszerzalny model danych Konfigurowalny interfejs Multitenancy
Demo
Założenia Wymienialne reguły biznesowe Rozszerzalny model danych Konfigurowalny interfejs Multitenancy
Reguły biznesowe
Demo z regułami nie zostało udostępnione, gdyż jest zrobione z użyciem komercyjnego kodu. Natomiast dobra informacja jest taka, że powstaje open sourcowa implementacja podobnej biblioteki. Zapraszam na code.google.com/p/businessframework/ Znajduje się tam dużo przykładów w formie unit testów: reguły biznesowe, reguły walidacyjne, pisane C#, jak i prostym językiem – Formula, oraz kilka innych rzeczy. Zapraszam do współpracy. Demo
Różne wymagania biznesowe Total = Quantity * ProductPrice Stacja benzynowa Quantity = Total / ProductPrice (z dokładnością do obsługi dzielenia przez 0)
Reguły biznesowe Reużywalne Automatyczna detekcja zależności Expression Trees Reguły walidacyjne Możliwość dodawania z zewnątrz Prosty tekstowy język – Formula Antlr + Expression Trees
Rozszerzalność danych
Rozszerzalność danych Realizacja Słownik ExpandoObject - .Net 4.0 Dynamiczny interfejs użytkownika Metadane per tenant Same dane nie wystarczą. Wymagana możliwość używania w regułach biznesowych Baza danych – w następnej części Słownik Expando object Metadane WPF supportuje bindowanie do indexera string, Silverlight nie, ale da się to zrobić
Warstwa danych
Baza danych Osobne bazy 1/2 poziom dojrzałości + możliwość pełnej customizacji per tenant + backup + premium approach + łatwa implementacja - Aktualizacja licencje wymagany sprzęt: 1000 baz, każda po 2 mb, długi czas odtwarzania baz po restarcie servera, a co za tym idzie być może złamane SLA
Osobne bazy Prosta rozszerzalność Prosta strategia backupów Bezpieczeństwo, izolacja Bankowość, branża medyczna Większe koszty – zużyte zasoby Auto close może zwiększyć ten limit, ale pogarsza czas dostępu Premiun approach
Baza danych Wspólna baza, osobne schematy
Wspólna baza, osobne schematy Łatwa implementacja i rozszerzalność Średni poziom izolacji Utrudniony backup/restore Niższe koszty, bo więcej tenantów na jednej bazie Operacje DDL, które blokują katalog systemowy + prosta customizacja per tenant - operacje ddl, które powodują ogromne lokowanie w katalogach systemowym, przykład 80 000 userów w bazie = 20 sek. Dodanie następnego
Baza danych Wspólna baza, wspólny schemat + brak operacji ddl + licencje, sprzęt, odtwarzanie + możliwość obsłużenia większej liczby tenantów + high availability - Trudniejsza implementacja
Wspólna baza, wspólny schemat Najniższe koszty sprzętu per tenant Możliwość dostarczenia drogich mechanizmów wysokiej dostępności po korzystnych cenach. Problemy z backupe/restorem Większe koszty produkcji aplikacji Należy zapewnić bezpieczeństwo, nawet w przypadku nieprzewidzianego błędu Tenant Data Encryption Tenant View Filter Możliwość partycjonowania per tenant
Porównanie
Warstwa danych Realizacja Trusted Database Connections Tenant View Filter
Wymagania Framework agnostic Transparentność Bezpieczeństwo Ewentualny błąd programisty nie może ujawnić danych innego Używanie pooli połączeń Wydajność
DAL
Baza danych CREATE USER TenantA WITHOUT LOGIN WITH DEFAULT_SCHEMA = Secured; GRANT SELECT, EXECUTE, INSERT, UPDATE, DELETE ON SCHEMA::[Secured] TO TenantA; Sposób podobny do security zrealizowane na bazie danych Wcześniejsza alokacja użytkowników – inaczej problem z dodawaniem: 100 000 użytkowników – 20 sek. przebudowa wew. cacha userów sql servera
Baza danych CREATE TABLE Products ( ProductId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL REFERENCES Warehouses, );
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL REFERENCES Warehouses, ); DATABASE_PRINCIPAL_ID(), a nie USER_ID(), bo ta druga obsługuje tylko ok. 32 tys. obsolute
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1) PRIMARY KEY, Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL REFERENCES Warehouses, );
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1), PRIMARY KEY(TenantId, ProductId), Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL REFERENCES Warehouses, );
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1), PRIMARY KEY(TenantId, ProductId), Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL REFERENCES Warehouses, );
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1), PRIMARY KEY(TenantId, ProductId), Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL, FOREIGN KEY ( TenantId, WarehouseId ) REFERENCES Warehouses ); Klucz obcy składa się z kolumny tenant by łatwiej było migrować dane Zapewnia nam to izolację pomiędzy tenantami, żaden nie może się odwołać do danych innego.
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1), PRIMARY KEY(TenantId, ProductId), Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL, FOREIGN KEY ( TenantId, WarehouseId ) REFERENCES Warehouses ); Podobnie z UNIQUE + Indeksy Można użyć partycjonawania tabel jak i indeksów, gdy mamy dużych klientów
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1), PRIMARY KEY(TenantId, ProductId), Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL, FOREIGN KEY ( TenantId, WarehouseId ) REFERENCES Warehouses ); CREATE VIEW Secured.vProducts AS SELECT ProductId, Name, Price, WarehouseId FROM Products WHERE TenantId = DATABASE_PRINCIPAL_ID(); Dobrze umieścić widok w osobnym schemacie, bo łatwiej nadaje się uprawnienia Mechaniczna transformacja – t4, albo użycie mangement view, zależnie od podejścia
Baza danych CREATE TABLE Products ( TenantId INT NOT NULL DEFAULT (DATABASE_PRINCIPAL_ID()), ProductId INT NOT NULL IDENTITY(1,1), PRIMARY KEY(TenantId, ProductId), Name NVARCHAR(64) NOT NULL, Price DECIMAL(19,4) NOT NULL, WarehouseId INT NOT NULL, FOREIGN KEY ( TenantId, WarehouseId ) REFERENCES Warehouses ); CREATE VIEW Secured.vProducts AS SELECT ProductId, Name, Price, WarehouseId FROM Products WHERE TenantId = DATABASE_PRINCIPAL_ID(); Dobrze umieścić widok w osobnym schemacie, bo łatwiej nadaje się uprawnienia Mechaniczna transformacja – t4, albo użycie mangement view, zależnie od podejścia
Baza danych EXECUTE AS USER = 'TenantA'; SELECT * FROM vProducts; INSERT vProducts VALUES('Basketball', 55, 2);
Baza danych CREATE PROC Secured.GetProductsWithState @State INT AS BEGIN ... END
ConnectionPool DEMO
Rozszerzalność Modelu Danych
Rozszerzalność danych Dodawanie kolumn Tylko w osobnych bazach albo osobnych schematach
Dodawanie kolumn Tylko osobne bazy/osobny schemat Prostota Operacje DDL Nie potrzeba metadanych, ale może być trudniejsze do realizacji po stronie aplikacji Osobne codebase’y
Rozszerzalność danych Zaalokowane pola
Zaalokowane pola Predefiniowane pola np. 3 stringi 2 liczby Niepotrzebne zużycie miejsca, gdy któryś z tenantów nie używa pola SPARE Columns A co gdy tenant potrzebuje 4 stringi? Wariacje: Trzymanie danych jako string + metadane typu Skomplikowane, ale podobnego mechanizmu używa SalesForce
Rozszerzalność danych Klucz wartość Kiepska wydajność
Klucz wartość Dane trzymane są nie w jednym wierszu, ale w kilku brak ograniczenia na liczbę dodatkowych pól Gorsza wydajność, niż w Zaalokowanych polach występuje dużo randomowych operacji w bazie danych
Rozszerzalność danych Xml Słabe wsprawcie narzedzi, np. raportów, etc. Data centric appliacations, mała interakcja obiektów, prosta logika
Xml Słabe wsparcie narzędzi, np. raportów Dobre, gdy konfiguracja jest wymagana na poziomie instancji encji Dobre dla danych „rzadkich” Prosta implementacja
SalesForce Trudne, wymagająca implementacja, ale super wydajne i super elastyczne
Poza SaaS PaaS - Platform As A Service HaaS - Hardware As A Service IaaS - Infrastructure As A Service “Blue Cloud” by IBM Simple Storage Service (Amazon S3), Elastic Computing Cloud (Amazon EC2) Google computing services Microsoft Azure
Podsumowanie SaaS Wymaga obniżenia kosztu produkcji 4 modele dojrzałości Wyzwania dla architektury: Konfiguracja – reguły, elastyczny model danych Multitenancy – jedna instancja, wielu klientów Skalowalność
Pytania
Linki http://www.sztronka.com http://code.google.com/p/businessframework/ http://www.salesforce.com/au/assets/pdf/Force.com_Multitenancy_WP_101508.pdf http://msdn.microsoft.com/en-us/library/aa479086.aspx http://www.antlr.org/
michal.bartosz.mac@gmail.com www.sztronka.com Dziękuję michal.bartosz.mac@gmail.com www.sztronka.com