Skaalautuvat arkkitehtuurit Miten suunnitellaan kymmenien miljoonien käyttäjien järjestelmä – Case TeamUp Kalle Launiala, ProtonIT, The Ball [email protected], +358445575665

Download Report

Transcript Skaalautuvat arkkitehtuurit Miten suunnitellaan kymmenien miljoonien käyttäjien järjestelmä – Case TeamUp Kalle Launiala, ProtonIT, The Ball [email protected], +358445575665

Skaalautuvat
arkkitehtuurit
Miten suunnitellaan kymmenien miljoonien käyttäjien
järjestelmä – Case TeamUp
Kalle Launiala, ProtonIT, The Ball
[email protected], +358445575665
Esityksen rakenne
• Case: TeamUp esittely
• Digitaalinen palvelu ja käyttäjä – mitä tarkoitetaan?
• Migraatioskenaariot ASP.NET MVC:stä skaalautuvaksi
• DEMO – Miltä arkkitehtuuri näyttää käytännössä?
• Mobiiliappsin huomiointi skaalautuvuudessa
• Mobiiliekosysteemien maksuton osuus tiedonsiirrossa
• Digitaalisen palvelun kustannusrakenne
Case: TeamUp
Talenttien, fanien ja sponsorien yhdistäminen
Liiketoiminnan ansaintamalli
• Talenteille ilmainen
• Faneille ilmainen
• Talentit & fanit & fanituotteet - kauppa
• Ilmainen = 0% lisä
• Ei edes kustannusten kattamista
• Sponsorit perustaso ilmainen
• Selvästi osoitettavasta lisäarvosta hinta = hyötyperuste
Edellytykset & motiivit
• Talentit tarvitaan
• Motiivi: Tiedottaa faneille, yhteys omaan faniyhteisöön
• Fanit tarvitaan
• Motiivi: Talenttien seuraaminen ja tukeminen, yhteisö
• Sponsorit tarvitaan
• Motiivi: Näkyvyyttä oikeassa yhteydessä, talenttien itse
esilletuomana, fanien hyväksi ymmärtämänä
• Motiivi: Markkinointipanostuksen tehokas ja mitattava
realisointi
Tunnistetut haasteet kasvussa
• Talentit ja fanit tarvitaan ensin, sponsorit seuraavat
• Talentit ja fanit luovat kaikki kustannukset
• Sponsorit eli rahoittajat saattavat tulla perästäpäin
• Tavoiteskenaario: iso olemassaoleva fanikanta
• Esim. Jääkiekko- tai jalkapallojoukkue, miljoonia faneja
• Ottelua edeltävää aktiviteettia, selkeitä käyttäjäpiikkejä
Liiketoiminnan kysymyksiä...
• Voidaanko palvella miljoona yhtaikaista käyttäjää?
• Jos pitää miettiä, vastaus on ei voida
• Jos voidaan palvella, mitä maksaa?
• Mitä muutosvaihtoehtoja on, tekniikassa, tuotteessa?
• Mistä kustannus tulee, mitä se tarkoittaa?
• Tämä vastaus auttaa yhteistyöneuvotteluissa
• Mahdollista tunnistaa ”pay-per-click” perusteet ja
saattaa muutenkin linjaan nykyisen verkko-infran kanssa
Resurssikäyttö on ratkaisun avain
.json
MVC Controller
+ Handler
Prosessointiaika (h),
suorituskyky ja
skaalautuvuus
Partial View
SQL Server
As Master Data
& Indexing Storage
Ajax
Partial View
Combination
Razor View + MVC
Rendering
Webisivut, Ajax lähteet (JSON)
= Siirrettävä datamäärä
Web Page
Individual With
Private Data
Käyttäjäryhmien lukumäärät
= kerroin muuhun
Invidividual With
Private Data
Community / Shared Data
Datamäärä
(GB),
suorituskyky ja
skaalautuvuus
ProtonIT:n Edellytykset
luoda migraatio-skenaario
• ”The Ball on Azure”
• Avoimesti GitHubissa 2012• Tuotannossa keväästä 2013
• Hyvin ohut autorisoitu HTTS/WSS kerros
Blob Storagen päällä
= Kokemusta skaalaavasta
runkoteknologiasta käytännössä
+ Yhteistyö TeamUpin kanssa aidosta
skenaariosta 
Lähtötilanne
• Huom - Hinnat muuttuneet – kevät-syksy 2014:
• Blob hinta puolittunut - AWS:n hinnantäsmäytyksiin...
• Metriikka lähtötasoksi:
•
•
•
•
Selaimen siirtotiedoista - cachen realisoituvat faktat
Palvelinpään diagnostiikka HTTP pyynnön läpimenossa
Arvioita mittakaavasta SQL tietokannasta per käyttäjä
Arvioita mittakaavasta käyttäjiä per aikayksikkö
• Ajatus-työkalut: arkkitehtuurilohko-kaaviot + Excel
Ennen – Jälkeen – 50-100k
Landing Page Uncached Loads / Landing Page Cached Loads / Month
Active Users Month / User
/ User
1 000 000
60
3000
Mbps Avg / Storage
Storage
Network Network Total Cost CPU
Constant Transactions /
Costs
(GB)
Costs
w/o CPU Hours CPU CostTotal
Load
second Avg
11 391 € 703 125 63 281 € 74 672 € 510 000 30 600 € 105 272 €
2 222
0
CPU 600ms => 60ms
Dataservice JSON =>
Cachettava BLOB
Onnistuuko?
Onnistuuko 10x?
Mbps Avg / Storage
Storage
Network Network Total Cost CPU
Constant Transactions /
Costs
(GB)
Costs
w/o CPU Hours CPU CostTotal
Load
second Avg
19 609 € 410 156 36 914 € 56 523 € 51 000 3 060 € 59 583 €
1 296
118 056
Digitaalinen palvelu
... Ja sen käyttäjä tämän esityksen kontekstissa
Digitaalinen palvelu
• Websovellus
• Mobiililaite-palvelu
• Avoimen datan palvelu
• Internet-of-anything palvelu
... Käyttäjä
• Yksittäinen ihminen
• Käyttäjäryhmä
• Yksittäisen omistajan laite
• ... Käyttäjäryhmän roolinen laite
• Mikälie-laite
• ... Toinen digitaalinen palvelu (= loputon ketju palveluita)
Laskennan perusteet: Käyttäjä?
Mikä määritellään käyttäjäksi?
• Ihminen vai laite?
• Onko käyttäjä eri viikonlopun ”matsin aikaan” kuin
työpisteellä statuspäivityksiä katsoessaan?
Montako per aikayksikkö, miten aktiivisia?
• Tunnistetaanko sama käyttäjä erilaiseksi, vai jaetaanko yksi
käyttäjä eri käyttäjätyyppeihin toiminnoista riippuen?
• ”Sivuja lukeva käyttäjä”, ”Päivitystä tekevä”, ”Ostosta tekevä”
Otetaanko huomioon käyttäjän poissaoloajat, vai onko
käyttäjä aktiivinen palvelussa oleva käyttäjä?
• Käyttäjän kokemus voidaan huomioida, jos tunnistetaan
Mitä väliä käyttäjästä on?
Kapasiteettilaskennan kannalta ei niin merkittävää,
kunhan ei mene sekaisin tunnit ja kuukaudet – Ei eroa
mittakaavassa 300B (cached 304) outbound vs 1 IOTR!
Liiketoiminnan ja sijoittajien kannalta on merkittävää,
joten parempi ettei mene sekaisin...
Esimerkki: 50%+ kustannuksista tulee m2m
palveluketjuista... Mikä on käyttäjä ja montako niitä on?
Tulokset voivat vaikuttaa palvelun tuotteistukseen ja
liiketoimintamalliin, mikä on hyvä asia !
Migraatioskenaariot
ASP.NET MVC ja mobiiliappsin arkkitehtuurit
Lähtötilanne
.json
MVC Controller
+ Handler
Partial View
SQL Server
As Master Data
& Indexing Storage
Ajax
Partial View
Combination
Razor View + MVC
Rendering
Web Page
Individual With
Private Data
Invidividual With
Private Data
Community / Shared Data
Resurssikäytön hahmottaminen
• Käyttäjäkohtaisuus vs. monen käyttäjän yhteinen
• Prosessointikapasiteetti, tallennus, verkko
• Konkretisointi: Data siirrettäviksi tiedostoiksi
• Etagit, expiroituminen, ”näkyvä/kosketeltava” data
• Tiedostot ovat cachejen ja CDN:n vakiokauraa
• Muutokset ja dynaamiset haut
• Murto-osa requesteista, ei tarvitse olla välitön
.html
.js = jQuery
.jpg
.json
=> Jo nyt...
Alkutavoite: CPU konsolidointi +
verkko-cache
Restructure
Storage
To Master JSON
Käyttäjäkohtaiset
”CPU + SQL queryt”
pois GET:stä
600ms => 60ms
JSON
Information
Dependencies
JSON
.json
Information Information
Dependencies Dependencies
.json JSON
SQL Server
As Master Data
& Indexing Storage
.json
Personal Data
jQuery & Browser
Rendering
HTML, jQuery,
Dust.js etc
Served Directly
as .json BLOB
JSON / REST
Served Directly
As .json BLOB
Individual With
Private Data
Invidividual With
Private Data
Community /
Shared Data
Muutokset ja vapaat haut
asynkronisina, tulokset JSON:ina
Libraries / Frameworks
To Support Submitting
Web Page(s)
Libraries / Frameworks
To Support Viewing
Libraries / Frameworks
To Support JSON Data
Management
HTTP POST
HTTP GET
Web Content Serving
GET Requests
Scalable Cloud Storage
Html/Javascript/Css/JSON
Web Operation Handling
POSTS Requests
Owner Separated
Storage & Operations
On jo: Entity Framework Mallit
On jo: URL (json)= EF + Dataservice
HTTPModule voi tallettaa responsen
.json fileksi URL:n nimellä
= Toimii blobin nimenä täysin
=> Blobiksi suoraan
Käyttäjäkohtainen
autorisointi luonteva
tehdä EF:ssä
+ T4 generaattorilla
+ .JSON customointi
tulee samalla
Mahdollista tehdä migraatio sideby-side pala kerrallaan...
Entity
MVC Controller
+ Handler
Framework
Restructure
Storage
To Master JSON
Partial View
ASP.NET
MVC +
.json
WCF Dataservice
+ html & jQuery
Partial View
Combination
Ajax
SQL Server
As Master Data
& Indexing Storage
Razor View + MVC
Rendering
User vs. Public community
data identification is best
done at database level. The
separation can then be
applied to further
processing chain with
simple rules.
Web Page
JSON
Information
Dependencies
.json
.json
.json filet
blobeista
”Browser Templates”
+ html & jQuery
JSON
JSON
Information Information
Dependencies Dependencies
JSON
Information
Dependencies
jQuery & Browser
Rendering
.json
JSON / REST
Served
Directly
Web Page
Individual user private data:
Browser cacheable
- Requires user specific blobcaching on server side
Individual With
Private Data
Invidividual With
Private Data
Community / Shared Data
Community wide
public content:
CDN Deliverable /
cacheable, browser
cacheable
- One blob-storage
cache applies to all
users
DEMO
Azure Blob Storage vs. Paikallinen Filesystem
Pelkistyminen – Asteittain
• Palvelin on autorisoiva HTTPS/WSS handler
• Palveltava data on HTML:ää, JavaScriptiä, binääriä ja
JSON:ia
• Salatut cookiet/tokenit hoitavat tilanhallinnan
• Pyynnön lähteet ja käsittelydata kokonaisuudessaan:
•
•
•
•
•
Pyynnön URL = mikä appsi/instanssi, mikä jakeluryhmä
Pyynnön cookie = kuka kysyy
Loput blob storagesta näiden pohjalta (joko auth tai suoraan)
Muisticachessa ainoastaan salausavaimet
Pyyntöjen statistiikka/logitus => blob storageen per request
Skaalautuminen
• Ryhmät datan omistajina = itsenäinen datavarasto
• Kuin tiedostokansio, johon pääsy vaatii ryhmäoikeudet
• GET pyynnöt palvellaan suoraan auth kerroksen läpi
• POST pyynnöt prosessoidaan ryhmäkohtaisilla
resursseilla/priorisoinnilla
• Yksittäiset blobit skaalaavat 500 IOPS & 60MB/s
• Ryhmäkohtaiset blob/Files skaalaavat 60MB/s
Cache-tasot
• Mobiiliappsin sovelluksen oma tietokanta
• Datan päivitys kuten HTTP-protokollassa
• HTTP cache tasot
•
•
•
•
•
•
Täysin julkinen = proxy cachettava, expire time
Täysin yksityinen = client cache, expire tai Etag/MD5
HTTPS/SSL = täysin yksityinen
200 OK, täysi download
304 Not Changed, headerit (alle 300B) + transaktiot
Expire hit = ei verkkoliikennettä lainkaan
Mobiiliappsit & kauppapaikat
• Erityispiirre: ilmainen datan jako paketin mukana
• Sovellusten maksimikoot gigatavuja
• Kannattaa hyödyntää staattisen tiedon päivityksissä
• Arkkitehtuuri yksinkertaistuu JSON tiedonsiirtoon
• Helppo muuttaa tukemaan offline-modea
• Voi mahdollisesti hyödyntää myös muita jakopalveluita
• OneDrive, Google Drive, DropBox...
Digitaalisen palvelun
kustannusrakenne
Mitä maksaa pitää palvelimet palvelemassa pyyntöjä..?
Azuren hinnoittelu = kustannukset
Mitä
Paljonko
Maksaa
Per yksikkö
1/x jaettu vCore + 768M
750h = 1kk 11,09€
0,015€/h
1 vCore + 1,75G (* kerrannaiset tästä
johtaen)
750h = 1kk 44,33€
0,06€/h
SQL Database (Web & Business) (RET)
150 GB
168,14€
1,12€/GB
Verkkokaista ulospäin
2000 GB
178,29€
0,09€/GB
Block Blob Storage (Locally Red.)
10000GB
178,73€
0,018€/GB
Block Blob Storage (Geo R. Read Acc.)
10000GB
681,67€
0,068€/GB
Page Blob (= Disk) Storage (LR)
10000GB
372,35€
0,037€/GB
Page Blob (= Disk) Storage (RA-GRS)
10000GB
759,96€
0,076€/GB
Files (SMB Share) (LR)
10000GB
297,88€
0,030€/GB
Files (SMB Share) (RA-GRS)
10000GB
968,11€
0,097€/GB
Storage Transactions (LR & RA-GRS)
1000M
26,81€
0,02681€/M
Content Delivery Network
2000GB
129,58€
0,06€/GB
”Omat palvelimet” vs Azure
• Huomattavasti halvempi CPU aika
• Ei skaalaa miljooniin käyttäjiin
• Huomattavasti halvempi outbound kaista
• Jos tasaisessa käytössä, ei skaalaa kuormituspiikkeihin
• ... Käytännön palvelu ei ikinä tasaisessa käytössä
• Luotettava ja skaalaava tallennus maksaa paljon
• Eikä kuitenkaan skaalaa miljooniin käyttäjiin
Lisätään redundanssi + PaaS-tason ylläpito...
Azuren hinnoittelu vs konesalipilvi
• Disclaimer: UpCloud vain esimerkkinä
• Ei suoraan verrattavissa, mutta onpa kuitenkin...
• UpCloud Hinnasto: Merkittävät kustannuserot HKI
& Lontoo – kannattaa tarkistaa myynniltä...
Azuren hinnoittelu vs UpCloud
• Tallennus: Azure (LR-3x) Blob Storage = 0,018€/GB
•
•
•
•
•
MaxIOPS = 0,20€/GB (~ 10x kalliimpaa)
HDD = 0,09€/GB (~ 5x kalliimpaa)
SSD = 0,36€/GB (~ 20x kalliimpaa)
Backup (lisä) = 0,05€/GB (+ 2,7x kalliimpaa – jos tarpeen)
IO Transaktio = 0€ (halvempaa, ei hinnoitteluperuste)
• Ulosmenevä verkkoliikenne
• Azure: 0,09€/GB (blob & prosessoitu), 0,06€/GB CDN
• UpCloud: 0,05€/GB
Todellinen ero? Kontrolli
• ”Mikä on moottoritien kapasiteetti autoa tunnissa?”
• Miten lasketaan kaupungin kapasiteetti, tiet, risteykset?
• Moottoritie voidaan rakentaa tarjottuna palveluna
• Primitiivi-tallennusjärjestelmä voidaan tarjota palveluna
Azure Storage Scalability and Performance Targets
http://msdn.microsoft.com/enus/library/azure/dn249410.aspx
Single Blob: ”Up to 60 MB per second, or up to 500
requests per second”
Kysymykset
Kysymyksiä / tarkennuksia..?