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

Preview:

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/

rune.rystad@bouvet.no@runerys

Les mer…

Recommended