windows azure multi-tenant applicatie

95
Windows Azure Multi-tenant applicatie Bouwen van een multi-tenant applicatie in de praktijk 1

Upload: marin

Post on 04-Feb-2016

59 views

Category:

Documents


0 download

DESCRIPTION

Windows Azure Multi-tenant applicatie. Bouwen van een multi-tenant applicatie in de praktijk. Edo van Asseldonk. Ordina Microsoft Solutions. Agenda. Introductie / Architectuur URL strategie / Tenant id Data opslag (SQL Azure, Table Storage) Maatwerk (UI / Business Logica) Cache - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Windows Azure Multi-tenant applicatie

Windows AzureMulti-tenant applicatieBouwen van een multi-tenant applicatie in de praktijk

1

Page 2: Windows Azure Multi-tenant applicatie

Edo van AsseldonkOrdina Microsoft Solutions

Page 3: Windows Azure Multi-tenant applicatie

3Agenda

• Introductie / Architectuur

• URL strategie / Tenant id

• Data opslag (SQL Azure, Table Storage)

• Maatwerk (UI / Business Logica)

• Cache

• Access Control Service

Page 4: Windows Azure Multi-tenant applicatie

4MultitenancyDefinitie

Page 5: Windows Azure Multi-tenant applicatie

5MultitenancyDefinitie

…single instance of software serving multiple clients (tenants)…

…een enkele softwareinstantie die meerdere klanten bedient…

Page 6: Windows Azure Multi-tenant applicatie

6MultitenancyDefinitie

Page 7: Windows Azure Multi-tenant applicatie

7MultitenancyDefinitie

Page 8: Windows Azure Multi-tenant applicatie

8MultitenancyDefinitie

Iedere tenant heeft:

• eigen data

• eigen opmaak

• eigen business logic

• gemeenschappelijke codebase

• gemeenschappelijk datamodel

Page 9: Windows Azure Multi-tenant applicatie

9ArchitectuurOverview

Casus / Demo

Page 10: Windows Azure Multi-tenant applicatie

10ArchitectuurOverview

Webrole SQL Azure

Table Storage

ACS

Page 11: Windows Azure Multi-tenant applicatie

11ArchitectuurOverview

Webrole SQL Azure

Table Storage

ACS

Page 12: Windows Azure Multi-tenant applicatie

12ArchitectuurOverview

Eisen:

• Tenantapplicatie bereikbaar via eigen url

• Eén database schema

• Eigen stijl per tenant

• Self service

• Share everything

Page 13: Windows Azure Multi-tenant applicatie

URL Strategie / Tenant id

Page 14: Windows Azure Multi-tenant applicatie

14URL Strategie / Tenant idOpties

Optie 1: Tenant bepalen a.d.h.v. ingelogde gebruiker

http://www.MyMultitenantApp.nl/Home

Geen referentie naar naam van tenant

Page 15: Windows Azure Multi-tenant applicatie

15URL Strategie / Tenant idOpties

https://www.chatter.com/nl/

Page 16: Windows Azure Multi-tenant applicatie

16URL Strategie / Tenant idOpties

https://eu1.salesforce.com/home/home.jsp

Page 17: Windows Azure Multi-tenant applicatie

17URL Strategie / Tenant idOpties

Optie 2: TenantId in URL

http://www.MyTenantApp.nl/Home?tenantId=17

http://www.MyTenantApp.nl/17/Home

http://www.MyTenantApp.nl/A219F47cd-898B/Home

http://www.MyTenantApp.nl/WazugNL/Home

Page 18: Windows Azure Multi-tenant applicatie

18URL Strategie / Tenant idOpties

Optie 3: Tenant bepalen a.d.h.v. URL

http://tenant1.MyTenantApp.nl/Home

http://tenant2.MyTenantApp.nl/Home

Page 19: Windows Azure Multi-tenant applicatie

19URL Strategie / Tenant idOpties

Optie 3: Tenant bepalen a.d.h.v. URL

http://tenant1.MyTenantApp.nl/Home

http://tenant2.MyTenantApp.nl/Home

http://www.customdomain.nl/

-> verwijst naar http://tenant2.MyTenantApp.nl

Page 20: Windows Azure Multi-tenant applicatie

20URL Strategie / Tenant idOpties

http://gaming.stackexchange.com/

Page 21: Windows Azure Multi-tenant applicatie

21URL Strategie / Tenant idOpties

http://programmers.stackexchange.com/

Page 22: Windows Azure Multi-tenant applicatie

22URL Strategie / Tenant idOpties

http://www.stackoverflow.com/

Page 23: Windows Azure Multi-tenant applicatie

23URL StrategieIn Windows Azure

[MyMultitenantApp].cloudapp.net

Page 24: Windows Azure Multi-tenant applicatie

24URL StrategieIn Windows Azure

[MyMultitenantApp].cloudapp.net

[Tenant].cloudapp.net

[Tenant].[MyMultitenantApp].cloudapp.net

Page 25: Windows Azure Multi-tenant applicatie

25URL StrategieIn Windows Azure

[MyMultitenantApp].cloudapp.net

Domain name: MyMultitenantApp.nl

Page 26: Windows Azure Multi-tenant applicatie

26URL StrategieIn Windows Azure

[MyMultitenantApp].cloudapp.net

Domain name: MyMultitenantApp.nl

URLs:

http://tenant1.MyMultitenantApp.nl

http://tenant2.MyMultitenantApp.nl

http://www.customdomain.nl

Page 27: Windows Azure Multi-tenant applicatie

Data

Database

Page 28: Windows Azure Multi-tenant applicatie

28DatabaseIntroductie

Alle tenants in dezelfde database

Twee issues:

• Limiet aan databasegrootte

• Limiet aan verwerkingscapaciteit (CPU, I/O etc.)

Page 29: Windows Azure Multi-tenant applicatie

29DatabaseIntroductie

Oplossing:

• Database splitsen

Page 30: Windows Azure Multi-tenant applicatie

30DatabaseIntroductie

Oplossing:

• Database splitsen -> SQL Azure Federations

Page 31: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 32: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 33: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 34: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 35: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 36: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 37: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 38: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 39: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 40: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 41: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 42: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 43: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 44: Windows Azure Multi-tenant applicatie

DatabaseIntroductie

Page 45: Windows Azure Multi-tenant applicatie

45SQL Azure FederationsRoot database

Root DBRoot

Table1Root

Table2

RootTable…

Page 46: Windows Azure Multi-tenant applicatie

46SQL Azure FederationsCreate federation

Member DBRoot DBRoot

Table1Root

Table2

RootTable…

Page 47: Windows Azure Multi-tenant applicatie

47SQL Azure FederationsCreate tables

Member DBRoot DBRoot

Table1Root

Table2

RootTable…

MemberTable1

Member Table2

Member Table…

Page 48: Windows Azure Multi-tenant applicatie

48SQL Azure FederationsSplit federation member

Member DBRoot DBRoot

Table1Root

Table2

RootTable…

MemberTable1

Member Table2

Member Table…

Page 49: Windows Azure Multi-tenant applicatie

49SQL Azure FederationsSplit federation member

Member DBRoot DBRoot

Table1Root

Table2

RootTable…

MemberTable1

Member Table2

Member Table…

Page 50: Windows Azure Multi-tenant applicatie

50SQL Azure FederationsSplit federation member

Member DBRoot DBRoot

Table1Root

Table2

RootTable…

MemberTable1

Member Table2

Member Table…

Member DBMemberTable1

Member Table2

Member Table…

Member DBMemberTable1

Member Table2

Member Table…

Page 51: Windows Azure Multi-tenant applicatie

51SQL Azure FederationsSplit federation member

Root DBRoot

Table1Root

Table2

RootTable…

Member DBMemberTable1

Member Table2

Member Table…

Member DBMemberTable1

Member Table2

Member Table…

Page 52: Windows Azure Multi-tenant applicatie

52SQL Azure FederationsVoordelen

•DB Size van max 150 GB -> 75 TB

•CPU Cores en I/O verveelvoudigd

•Real-time

•Geen downtime

Page 53: Windows Azure Multi-tenant applicatie

53SQL Azure FederationsVoordelen

•DB Size van max 150 GB -> 75 TB

•CPU Cores en I/O verveelvoudigd

•Real-time

•Geen downtime

Page 54: Windows Azure Multi-tenant applicatie

54SQL Azure FederationsVoordelen

•DB Size van max 150 GB -> 75 TB

•CPU Cores en I/O verveelvoudigd

•Real-time

•Geen downtime

Page 55: Windows Azure Multi-tenant applicatie

55SQL Azure FederationsVoordelen

•DB Size van max 150 GB -> 75 TB

•CPU Cores en I/O verveelvoudigd

•Real-time

•Geen downtime

Page 56: Windows Azure Multi-tenant applicatie

56SQL Azure FederationsKosten

Sinds halverwege februari 2012 prijsverlaging.

Tot 78% goedkoper.

Hoe meer tenants per member database, hoe goedkoper.

Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN

10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m

Page 57: Windows Azure Multi-tenant applicatie

57SQL Azure FederationsKosten

Sinds halverwege februari 2012 prijsverlaging.

Tot 78% goedkoper.

Hoe meer tenants per member database, hoe goedkoper.

Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN

10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m

50 GB $125,88 p/m 10 x 5 GB $259,80 p/m

Page 58: Windows Azure Multi-tenant applicatie

58SQL Azure FederationsKosten

Sinds halverwege februari 2012 prijsverlaging.

Tot 78% goedkoper.

Hoe meer tenants per member database, hoe goedkoper.

Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN

10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m

50 GB $125,88 p/m 10 x 5 GB $259,80 p/m

50 GB $125,88 p/m 50 x 1 GB $499,50 p/m

Page 59: Windows Azure Multi-tenant applicatie

59SQL Azure FederationsKosten

Sinds halverwege februari 2012 prijsverlaging.

Tot 78% goedkoper.

Hoe meer tenants per member database, hoe goedkoper.

Eén database Meerdere databasesFORMAAT KOSTEN FORMAAT KOSTEN

10 GB $45,95 p/m 10 x 1 GB 10 x $9.99 = $99,90 p/m

50 GB $125,88 p/m 10 x 5 GB $259,80 p/m

50 GB $125,88 p/m 50 x 1 GB $499,50 p/m

150 GB $225,78 p/m 150 x 1 GB $1498,50 p/m

Page 60: Windows Azure Multi-tenant applicatie

60SQL Azure FederationsSamenwerking met Entity Framework

string federationCmdText =

"USE FEDERATION tenant_federation (tenantId = [id])

WITH FILTERING=ON, RESET";

((IObjectContextAdapter)myDatabaseContext).ObjectContext.Connection.Open();

_databaseContext.Database.ExecuteSqlCommand(federationCmdText);

var query = from o in _myDatabaseContext.Orders where o.TenantId = id select o;

Page 61: Windows Azure Multi-tenant applicatie

61SQL Azure FederationsGeen Federations in SQL Server 2008R2

string federationCmdText =

"USE FEDERATION tenant_federation (tenantId = [id])

WITH FILTERING=ON, RESET";

((IObjectContextAdapter)myDatabaseContext).ObjectContext.Connection.Open();

_databaseContext.Database.ExecuteSqlCommand(federationCmdText);

var query = from o in _myDatabaseContext.Orders

where o.TenantId = id

select o;

Page 62: Windows Azure Multi-tenant applicatie

62SQL Azure FederationsGeen where-clause nodig in gefilterde verbinding

string federationCmdText =

"USE FEDERATION tenant_federation (tenantId = [id])

WITH FILTERING=ON, RESET";

((IObjectContextAdapter)myDatabaseContext).ObjectContext.Connection.Open();

_databaseContext.Database.ExecuteSqlCommand(federationCmdText);

var query = from o in _myDatabaseContext.Orders

where o.TenantId = id

select o;

Page 63: Windows Azure Multi-tenant applicatie

63SQL Azure FederationsEntity Framework: geen support parallelle queries

Page 64: Windows Azure Multi-tenant applicatie

64ArchitectuurOverview - > Table Storage

Webrole SQL Azure

Table Storage

ACS

Page 65: Windows Azure Multi-tenant applicatie

65Table storageMeten en Afrekenen

Afrekenen op basis van verbruik

(aantal page requests, aantal objecten etc.)

Verbruik inzichtelijk maken voor tenants

Statcounter.com is niet geschikt voor multitenancy

Page 66: Windows Azure Multi-tenant applicatie

Maatwerk

Page 67: Windows Azure Multi-tenant applicatie

67Maatwerk

Maatwerk per tenant op twee gebieden:

• User Interface

• Business Logic

Page 68: Windows Azure Multi-tenant applicatie

68MaatwerkUser Interface

Tenant-logo

<div id="header">

<a href="/" class="logo" style="background: url(@ViewBag.Logo) no-repeat;">

Page 69: Windows Azure Multi-tenant applicatie

69MaatwerkUser Interface

Tenant-logo

<div id="header">

<a href="/" class="logo" style="background: url(@ViewBag.Logo) no-repeat;">

Niet doen op deze manier:

Kleuren

Fonts

Posities van html-elementen

Etc.

Page 70: Windows Azure Multi-tenant applicatie

70MaatwerkUser Interface - Themes

Page 71: Windows Azure Multi-tenant applicatie

71MaatwerkUser Interface - Themes

Page 72: Windows Azure Multi-tenant applicatie

72MaatwerkUser Interface - Themes

public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;

public ThemesViewEngine(string themeName) { _themeName = themeName; }

protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);

return new RazorView(controllerContext, viewPath, masterPath, …); }

Page 73: Windows Azure Multi-tenant applicatie

73MaatwerkUser Interface - Themes

public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;

public ThemesViewEngine(string themeName) { _themeName = themeName; }

protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);

return new RazorView(controllerContext, viewPath, masterPath, …); }

Page 74: Windows Azure Multi-tenant applicatie

74MaatwerkUser Interface - Themes

public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;

public ThemesViewEngine(string themeName) { _themeName = themeName; }

protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);

return new RazorView(controllerContext, viewPath, masterPath, …); }

Page 75: Windows Azure Multi-tenant applicatie

75MaatwerkUser Interface - Themes

public class ThemesViewEngine : BuildManagerViewEngine{ private readonly string _themeName;

public ThemesViewEngine(string themeName) { _themeName = themeName; }

protected override IView CreateView( ControllerContext controllerContext, string viewPath, string masterPath) { masterPath = string.Format("~/Themes/{0}/_Layout.cshtml", _themeName);

return new RazorView(controllerContext, viewPath, masterPath, …); }

Page 76: Windows Azure Multi-tenant applicatie

76MaatwerkUser Interface - Themes

public class UseThemesViewEngine : ActionFilterAttribute{ public ITenantSettings Settings { get; set; }

public override void OnActionExecuting( ActionExecutingContext context) { ViewEngines.Engines.Clear();

var engine = new ThemesViewEngine(Settings.ThemeName);

ViewEngines.Engines.Add(engine)); }}

Page 77: Windows Azure Multi-tenant applicatie

77MaatwerkUser Interface - Themes

public class UseThemesViewEngine : ActionFilterAttribute{ public ITenantSettings Settings { get; set; }

public override void OnActionExecuting(…) { ViewEngines.Engines.Clear();

var engine = new ThemesViewEngine(Settings.ThemeName);

ViewEngines.Engines.Add(engine)); }}

Page 78: Windows Azure Multi-tenant applicatie

78MaatwerkUser Interface - Themes

Public class HomeController : Controller{ [UseThemesViewEngine] public ActionResult Index() { }}

Page 79: Windows Azure Multi-tenant applicatie

79MaatwerkUser Interface - Themes

public class UseThemesViewEngine : ActionFilterAttribute{ public ITenantSettings Settings { get; set; }

public override void OnActionExecuting( ActionExecutingContext context) { ViewEngines.Engines.Clear();

var engine = new ThemesViewEngine(Settings.ThemeName);

ViewEngines.Engines.Add(engine)); }}

Page 80: Windows Azure Multi-tenant applicatie

80Maatwerk

Maatwerk per tenant op twee gebieden:

• User Interface

• Business Logic

Page 81: Windows Azure Multi-tenant applicatie

81MaatwerkBusiness Logic

Probleem

• Tenant settings moeten continue doorgegeven worden

• If-statements en switch-statements door alle code verweven

Page 82: Windows Azure Multi-tenant applicatie

82MaatwerkBusiness Logic

var data = Foo.Bar(TenantSettings)

If(settings.IsGoldPartner) …else …

TenantSettings

Business Logic layer

MVC Controller

Page 83: Windows Azure Multi-tenant applicatie

83MaatwerkBusiness Logic

var data = Foo.Bar(TenantSettings)

If(settings.IsGoldPartner) …else …

TenantSettings

Business Logic layer

MVC Controller

Page 84: Windows Azure Multi-tenant applicatie

84MaatwerkBusiness Logic

var data = BLL.GetData(TenantId)

return DA.GetData(TenantId)

from t in tablewhere tenantid == TenantIdselect t

select * from tablewhere tenantid = TenantId

TenantId

TenantId

TenantId

Business Logic layer

MVC Controller

Data Access

Database

Page 85: Windows Azure Multi-tenant applicatie

85MaatwerkBusiness Logic

var data = BLL.GetData(TenantId)

return DA.GetData(TenantId)

from t in tablewhere tenantid == TenantIdselect t

select * from tablewhere tenantid = TenantId

TenantId

TenantId

TenantId

Business Logic layer

MVC Controller

Data Access

Database

Page 86: Windows Azure Multi-tenant applicatie

86MaatwerkBusiness Logic

public class BusinessLogic{ public void DoeIets(string messageText) { var message = CreateMessage(messageText);

var tenantSettings = TenantSettingsHelper.GetSettings();

if(tenantSettings.UseSpamFilter) { if(tenantSettings.SpamFilterType == Fast) { spamfilter = new FastSpamfilter().Execute(message); } else if(TenantSettings.SpamFilterType == Slow) { spamfilter = new SlowSpamfilter().Execute(message); } }

SaveMessage(message); }

Page 87: Windows Azure Multi-tenant applicatie

87MaatwerkBusiness Logic

IoC container (autofac):builder.Register(c => NewSpamfilter()) .As<ISpamfilter>;

private Ispamfilter NewSpamfilter(){ if(!TenantSettings.UseSpamFilter) return new NoSpamfilter();

if(TenantSettings.SpamFilterType == Fast) return new FastSpamfilter();

else if(TenantSettings.SpamFilterType == Slow) return new SlowSpamfilter();

Page 88: Windows Azure Multi-tenant applicatie

88MaatwerkBusiness Logic

public class BusinessLogic{ ISpamfilter _spamfilter; public Messenger(ISpamfilter spamfilter) { _spamfilter = spamfilter }

public void DoeIets(string messageText) { var message = CreateMessage(messageText); _spamfilter.Execute(message); SaveMessage(message); }

Page 89: Windows Azure Multi-tenant applicatie

89Cache

App Fabric Cache doet de basics

Wissen van totale cache niet mogelijk

Geen persistentie

Geen inzicht in bytes per tenant

Versienummer in cachekey:

Bijvoorbeeld [tenantId]_[objecttype]_[versienr]_[objectId]2ED669F2-9EBC-4248-8BE2-56CDFDA89B75_employee_v1.1_924F32EA-7793-46C1-986E-69FF0857F39C

2ED669F2-9EBC-4248-8BE2-56CDFDA89B75_employee_v1.2_924F32EA-7793-46C1-986E-69FF0857F39C

Cache

Page 90: Windows Azure Multi-tenant applicatie

90Cache

• App Fabric Cache doet de basics, maar niet meer dan dat.

• Wissen van totale cache niet mogelijk.

• Geen persistentie.

• Geen inzicht in bytes per tenant.

Versienummer in cachekey:

Bijvoorbeeld [tenantId]_[objecttype]_[versienr]_[objectId]

Page 91: Windows Azure Multi-tenant applicatie

91Access Control Service

Access Control

Page 92: Windows Azure Multi-tenant applicatie

92Access Control ServiceIntro

Iedere tenant -> Relying Party Application in ACS

Management Service (beschikbaar als Odata Service)

Geen gebruikcijfers

Page 93: Windows Azure Multi-tenant applicatie

93Access Control ServiceAudienceMode

Na inloggen stuurt ACS een token naar de website.

Check (url in token == AllowedAudienceUri)

Uitzetten!

<microsoft.identityModel>

<service>

<audienceUris mode="Never">

Page 94: Windows Azure Multi-tenant applicatie

94ContactBereikbaar voor vragen

Edo van Asseldonk

Email: [email protected]

Twitter: @edovanasseldonk

Blog: http://edo-van-asseldonk.blogspot.com

Page 95: Windows Azure Multi-tenant applicatie

95

www.ordina.nl