SlideShare uma empresa Scribd logo
1 de 72
Et sanntids, utendørs lagspill
med .NET og Azure
NNUG 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 Rystad
Overingeniør
Mark West
Executive Producer
Amund Rønold Johnsen
Frontend
Kristian Løken Wille
Frontend
4
Om spillet
• 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)
5
Spillkonsept: Postjakt
6
7
Demo av spillet
8
9
10
11
12
13
14
15
16
• Unlimited Weapons
• Black Hat Client
18
Bloopers
19
«Fellefest»
20
Black Hat Client
21
22
23
Arkitekturvalg
• 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.
24
Rammer
• 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
25
Konseptarbeid
26
27
Skille lesing og skriving
28
Hurtigmodell
• Skille lesing og skriving (les = feed)
• Append Only
• Throttling på API-kall
• Ingen Lazy Loading
29
Mekanismer & Prisipper
• Start-slutt
• Poster skjult til tid / Områder
• Verdi på poster (faller)
30
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
• Kart
• Polling
• POST av meldinger
• Feilhåndtering av HTTP Requests
• Adaptivt UI
• Mye funksjonalitet på en mobilskjerm…
39
Klientutvikling
40
Dokumentasjon i Swagger
(via Swashbuckle)
• Dokumenter med XML-kommentarer
• Build: Output XML-fil
• SwaggerConfig.cs
41
Swagger setup
42
• Score
• Poster
– Koordinat
– Har registrert
– Poengverdi (ev. hentet poeng)
• Ranking
– Plassering
– Poeng til neste foran og bak
• Våpenbeholdning
43
Gamestate for et lag
• Deltakere bruker to HTTP Headere
– LagKode
– DeltakerKode
• Scoreboard bruker en egen HTTP Header
– ScoreboardSecret
• Implementert med ActionFilter
44
Sikkerhet
• Crazy Looping
• Tid siden siste request per bruker, url og Get/Post
• 400 Bad Request
• ActionFilter
45
Throttling
• To lag skal ikke kunne få «top score» på samme
post
46
Samtidighet
• 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
47
PosisjonService
• Entity Framework 6
• Code First
• Automatic Migrations
48
Persistens
• Add-Migration
• Update-Database
49
Entity Framework Migrations
• Google Spreadsheet
• Google Maps
• Via Xslx og KML
• EPPlus for les og skriv Xlsx
• SharpKML for KML
50
Import / Export
• ASP.NET Web API og MVC side-by-side
51
Påmelding
52
• Gamestate
• Utløp av gamestate
53
Kalkuleringer
54
Lagranking
55
• Tester hele stacken under web api’et (inkl. DB)
• Transaksjonell ROLLBACK etter hver test
• Trygghet
• Fart
• Refactoring
56
Tester
57
Transaksjon per test
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åPoengOgPostenBliUsynligIEtAntallMinutterSelvOmStateBlirRekalk
ulert
• NårEtLagBrukerFelle_SkalLagetFåPoengOgPostenForbliSynlig_VedNesteRegistreringSkalRegist
rerendeLagFåFratrekkAvPoeng_OgPostenSkalBliUsynligEnPeriode
• GittAktivPostSomErSattOppMedFelle_NårLagetSomStemplerBrukerEtVåpenSkalVåpenetIkkeBliSattopp
OgLagetIkkeFåFratrekkIVåpenbeholdningen
• NårEtLagBrukerBombeOgNullstillerEtterPå_SkalLagetMistePoengOgFåTilbakeVåpen
• NårEtLagBrukerOppFellen_SkalDenIkkeKunneRiggesIgjen (NY…)
58
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
59
Posisjoner
• NårEnDeltakerPosterEnPosisjon_SkalPosisjonenLagresIDatabasen
• NårEnDeltakerPosterSammePosisjonToGanger_SkalPosisjonenLagresIDatabasenBareEnGang
• NårEnDeltakerStårIRoLenge_SkalPosisjonenLagresIDatabasenBareEnGang
• NårEnDeltakerFlytterSegMenRegistrererOfte_SkalPosisjonenLagresIDatabasenBareHvert10Sekund
• NårEnDeltakerPosterNyPosisjonToGangerMenForTettITid_SkalPosisjonenLagresIDatabasenBareEnGa
ng
• NårEnDeltakerPosterNyPosisjonToGangerMedGodTidMellom_SkalPosisjonenLagresIDatabasenToGan
ger
• GittAtAlleDeltakereHarRegistertPosisjoner_NårEnHenterPosisjonerForLag_SkalBareSistePosisjonerFor
HvertLagReturneres
• GittAtAlleDeltakereHarRegistertPosisjoner_NårScoreboardHenterPosisjonerForAlleLag_SkalSistePosisj
onerForDeltakerePåBeggeLagReturneres
• NårEnDeltakerPosterNyPosisjonToGangerMedGodTidMellom_SkalSistePosisjonReturneresViaService
• NårApplikasjonenRestartes_SkalSistePosisjonerHentesFraDatabasen
60
Scoreboard
• GittMatch_VedOppstart_SkalScoreboardHaInitiellTilstand
• GittMatch_NårEnPostErSkjult_SkalPostenHaSynligFlaggSlåttAv
• GittMatch_NårEttLagStemplerPåEnPost_SkalDeFåPoengIFeed
61
• 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
62
Uten transaksjoner…
63
Test «Future»
• Deployment i Europe West
• Variabler i overstyrte appsettings
64
Azure
65
66
67
68
• 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
69
Muligheter - spill
• 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)
70
Muligheter - teknisk
• Introdusere køing
• Event Hub
• Web Jobs
• Service Fabric Actors
• Feeds som filer?
71
Azure Future
72
• https://utbrudd.bouvet.no/2015/11/30/bouvet-battle-
royale-rematch/
• https://github.com/bouvet/BBR2015/
rune.rystad@bouvet.no
@runerys
73
Les mer…

Mais conteúdo relacionado

Semelhante a Et sanntids, utendørs lagspill med .NET og Azure

BK2011 Python i arc gis 10
BK2011 Python i arc gis 10BK2011 Python i arc gis 10
BK2011 Python i arc gis 10
Geodata AS
 
Smidig data på stortinget
Smidig data på stortingetSmidig data på stortinget
Smidig data på stortinget
mumitrollet72
 
GoOpen 2010: Håvard Haug Hanssen
GoOpen 2010: Håvard Haug HanssenGoOpen 2010: Håvard Haug Hanssen
GoOpen 2010: Håvard Haug Hanssen
Friprogsenteret
 
The Client Strikes Back
The Client Strikes BackThe Client Strikes Back
The Client Strikes Back
Magnus Green
 
20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar
Sturla Grelland
 
Introduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformenIntroduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformen
Geodata AS
 

Semelhante a Et sanntids, utendørs lagspill med .NET og Azure (20)

Cassandra intro
Cassandra introCassandra intro
Cassandra intro
 
BK2015 Kom i gang med pythonskritping
BK2015 Kom i gang med pythonskritpingBK2015 Kom i gang med pythonskritping
BK2015 Kom i gang med pythonskritping
 
BK2011 Python i arc gis 10
BK2011 Python i arc gis 10BK2011 Python i arc gis 10
BK2011 Python i arc gis 10
 
Smidig data på stortinget
Smidig data på stortingetSmidig data på stortinget
Smidig data på stortinget
 
GoOpen 2010: Håvard Haug Hanssen
GoOpen 2010: Håvard Haug HanssenGoOpen 2010: Håvard Haug Hanssen
GoOpen 2010: Håvard Haug Hanssen
 
Utvikle applikasjoner og funksjoner med ArcGIS - BK2016
Utvikle applikasjoner og funksjoner med ArcGIS - BK2016Utvikle applikasjoner og funksjoner med ArcGIS - BK2016
Utvikle applikasjoner og funksjoner med ArcGIS - BK2016
 
The Client Strikes Back
The Client Strikes BackThe Client Strikes Back
The Client Strikes Back
 
20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar20130212 firstpoint citrix seminar 12 februar
20130212 firstpoint citrix seminar 12 februar
 
Effektivisering av kartproduksjon - BK2016
Effektivisering av kartproduksjon - BK2016Effektivisering av kartproduksjon - BK2016
Effektivisering av kartproduksjon - BK2016
 
AWS på kartet
AWS på kartetAWS på kartet
AWS på kartet
 
PRADS presentation (in Norwegian) @ University of Oslo by Ebf0 and kwy
PRADS presentation (in Norwegian) @ University of Oslo by Ebf0 and kwyPRADS presentation (in Norwegian) @ University of Oslo by Ebf0 and kwy
PRADS presentation (in Norwegian) @ University of Oslo by Ebf0 and kwy
 
ArcGIS for Desktop og veien videre - Esri norsk BK 2014
ArcGIS for Desktop og veien videre - Esri norsk BK 2014ArcGIS for Desktop og veien videre - Esri norsk BK 2014
ArcGIS for Desktop og veien videre - Esri norsk BK 2014
 
Mellom bedriftens nettverk og skyen
Mellom bedriftens nettverk og skyenMellom bedriftens nettverk og skyen
Mellom bedriftens nettverk og skyen
 
20140128 Firstpoint seminar - Tid For Oppgradering
20140128   Firstpoint seminar - Tid For Oppgradering20140128   Firstpoint seminar - Tid For Oppgradering
20140128 Firstpoint seminar - Tid For Oppgradering
 
Kryssplatform mobilutvikling
Kryssplatform mobilutviklingKryssplatform mobilutvikling
Kryssplatform mobilutvikling
 
KiCad 7 Workshop
KiCad 7 WorkshopKiCad 7 Workshop
KiCad 7 Workshop
 
Geografiske analyser i ArcGIS - Esri norsk BK 2014
Geografiske analyser i ArcGIS - Esri norsk BK 2014Geografiske analyser i ArcGIS - Esri norsk BK 2014
Geografiske analyser i ArcGIS - Esri norsk BK 2014
 
Bli kjent med PostgreSQL!
Bli kjent med PostgreSQL!Bli kjent med PostgreSQL!
Bli kjent med PostgreSQL!
 
Hele butikken i skyen
Hele butikken i skyenHele butikken i skyen
Hele butikken i skyen
 
Introduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformenIntroduksjon til python skriping i arc gis plattformen
Introduksjon til python skriping i arc gis plattformen
 

Et sanntids, utendørs lagspill med .NET og Azure

Notas do Editor

  1. Hei, jeg heter Rune Rystad og jobber i Bouvet Hvor mange her er det som spiller Pokemon Go? Da vet i hvert fall dere hva et sanntids, utendørs dataspill kan gå ut på. Det har blitt tradisjon i Bouvet at alle utviklerne reiser bort ei helg i året for å programmere og være sosiale. Det er også et konkurransekonsept (selvsagt). Jeg skal fortelle om fjorårets opplegg – som var et spillkonsept.
  2. Bruker en del tid på å vise og forklare konseptet, ellers er det vanskelig å forstå videre valg som er gjort
  3. Før noen beskylder meg for å ta æren for hele arrangementet alene: Amund Rønold Johnsen: Frontend ekspert Kristian Løken Wille - Frontend Sølve Heggem (Sandvika) Mark West: Tilrettelegger Rune Rystad: «overingeniør» – gjør «overengineering» Pluss mye hjelp fra Magnus Green og Erik Sogge rundt praktiske elementer.
  4. https://raw.githubusercontent.com/bouvet/BBR2015/master/replay/bbr2015.kml Oscarsborg, 6. - 7. november 2015 Lag: 5 Java + 3 Microsoft á 4 personer Code Camp Konsept: Postjakt Poster hadde ulik verdi og dukket opp underveis For å få poeng, skulle lagene utvikle en klient mot et forhåndsdefinert spill-API hvor postene skulle registreres Ellers: Ingen regler
  5. Ny database Oppsett i Google Spreadsheet Poster i Google Maps Postutsetting med telefon (Safari) Påmelding av to spillere
  6. Scoreboardet. Elementer: Resultatliste, stilling Java vs Microsoft, MVP-liste Kart: Poster (grønn = aktiv, rød = sprengt/midlertidig skjult, blå = ikke aktiv ennå). Prikker: Spillere med lagfarge Meldinger: Hendelser i spillet (fritekst) AngularJS som frontend-rammeverk Bootstrap for layout jQuery (du vet) Leaflet for kartet
  7. Deltakerne tok båt fra Oslo og fikk oppgaven utdelt på kaia
  8. Postregistrering
  9. Innsats
  10. En løsning
  11. En annen løsning
  12. Lo-tech: CURL…
  13. Gjenskapt posisjonslogg i Google Earth (midtveis)
  14. Flere runder/heat: Men vi kan ikke gjenbruke poster (da melder folk det bare inn på nytt) Dessuten vil vi bruke minst mulig tid til «overhead» med å starte på nytt. Våpen var tidlig med i diskusjonen «Fargelegge soner» krever polygoner + at en må stole på posisjoner. Dvs. vi kunne hatt en post per område, men vi tror det hadde blitt forvirrende. Holde posisjoner for mer score: posisjoner kan fakes. Dessuten ønsket vi å unngå en «event loop» som skulle gå på serveren og «
  15. Notater fra 18. august kl 0859. Kom tidlig før møte og grublet gjennom et konsept. Konseptnotater, datamodell, noen regler, dataflyt, sekvensdiagram
  16. Notater fra 18. august kl 0859. Kom tidlig før møte og grublet gjennom et konsept. Konseptnotater, datamodell, noen regler, dataflyt, sekvensdiagram
  17. Notater fra 18. august kl 0859. Kom tidlig før møte og grublet gjennom et konsept. Konseptnotater, datamodell, noen regler, dataflyt, sekvensdiagram
  18. Modellen har et par feil ift. «append only» PostIMatch skulle aldri hatt noen PoengIndex. Den kan en finne ut fra å telle postregistreringer. Våpen manipulerer på SynligFra-tidspunkt. Det skaper også mulighet for samtidighetstull. Kunne vært modellert som egen PostSynlighet utenfor posten og som en må lese nyeste instans av for en post. Dessuten ble det ikke nødvendig å gjenbruke poster mellom heat, så post kunne vært merget inn i PostIMatch. Det er nok best om de er private uansett.
  19. Separere funksjonalitet så mye som mulig. Meldinger er bare kommunikasjon internt i et lag: post melding og hent melding til ditt lag Posisjoner er bare for å se hvor folk er Game: Delt i to med registrering av poster, og uthenting av tilstand.
  20. Separere funksjonalitet så mye som mulig. Meldinger er bare kommunikasjon internt i et lag: post melding og hent melding til ditt lag Posisjoner er bare for å se hvor folk er Game: Delt i to med registrering av poster, og uthenting av tilstand.
  21. Postman til API-arbeid Brukte det også til ulike admin-funksjoner (se nede til venstre)
  22. Jukser med lock
  23. Arkitektur: Innkommende køer for alle events: meldinger, posisjoner, postregistreringer Dokumenter for gamestate scoreboardstate (samtidighetskontroll: hver match = consumer) Posisjoner: Cache Meldinger: Lettvektslagring (table storage, kommer an på mulighet for spørring) Async I/O (ikke så vrient) Testing over HTTP Siden da ikke lenger kan simulere tid, må en ha mulighet for å skru ned intervaller Hver test må isoleres –> 1 test = 1 match Dvs at meldinger og posisjoner bør være match-spesifikke, men det burde de nok vært uansett
  24. Før vi starter: Hvem var med på Oscarsborg og/eller har lest innlegget om BBR på utbrudd-bloggen vår?