View RSS Feed

Christians GameDev Blog

Hur man utvecklar mjukvarolösningar som skalar.

Rate this Entry
Introduktion
Hejsan, mitt namn ar Christian Flodihn och jag tankte skriva ett antal artiklar hur man utvecklar skalbara losningar. Som ni marker sa saknar jag svenska tecken pa mitt tagentbord, detta beror pa att jag bor i skrivade stund i Dublin, dar jag jobbar for Demonware, ett foretag uppkopt av Activision/Blizzard for att ta hand om deras online-tjanster i spel.

Varfor vill man utveckla mjukvara som skalar?
Det kan exempelvis rora sig om ett login-system likande det i Minecraft, en hemsida som skall klara hog belastning, ett globalt poangtavelsystem (leaderboard) for ett spel, ett chat-system eller till och med ett MMO.

Behover man mjukvara som skalar?
Helt arligt ar svaret oftast nej, men det ar ju kul att utveckla sadan mjukvara. Om man som indie-utvecklare har gjort en spel man slappt pa android/iphone och far nagra downloads behover man knappast nagot supereffektivt poangtavelsystem, Att slanga upp en gammal Apache-server med en MySQL-databas och lagga skapa ett index for poangen skulle fungera alldeles utmarkt. Detta system skulle fungera sa lange man inte far hundratals forfragningar per sekund.

Sa denna artikel ar mer for entusiaster.

Ratt verktyg for jobbet
Det absolut viktigaste ar att valja ratt verktyg for jobbet. Det ar detta som dom flesta utvecklare missar. Det ligger i den manskliga naturen att hellre valja tekniker man redan kan for att losa ett problem.

I dom flesta fall ar det ratta verktygen programmeringsspraket Erlang, hur kan jag veta detta?
Svarat pa den fragan ar att Erlang ar det enda sprak som specialiserar sig pa att skriva skalbara server-losningar. Dom flesta andra sprak som Python, C/C++, Java ar "general-purpose" och forsoker vara bra pa att losa lite allt mojligt.

Ett bevis for detta ar att det nuvarande varldsrekordet for 1000 spelare samtidigt i ett FPS halls av ett losning baserad pa Erlang, du kan lasa mer om detta har:
http://muchdifferent.com/?page=game-...kk-pikkoserver

En vanligt rad jag ser att folk ger ar: Erlang ar gjort i C, allting du gor i Erlang kan du gora i C/C++.
Detta ar ioforsig sant, problemet ar ett det tar tid att utveckla och vad man gor att att uppfinna hjulet igen.

Sa exakt varfor ar Erlang bra for skalbara server-losningar?

Agent-baserad system med processer:
Erlangprogram ar uppbyggda av massa sma processer som gor lite arbeta var, till skillnad fran C++ och andra sprak som exempelvis har en main-funktion dar kod exekvereras rad for rad igenom hela programmet.

Meddelenden:
Processer i Erlang ar helt isolerade ifran varandra och kan endast kommunicera via meddelanden. Om process 1 vill ha data fran process 2 kan processes 1 inte bara ta datan, den maste skicka ett meddelande till process 2 och be om datan.
Fordelen med att skicka meddelande mellan processer ar processer ar helt okansliga vart i natverket dom ar. Om process 1 och process 2 ar pa tva olika dator i natverker spelar ingen roll, dom kommunicerar pa samma satt som dom gjort ifall dom var pa samma dator. Detta gor det latt att lata Erlangprogram koras pa flera datorer utan att behova andra programmets struktur.

Krascher:
Om en process kraschar sa paverkar det inte korningen av andra processer. Eftersom processer oftast gora endast lite arbete var, brukar krascher inte paverka systemets operabilitet speciellt mycket. I vissa fall vill du faktiskt att visa processer kraschar under vissa omstandigheter.

Ingen defensiv programmering:
Manga servers i olika sprak baddar in mycket av serverlogiken i try/catch/exceptions block, for att garantera ifall nagot gar fel, att server inte gar ner. Att gora detta ar valdigt farligt da det kan leda till servers som inte fungerar som dom ska, men visar inget tecken pa att nagot ar fel. Ofta sa bestar mycket av logiken av att kolla olika tillstand i programmet innan man gor nagot vilket doljer sjalva logiken.

I Erlang daremot, sa kodar man bara efter ratt scenario och ifall nagot skulle ga fel, ar det bara att lata processern krascha och felet rapporteras automatiskt av Erlangs log-system. Detta leder till serverlogik som ar mindre/lattare att lasa och servers som inte hamnar i ett daligt tillstand som ar svart att debugga.

Processer vs OS-tradar:
En erlangprocess tar ca 2kb minne, en OS-trad tar ca 1 MB. Erlang aktiverar bara processer som har nagot att gora medans operativsystem byter konstant mellan OS-tradar oavsett om dom har arbete att utfora eller ej.
Erlang har en trad-planerare som automatiskt fordelar processer over alla cores som finns tillganligt i dator. Att fordela arbete jamnt maste man gor sjalv med OS-trader (vilket ar i min mening det svaraste).

Inga variabler (som varierar):
Erlangs variabler ar konstanter, dvs att nar man val ger en variable ett varde kan man inte andra detta. Detta gor att det blir lite klumpigt ibland och kan skapar en del "overhead". Fordelen med detta ar att Erlang kan distribuera processer over flera CPU karnor utan att behova bry som om las (mutexes etc). En annan fordel ar att "race-conditions" ar omojligt att fa nar alla variabler ar endast lasbara.

OTP/Behaviours:
OTP ar ett bibiliotek i Erlang som later en skriva robusta program. OTP definerar ett antal "behaviours" vilket ar i stort sett samma sak som fardig komponent som hjalper dig att implementera en server, event-system eller statemachine etc.

Supervisors:
Du kan aven bygga upp ett trad av overvakningprocesser som overvakar servers och startar om dessa ifall dom kraschar (du kan aven lata overvakningsprocesser overvaka andra overvakningsprocesser och dar igenom bygga system som ar i stort sett nastan omojliga att ta ner p.g.a av buggar).

Nodes:
Ett Erlang program kors alltid i en sakallad Erlangnod. Nar du startar en nod sa starter aven en namnserver i bakgrunden i operativsystem. Denna namnserver gor det enkelt for noder att hitta varandra pa natverket. Detta underlattar for dig att bygga Erlangprogram som skalar ut till flera datorer pa natverket.

Bit-syntax:
Erlang snodde sin bit-syntax fran ett sprak som skapades endast for att hantera binar data. Det ar valdigt smidigt att hantera binar data vilket ar vanligt i server-sammanhang.
Exempel hur du avkoder ett TCP packet pa en rad kod.

<<SourcePort:16, DestinationPort:16, SequenceNumber:32, AckNumber:32, DataOffset:4, _Reserved:4, Flags:8, WindowSize:16, Checksum:16, UrgentPointer:16, Payload/binary>>

I detta exempel sa sparas dom forsta bitarna i variablen SourcePort, dom foljande 16 bitarna i DestinationPort och dom 32 bitarna efter det i SequenceNumber etc.

Funktionell kod:
Erlang ar ett funktionellt sprak, till skillnad fran objekt-orienterad. Objektorientering har fokus pa ateranvadning av kod men har fatt kritik for att komplexa system blir validgt svara att forsta om dom implementerats i OO.

I praktiken innebar det att Erlang ar uppbyggt av moduler, vilket ar samma som som en fil.
En modul kan ha flera privata eller publika funktioner.
Det finns inga klasser eller globala variabler i modulerna.

  • Det enda datan en funktion kan komma at ar data som den far via argument, eller skickat till sig via meddelanden.
  • All data man vill spara utanfor funktionen maste returneras av funktionen (eller skicka datan till en annan process for att spara den dar).


  • Har du exemplevis en server som maste du hela tiden skicka serverns tillstand i en variabel.


Nasta post:
I nasta post tankte jag att vi skulle borja implementera ett login system i Erlang.

Submit "Hur man utvecklar mjukvarolösningar som skalar." to Digg Submit "Hur man utvecklar mjukvarolösningar som skalar." to del.icio.us Submit "Hur man utvecklar mjukvarolösningar som skalar." to StumbleUpon Submit "Hur man utvecklar mjukvarolösningar som skalar." to Google

Taggar: erlang, skalbar, tutorial Lägg till/redigera taggar
Kategorier
Erlang

Comments