72
Et sanntids, utendørs lagspill med .NET og Azure NNUG 15. november 2016 Rune Rystad 1

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

Embed Size (px)

Citation preview

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

Et sanntids, utendørs lagspill med .NET og AzureNNUG 15. november 2016 Rune Rystad

1

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

• Om spillet• Arkitektur/design• Implementasjon og teknologi

– Klientutvikling– Sikkerhet– Throttling– Samtidighet(sproblematikk)– Persistens– Beregninger (LINQ)– Azure– Testing– Noen integrasjoner

Agenda

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

3

Casting

Sølve Heggem Azure & Web API

Rune RystadOveringeniør

Mark WestExecutive Producer

Amund Rønold JohnsenFrontend

Kristian Løken WilleFrontend

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

4

Om spillet

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

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

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

6

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

7

Demo av spillet

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

8

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

9

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

10

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

11

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

12

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

13

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

14

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

15

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

16

Page 17: Et sanntids, utendørs lagspill med .NET og Azure
Page 18: Et sanntids, utendørs lagspill med .NET og Azure

18

• Unlimited Weapons• Black Hat Client

Bloopers

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

19

«Fellefest»

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

20

Black Hat Client

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

21

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

22

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

23

Arkitekturvalg

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

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

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

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

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

26

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

27

Skille lesing og skriving

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

28

Hurtigmodell

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

29

• Skille lesing og skriving (les = feed)• Append Only• Throttling på API-kall• Ingen Lazy Loading

Mekanismer & Prisipper

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

30

• Start-slutt• Poster skjult til tid / Områder• Verdi på poster (faller)

Hovedmekanismer

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

31

Modell

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

32

Partisjonering

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

34

Partisjonering – the real story

Azure SQL Server

Azure Web App

Browser

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

35

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

36

Postregistrering - async

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

37

+ info via meldinger

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

38

Implementasjon og teknologi

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

39

• Kart• Polling• POST av meldinger• Feilhåndtering av HTTP Requests• Adaptivt UI• Mye funksjonalitet på en mobilskjerm…

Klientutvikling

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

40

Dokumentasjon i Swagger (via Swashbuckle)

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

41

• Dokumenter med XML-kommentarer• Build: Output XML-fil• SwaggerConfig.cs

Swagger setup

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

42

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

43

• Score• Poster

– Koordinat– Har registrert– Poengverdi (ev. hentet poeng)

• Ranking– Plassering– Poeng til neste foran og bak

• Våpenbeholdning

Gamestate for et lag

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

44

• Deltakere bruker to HTTP Headere– LagKode– DeltakerKode

• Scoreboard bruker en egen HTTP Header– ScoreboardSecret

• Implementert med ActionFilter

Sikkerhet

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

45

• Crazy Looping

• Tid siden siste request per bruker, url og Get/Post

• 400 Bad Request

• ActionFilter

Throttling

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

46

• To lag skal ikke kunne få «top score» på samme post

Samtidighet

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

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

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

48

• Entity Framework 6• Code First• Automatic Migrations

Persistens

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

49

• Add-Migration

• Update-Database

Entity Framework Migrations

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

50

• Google Spreadsheet• Google Maps• Via Xslx og KML

• EPPlus for les og skriv Xlsx• SharpKML for KML

Import / Export

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

51

• ASP.NET Web API og MVC side-by-side

Påmelding

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

52

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

53

• Gamestate• Utløp av gamestate

Kalkuleringer

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

54

Lagranking

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

55

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

56

• Tester hele stacken under web api’et (inkl. DB)• Transaksjonell ROLLBACK etter hver test• Trygghet• Fart• Refactoring

Tester

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

57

Transaksjon per test

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

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…)

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

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

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

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

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

61

Scoreboard• GittMatch_VedOppstart_SkalScoreboardHaInitiellTilstand

• GittMatch_NårEnPostErSkjult_SkalPostenHaSynligFlaggSlåttAv

• GittMatch_NårEttLagStemplerPåEnPost_SkalDeFåPoengIFeed

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

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…

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

63

Test «Future»

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

64

• Deployment i Europe West• Variabler i overstyrte appsettings

Azure

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

65

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

66

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

67

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

68

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

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

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

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

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

71

• Introdusere køing• Event Hub• Web Jobs• Service Fabric Actors• Feeds som filer?

Azure Future

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

72

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

73

• https://utbrudd.bouvet.no/2015/11/30/bouvet-battle-royale-rematch/

• https://github.com/bouvet/BBR2015/

[email protected]@runerys

Les mer…