Upload
rune-rystad
View
102
Download
4
Embed Size (px)
Citation preview
Et sanntids, utendørs lagspill med .NET og AzureNNUG 15. november 2016 Rune Rystad
1
• Om spillet• Arkitektur/design• Implementasjon og teknologi
– Klientutvikling– Sikkerhet– Throttling– Samtidighet(sproblematikk)– Persistens– Beregninger (LINQ)– Azure– Testing– Noen integrasjoner
Agenda
3
Casting
Sølve Heggem Azure & Web API
Rune RystadOveringeniør
Mark WestExecutive Producer
Amund Rønold JohnsenFrontend
Kristian Løken WilleFrontend
4
Om spillet
5
• Lag med 3-6 deltakere• får informasjon om poster i terrenget
– har ulik, fallende verdi– kan bli synlige (og forsvinne)– skal registreres for å få poeng
• Våpen: Bomber og feller• Dessuten
– Praktisk info blir sendt ut med meldinger– Deltakernes posisjoner kan rapporteres (og hentes)
Spillkonsept: Postjakt
6
7
Demo av spillet
8
9
10
11
12
13
14
15
16
18
• Unlimited Weapons• Black Hat Client
Bloopers
19
«Fellefest»
20
Black Hat Client
21
22
23
Arkitekturvalg
24
• Det skal være et felles arrangement for Java og .NET-miljøene. Det er derfor viktig at oppgaven kan løses med plattformuavhengig teknologi.
• Oppgaven skal være av teknisk art og involvere kode– CodeCamp– Det er en bonus om vi også kan få med oss ikke-
kodende personer.• Det bør være lett å komme igang, men det skal
også være en utfordring for deltakerne• Liten tid til utvikling. Hjem lørdag etter lønsj.
Rammer
25
• Flere runder med semifinale, finale• Midler for å hindre andre lag (EMP, virusbomb,
infisere poster)• «Fargelegge» soner• Holde posisjoner for mer score
• Posisjoner kan fakes• Unngå samtidighetsproblemer• Keep it simple
Konseptarbeid
26
27
Skille lesing og skriving
28
Hurtigmodell
29
• Skille lesing og skriving (les = feed)• Append Only• Throttling på API-kall• Ingen Lazy Loading
Mekanismer & Prisipper
30
• Start-slutt• Poster skjult til tid / Områder• Verdi på poster (faller)
Hovedmekanismer
31
Modell
32
Partisjonering
34
Partisjonering – the real story
Azure SQL Server
Azure Web App
Browser
35
36
Postregistrering - async
37
+ info via meldinger
38
Implementasjon og teknologi
39
• Kart• Polling• POST av meldinger• Feilhåndtering av HTTP Requests• Adaptivt UI• Mye funksjonalitet på en mobilskjerm…
Klientutvikling
40
Dokumentasjon i Swagger (via Swashbuckle)
41
• Dokumenter med XML-kommentarer• Build: Output XML-fil• SwaggerConfig.cs
Swagger setup
42
43
• Score• Poster
– Koordinat– Har registrert– Poengverdi (ev. hentet poeng)
• Ranking– Plassering– Poeng til neste foran og bak
• Våpenbeholdning
Gamestate for et lag
44
• Deltakere bruker to HTTP Headere– LagKode– DeltakerKode
• Scoreboard bruker en egen HTTP Header– ScoreboardSecret
• Implementert med ActionFilter
Sikkerhet
45
• Crazy Looping
• Tid siden siste request per bruker, url og Get/Post
• 400 Bad Request
• ActionFilter
Throttling
46
• To lag skal ikke kunne få «top score» på samme post
Samtidighet
47
• Holder siste posisjoner for lag i minne• Lagrer bare til DB for logging – hvis forflytning er
stor nok• Leser fra DB etter oppstart• «Streamprosessering» / Live aggregering
PosisjonService
48
• Entity Framework 6• Code First• Automatic Migrations
Persistens
49
• Add-Migration
• Update-Database
Entity Framework Migrations
50
• Google Spreadsheet• Google Maps• Via Xslx og KML
• EPPlus for les og skriv Xlsx• SharpKML for KML
Import / Export
51
• ASP.NET Web API og MVC side-by-side
Påmelding
52
53
• Gamestate• Utløp av gamestate
Kalkuleringer
54
Lagranking
55
56
• Tester hele stacken under web api’et (inkl. DB)• Transaksjonell ROLLBACK etter hver test• Trygghet• Fart• Refactoring
Tester
57
Transaksjon per test
58
Gamestate• NårEtLagIkkeHarRegistrertNoenPoster_SkalDeIkkeHaNoenPoeng• IngenPosterErFramITid_SkalIkkeKræsje• NårEttLagStemplerPåEnPost_SkalDeFåPoengIFeed• NårEttLagStemplerPåEnPost_OgRoterMedCasing_SkalDeLikevelFåPoengIFeed• NårEttLagStemplerPåEnPost_OgHarLuftFørOgEtterPostKoden_SkalDeLikevelFåPoengIFeed• NårEttLagStemplerPåEnPost_SkalDeIkkeMisteVåpen• NårEttLagStemplerPåEnPostSomIkkeErAktiv_SkalDeIkkeFåPoengIFeed• EnPostSomIkkeErAktiv_SkalIkkeVisesIFeed• NårEttLagStemplerToGangerPåSammePost_SkalDeBareFåPoengForFørsteStempling• NårEttLagStemplerSomAndreLagPåEnPost_SkalDeFåPoengBeregnetForStempling2• NårToLagStemplerOgHarSammePoengsum_SkalDeFåLikRangeringOgSisteLagSkalBliBakerst• LagSkalHaInitiellVåpenBeholdningIGamestate• NårEtLagBrukerBombe_SkalLagetFåPoengOgPostenBliUsynligIEtAntallMinutterSelvOmStateBlirRek
alkulert• NårEtLagBrukerFelle_SkalLagetFåPoengOgPostenForbliSynlig_VedNesteRegistreringSkalRegi
strerendeLagFåFratrekkAvPoeng_OgPostenSkalBliUsynligEnPeriode• GittAktivPostSomErSattOppMedFelle_NårLagetSomStemplerBrukerEtVåpenSkalVåpenetIkkeBliSatto
ppOgLagetIkkeFåFratrekkIVåpenbeholdningen• NårEtLagBrukerBombeOgNullstillerEtterPå_SkalLagetMistePoengOgFåTilbakeVåpen• NårEtLagBrukerOppFellen_SkalDenIkkeKunneRiggesIgjen (NY…)
59
Meldinger• NårEnMeldingPostes_SkalDenLagresIDatabasen
• NårEnMeldingPostes_SkalDenKunHentesUtViaPollingForPostetLag
• NårEnMeldingPostesTilAlleLag_SkalAlleLagFåDenUt
• NårDetErPostetMangeMeldinger_SkalBareSiste10HentesUtHvisEnIkkeSpørMedSekvensNummer
• NårDetErPostetMangeMeldinger_SkalEnKunneHenteAlleNyeMeldingerSidenEtSekvensNummer
• NårDetErPostetMeldinger_NårEnSpørMedSisteSekvensNummer_SkalEnIkkeFåNoeTilbake
60
Posisjoner• NårEnDeltakerPosterEnPosisjon_SkalPosisjonenLagresIDatabasen
• NårEnDeltakerPosterSammePosisjonToGanger_SkalPosisjonenLagresIDatabasenBareEnGang
• NårEnDeltakerStårIRoLenge_SkalPosisjonenLagresIDatabasenBareEnGang
• NårEnDeltakerFlytterSegMenRegistrererOfte_SkalPosisjonenLagresIDatabasenBareHvert10Sekund
• NårEnDeltakerPosterNyPosisjonToGangerMenForTettITid_SkalPosisjonenLagresIDatabasenBareEnGang
• NårEnDeltakerPosterNyPosisjonToGangerMedGodTidMellom_SkalPosisjonenLagresIDatabasenToGanger
• GittAtAlleDeltakereHarRegistertPosisjoner_NårEnHenterPosisjonerForLag_SkalBareSistePosisjonerForHvertLagReturneres
• GittAtAlleDeltakereHarRegistertPosisjoner_NårScoreboardHenterPosisjonerForAlleLag_SkalSistePosisjonerForDeltakerePåBeggeLagReturneres
• NårEnDeltakerPosterNyPosisjonToGangerMedGodTidMellom_SkalSistePosisjonReturneresViaService
• NårApplikasjonenRestartes_SkalSistePosisjonerHentesFraDatabasen
61
Scoreboard• GittMatch_VedOppstart_SkalScoreboardHaInitiellTilstand
• GittMatch_NårEnPostErSkjult_SkalPostenHaSynligFlaggSlåttAv
• GittMatch_NårEttLagStemplerPåEnPost_SkalDeFåPoengIFeed
62
• Alle data henger på match• Hver tests data er isolert per match• Bare unngå gjenbruk av poster, lag og deltakere
• Nyttig konsept i flere domener
Uten transaksjoner…
63
Test «Future»
64
• Deployment i Europe West• Variabler i overstyrte appsettings
Azure
65
66
67
68
69
• Fancy postregistrering (QR/Beacons)• Flere effekter
– Koalisjonsspesifikke– Roller på laget– Midlertidige effekter
• Achievements• Balansering av poeng og effekter• Enklere lag-/spilloppsett og regi (admin)• Augmented Reality
Muligheter - spill
70
• Async I/O• Løfte testene til å gå over HTTP (en match per
test)• Mer skalerbar arkitektur (for fun)• .NET Core• Notification i stedet for kontinuerlig polling
(SignalR/WebSockets/MQTT)
Muligheter - teknisk
71
• Introdusere køing• Event Hub• Web Jobs• Service Fabric Actors• Feeds som filer?
Azure Future
72
73
• https://utbrudd.bouvet.no/2015/11/30/bouvet-battle-royale-rematch/
• https://github.com/bouvet/BBR2015/
[email protected]@runerys
Les mer…