PHZ:n Viljami Louhio: Rust taustajärjestelmien käytössä

Rust-ohjelmointikieli

Rust-ohjelmointikieli on matalan tason kieli, joka sopii lähes kaikkeen. PHZ:n Viljami Louhio kertoo, miksi Rustia kannattaisi käyttää erityisesti taustajärjestelmissä.

Usein taustajärjestelmissä käytetään korkean tason kieliä kuten Node.js, Python tai PHP. Korkean tason kielet ovat helppokäyttöisiä, mutta niillä on hintansa: muistinkäyttö lisääntyy ja ajoajat pitenevät.

Työkalujen kehittely esimerkiksi C- tai C++-kielillä voi taas olla liian työlästä ja aikaa vievää. Lisäksi pitkät ajot saattavat helposti kaatua tuntemattomaan virheeseen mahdollisten muistivuotojen tai koodivirheiden takia. Vaikka smart pointerit helpottavat kielten muistinkäytön ongelmia, osa ongelmista jää helposti haavin ulkopuolelle.

Aikaisemmin ei oikeastaan ole ollut matalan tason kieltä, jolla voisi nopeasti kehittää työkaluja raskaita ajoja varten. Nykyään on kuitenkin mahdollisuus käyttää Rust-ohjelmointikieltä, joka tuo mukanaan ajomukavuutta ja muita lyömättömiä etuja.

Rust vähentää muistivuotoja ja koodausvirheitä

Rust on matalan tason järjestelmäohjelmointikieli kuten C ja C++, ja se kilpailee tehokkuudessa niiden rinnalla. Vaikka C- ja C++-kielet ovat varmasti vielä tehokkaampia vähänkin isommissa kokonaisuuksissa, alkaa muistivuotojen ja virheiden etsiminen olla todella haastavaa.

Rustissa muistivuotojen mahdollisuus on pienempi. Sovelluksen kääntämisvaiheessa Rust tarkistaa, että muistia voi muuttaa vain yksi prosessi kerrallaan ja että muisti vapautuu heti, kun sitä ei enää tarvita.

Myös koodausvirheiden mahdollisuus on Rustissa vähäisempi, koska käännöksen tarkistus on todella pikkutarkka. Virheilmoitus kertoo selkeästi, missä kohdassa virhe on ja usein jopa keinon sen korjaamiseen. Kehittäjän on kuitenkin myös itse pidettävä huoli sellaisista rakenteista, joissa muistivuotoa voi tapahtua sovelluksen muiden sääntöjen puitteissa.

Lisäominaisuutena Rustissa on unsafe-taikasana, jolla käyttäjä voi itse ottaa ohjat muistinkäytöstä ja säännöistä. Tällöin kehittäjän on itse taattava, että unsafe-osion sisällä ei tapahdu mitään, mikä voisi aiheuttaa virheen ajon aikana.

Unsafe-lohkoa käytetään yleensä silloin, kun koodissa käsitellään ulkoisia kutsuja tai luetaan tietoa laitteista, joiden sisäistä tilaa ei voi tietää etukäteen.

Kielenä Rust sopii moneen tarkoitukseen

Tausta-ajojen lisäksi Rustia voi käyttää esimerkiksi web-selaimessa WebAssembly-rajapinnan kautta. WebAssembly ei kilpaile JavaScriptin tai TypeScriptin kanssa, mutta se tarjoaa rajapinnan, jossa voidaan ajaa raskaampi prosessi, kuten kuvamanipulointia tai koordinaattien käsittelyä.

Kun WebAssembly-toteutuksessa hyödynnetään Rustia, saadaan selaimen resurssit käyttöön tehokkaasti.

AWS-ympäristössä Rust-koodin voi kääntää suoraan Lambdaksi käytettäväksi, mihin se soveltuu hyvin nopeutensa ja muistitehokkuutensa ansiosta. Kehitykset ja testit voi helposti tehdä eri koneella, ja vasta kun tuote on valmis, se kiinnitetään AWS:n Lambda-rajapintaan.

Foreign Function Interfacen eli FFI:n kautta Rustia voi käyttää osana muita FFI:tä tukevia kieliä, kuten C++, Python ja Go. Rustin kääntäjä ei tietenkään pysty takaamaan ulkoisten funktioiden toimintaa, joten ulospäin viittaavat kutsut kuuluvat aina unsafe-lohkon sisälle.

Tehokkuutensa puolesta Rust soveltuisi hyvin myös pelialalle, mutta pelikehityskirjastot ovat vielä kypsymisvaiheessa. Monet niiden ominaisuuksien rajapinnoista tulevat vielä muuttumaan, mutta voisi olettaa, että pian alkaa jo ilmestyä enemmän Rustilla tehtyjä kaupallisia pelejä.

Matalan tason kielenä Rust soveltuu myös monien sulautettujen järjestelmien ja käyttöjärjestelmien koodaamiseen.

Taustajärjestelmä 10 kertaa nopeampi Rust-kielellä

Halusin testata Rustin tehoja käytännössä, ja käytin testikohteena PHZ Full Stackin asiakkaan Oikotie Asuntojen järjestelmää. Käänsin osan laskurivien summaavasta ja jaottelevasta PHP-toteutuksesta lähes 1:1-kopioksi Rust-kielellä.

Vaikka toteutus ei suorana loogisena kopiona ollut Rust-kielelle optimoitua, testin luomisen tai ajon aikana ei tullut ongelmia vastaan. Tarkistin tuloksen vertaamalla, että molempien ajojen lopputulos oli aina täsmälleen sama eri lähdeaineistojen kanssa.

Muistinkäyttö- ja ajoaikatilastot olivat vakuuttavat: taustajärjestelmä oli 10 kertaa nopeampi toteuttaa Rustilla. Siinä missä PHP käytti muistia yhdellä ajolla 22 megatavua, Rust vei vain 3 megatavua.

Ajansäästön lisäksi säästyy rahaa

Matalan tason kielen käyttäminen taustajärjestelmissä säästää paitsi aikaa myös rahaa. Suosittelisin Rustia harkittavaksi etenkin yrityksille, joissa tehdään toistuvia isoja eräajoja.

Käyttämällä Rustia taustajärjestelmissä yritykset voisivat säästää merkittävästi myös pilvipalveluiden käytössä ja koneiden tehoissa.

Rustiin on myös suhteellisen helppo kääntää monia kirjastoja, joilla ominaisuudet voi tuoda REST-rajapintaan. Tällöin niissä luotu sovellus toimii paikallisena palveluna.

Rust on vielä nuori kieli ja sen osaajat harvassa

Kaikista Rustin tehokkuuksista huolimatta sen soveltaminen ei välttämättä ole ajankohtaista ihan kaikkeen. Kieli on vielä nuori verrattuna muihin vakiintuneihin kieliin, ja sen ekosysteemi ei kaikilla osa-alueilla ole täysin kypsynyt. Lisäksi Rust-kielen osaajia on vielä harvassa, mutta kiinnostus kieleen on jatkuvassa kasvussa.

Yleensä projekteissa kannattaa suosia olemassa olevaa infrastruktuuria eikä kuluttaa resursseja kirjoittamalla isoja osia koodista uudelleen.

On kuitenkin hyvä pitää mielessä, että matalan tason kielen tehokkuus on käytettävissä. Sitä voi hyödyntää esimerkiksi yksittäisinä CLI-sovelluksina tai korvaamalla jonkin paljon resursseja vaativan prosessin.

Lue lisää: Autosave-toiminnon koodaaminen työkaluina React ja Redux


PHZ:n Viljami Louhio: “Backend-kehittäminen on oma juttuni”

Aloitin koodaamisen opiskellen ensin itse C- ja C++-kieliä. Ammattikorkeakoulussa opiskelin tietotekniikkaa Java-pohjaisessa koulutusohjelmassa, ja koulun kurssien innostamana siirryin työelämään koodaamaan etenkin PHP:lla.

Monia koodaajan urani aikana kehittämiäni palveluita yhdistää reaaliaikaisuus: tuoreimman tiedon esittäminen asiakkaalle on ollut tärkeintä. Olen ollut kehittämässä esimerkiksi asuntojen myynti- ja vuokrausportaalia, suomalaista nettihuutokauppa-alustaa sekä Yhdysvalloissa toimivaa pennihuutokauppasovellusta. PHZ Full Stackilla aloitin vuonna 2014.

Backend-kehittäminen on ehdottomasti oma juttuni. Kehittäjänä pyrin mahdollisuuksien mukaan parantamaan suorituskykyä tai vasteaikoja; yritän aina löytää keinoja, joilla prosessia saadaan nopeutettua.

Olen tehnyt valtaosan työurastani backend-kehitystä PHP-kielellä. Rust-kieltä olen seurannut pari vuotta ennen kuin kärpänen puraisi, ja nyt olen omalla ajallani keskittynyt kaikkiin sen tuomiin mahdollisuuksiin. Muita vahvoja ohjelmointikieliäni ovat muun muassa JavaScript ja SQL.


Meillä PHZ:lla on jatkuvasti työpaikkoja auki kokeneille koodaajille. Katso kaikki avoimet työpaikat täältä