utvikling

Gikk for tregt: Derfor bytter Discord fra Go til Rust

Discord, som brukes av millioner av gamere, skifter ut deler av sin infrastruktur kodet i Go med nye tjenester kodet i Rust. Les hvorfor.

Illustrasjonsfoto.
Illustrasjonsfoto.

Discord-appen er med omkring 250 millioner brukere en av de mest populære meldingsplattformene, og den har særlig funnet innpass hos gamere.

Mye av den bakenforliggende infrastrukturen er kodet i det relativt nye programmeringsspråket Go fra 2009, som er det programmeringsspråket flest utviklere ønsker å lære.

Nylig ble imidlertid noen av de bakenforliggende Go-tjenestene for Discord erstattet med nye tjenester skrevet i et annet forholdsvis nytt programmeringsspråk, Rust – som er fra 2010.

Automatisk minne-opprydding med forsinkelser

Det er den ansvarlige for Discords infrastruktur, Jesse Howarth, som i et detaljert blogginnlegg forteller om årsaken til at de skiftet ut Go med Rust.

Go

Go er utviklet av Google. Blant annet utvikleren av Unix, Ken Thompson, var med på å definere programmeringsspråket, som blant annet har språkkonstruksjoner for å håndtere samtidighet.

Den første offisielle versjonen ble frigitt i november 2009.

Kilde: golang.org

Go bruker i likhet med Java en «garbage collector» til å fortløpende rydde opp i minnet et program bruker, og det kan skape forsinkelser fordi prosessoren skal bruke tid på å lete gjennom minnet på jakt etter datastrukturer som ikke lenger er i bruk.

Opprydding hvert annet minutt

Rust

Rust startet som et personlig prosjekt for Mozilla-medarbeideren Graydon Hoare i 2006.

I 2009 begynte Mozilla å sponse utviklingen av språket, og i 2010 annonserte Mozilla det nye språket, som blant annet også har hatt Javascript-utvikleren Brendan Eich med som fødselshjelper.

Kilde: www.rust-lang.org

I Discord er det en tjeneste, Read States, som holder et øye med hvilke beskjeder i hvilke kanaler en bruker har lest. Tjenesten blir brukt hver eneste gang en bruker logger på Discord, hver gang det sendes en beskjed, og hver gang det leses en beskjed.

Dette er derfor en tjeneste som brukes veldig ofte, med millioner av brukere og meldinger, og derfor må ytelsen være god. Discord-utviklerne hadde da også vært veldig omhyggelige med å skrive optimalisert Go-kode, men likevel kunne de konstatere at CPU-belastningen økte kraftig hvert annet minutt, og det var også i disse periodene mer forsinkelse (latency).

Dette skyldes at Gos garbage collector som minimum aktiveres annenhvert minutt, uansett om det løpende har blitt allokert og deallokert mye eller lite minne. Utviklerne forsøkte å optimalisere minneoppryddingen på ulike måter, men det lyktes ikke å unngå irriterende periodiske forsinkelser.

Dansk bakgrunn for Rusts minnehåndtering

Utviklerne tok derfor en kikk på Rust, som de senere årene har blitt kåret som det programmeringsspråket flest utviklere elsker, ifølge Stackoverflows årlige undersøkelse. I tillegg har også Microsoft begynt å se nærmere på språket som fremtidens systemprogrammeringsspråk.

Rust har en annen type minnehåndtering enn Go, og dette er blant annet inspirert av Mads Tofte, tidligere rektor ved ITU (IT-Universitetet i København), sitt arbeid med minnehåndtering.

– Ett av de sentrale konsepter i Rust kommer fra Mads Tofte. Region inference, som er programanalyse og minneadministrasjon, utviklet han sammen med Jean-Pierre Talpin, har Peter Sestoft, professor på IT-Universitetet, tidligere sagt til Version2.

Rust bruker konseptet minne-eierskap, hvor det holdes styr på hvem som kan lese og skrive til minnet, slik at minnet kan frigis øyeblikkelig når det ikke lenger brukes av et program. Det gjør bruk av en garbage collector overflødig, og gjorde at Rust var bedre egnet enn Go til å sikre en konstant god ytelse for Read States-tjenesten.

Jesse Horwarth skriver at det ikke betyr at man skal kaste seg hodestups ut i å skrive om alt til Rust, men i dette tilfellet ga det mening for Discord-utviklerne.

Saken ble først publisert på danske Version2/Ingeniøren, og gjøres tilgjengelig på norsk gjennom vår samarbeidsavtale med Teknologiens mediehus/Ingeniøren.

Powered by Labrador CMS