Rust als webplatform?!

Wouter
Embedded software consultant
Rust als webplatform?!
Wat is over 5 jaar het winnende open source webplatform? Inmiddels begint PHP - ondanks PHP7 - zijn ouderdom te tonen. Alternatieven als NodeJS zijn wel werkbaar, maar in lang niet alle scenario’s geschikt. We vertellen je graag waarom wij denken dat Rust de nieuwe speler kan worden voor high-performance applicaties op het web.

Ja, PHP is oud: het barst van de legacy code, de snelheid laat te wensen over, en er is eigenlijk nooit sprake geweest van een net ontwerp van de taal [1]. Wij gebruiken PHP - d.w.z. het backend framework Symfony - omdat het ecosysteem, bestaande uit de tooling en beschikbare open source bundles, inmiddels heel volwassen is. Wil je snel een goed schaalbare web app bouwen met open source technieken? Dan is PHP met Symfony momenteel nog steeds The Way To Go. Kijken we verder in de toekomst en nemen we de steeds hogere eisen aan security en performance mee, dan is het duidelijk tijd voor ons om op zoek te gaan naar een moderner, veiliger en sneller alternatief voor PHP/Symfony.

Waarom geen Node.js?

Javascript is booming. Nieuwe open source projecten rondom het Javascript-platform schieten als paddenstoelen uit de grond. Helaas wordt Node.js veelal geplaagd door vergelijkbare problemen als PHP. Het is óók heel traag. De tooling rondom Javascript is in elkaar gebeund [2]. En ook het taalontwerp is langzaamaan gegroeid, wat de taal niet altijd even logisch maakt [3]. Browsers hebben dan ook moeite om deze ontwikkelingen bij te houden [4]. Nog meer dan bij PHP is het lastig om correcte code in Javascript te schrijven. De opkomst van (gecompileerde) talen voor type annotaties in Javascript [5] [6] helpen hier een beetje bij. Deze annotaties geven echter geen feitelijke garanties wanneer je de code draait, en zijn daarmee eerder een pleister over het probleem dan een echte oplossing.

Rust

Een snelle opkomer is de programmeertaal Rust [7]. Deze taal bestaat sinds 2010, en wordt actief gesponsord door Mozilla. In de basis is het een systeemtaal: het lijkt erg op C++, en het genereert ook een uitvoerbaar bestand met AMD64 assembly. Het is dus geen scriptingtaal zoals PHP en Javascript. Voordeel hiervan is dat je code volledig gecontroleerd is, voordat er ook maar iets uitgevoerd wordt. Zo heb je meer zekerheid dat wat op je servers draait ook ècht goed is.

Veiliger dan C++, sneller dan Go

Ditzelfde geldt ook voor de C++, maar bij C++ kan gemakkelijk ongeldig geheugen geadresseerd worden. Het komt vrij vaak voor dat er achteraf buffer overflows in C++-code blijken te zitten. Dit probleem is zo goed als onmogelijk als de code wordt geschreven in Rust, dankzij een goed ontwerp van de standaard library en de aanwezigheid van het Borrow Checker-mechanisme [8]. Dit component controleert bij het compileren dat er alleen kan worden gewerkt met bestaande objecten in goed georganiseerde stukken geheugen.

Garbage Collection is het gangbare alternatief voor het Borrow Checker-mechanisme. Een Garbage Collected taal zoals Go biedt op die manier vergelijkbare voordelen als Rust. Helaas heeft Garbage Collection performance-nadelen, en geeft het minder grip op geheugengebruik. Samengevat is Rust dus minstens zo snel als C++, en heeft het bovendien de correctheidsgaranties van talen als Java, Go en functionele programmeertalen. Dat maakt Rust zeer geschikt voor toepassingen waarbij performance en security cruciaal zijn. Deze garanties komen ook goed uit bij het ontwikkelen van embedded systemen zoals in een Internet of Things-context. Rust compileert naar LLVM, en kan dus ook code genereren voor ARM chipsets [9].

Nog een klein zijspoortje naar Go, omdat het gezien wordt als een uitdager voor Rust: Bij Tweede golf kiezen we niet voor Go o.a. omdat we het typeringssysteem te beperkt vinden. Zo ontbreekt het bij Go aan generics, waardoor de correctheidsgaranties toch minder sterk zijn in vergelijking met Rust. Er valt veel meer te zeggen over deze afweging, maar dit is geen "Rust vs. Go"-artikel [10].

Rust als webplatform

Als we de Fibonacci-reeks kunnen uitrekenen hebben we nog geen webapplicatie. Eerst hebben we een webplatform voor Rust nodig dat de functionaliteiten biedt die normaal Symfony voor ons regelt. Dit webplatform bestaat simpelweg nog niet [11] [12]. Omdat we niet bang zijn om onze handen vuil te maken, zijn we een paar maanden geleden begonnen zelf zo'n raamwerk voor backends te ontwikkelen. Hiermee hopen we de drempel om Rust te gebruiken weg te nemen, in eerste instantie voor onze eigen ontwikkelaars.

Ons raamwerk bestaat uit en gebruikt:

  • REST, HTTP server en routering: Rocket [13]
  • Input validatie: Serde [14]
  • ORM / Database: Diesel [15]
    • Postgres
  • Authenticatie: JSON Web Tokens met Medallion [16]

Onze ervaringen tot nu toe? Wat we ten eerste merken is dat Rust en Rocket moeiteloos onze performance-eisen halen [17]. Verder wordt de documentatie van elk stuk Rust-software via Cargo [18] met een eenduidige stijl gegenereerd. Er is dus een basisniveau van referentiemateriaal voor alles in het Rust-ecosysteem. We zien ook dat elk van deze libraries en Rust als taal een heel levendige community hebben. Issues en merge requests worden ongelofelijk snel opgepikt en opgelost.

Zijn er ook nadelen?

Rust voor web klinkt dus veelbelovend. Soms is de community wel net iets tè levendig: onder andere Diesel heeft tijdens de ontwikkeling van ons platform ten minste eenmaal de API volledig omgegooid. Hopelijk kalmeert dit wanneer libraries meer in productie worden ingezet. Ook heeft Rust een steile leercurve: het is moeilijk om de Borrow Checker gerust te stellen dat het geheugen overal goed wordt gebruikt. Even snel een web app programmeren in Rust zit er hierdoor waarschijnlijk niet in. En ook niet iedere programmeur zal affiniteit kunnen kweken en in de taal kunnen werken.

Toekomst voor Rust

Hoewel we bij Tweede golf erg gecharmeerd zijn van Rust, zullen we voor minder veeleisende applicaties Node.js als backend platform blijven gebruiken. Ook Symfony zal voorlopig belangrijk blijven. Voor high performance backendsystemen die degelijk en duurzaam moeten zijn denken we echter dat Rust de toekomst is.

In een volgende blogpost zullen we dieper ingaan op de ontwikkeling van ons Rust webplatform.

Overweeg je Rust al voor je product (applicatie of embedded systeem) of wil je de mogelijkheden verkennen? Onze teams helpen je met prototyping of implementatie. Neem contact op met Erik of Hugo.

Referenties:

Stay up-to-date

Stay up-to-date with our work and blog posts?

Related articles

This article was authored by Jordy Aaldering and Folkert de Vries

Over the past couple of months, we teamed up with Bernard van Gastel and Jordy Aaldering at Radboud University's Software Energy Lab to measure nea's energy efficiency.

The number of data centers worldwide is constantly increasing, and so is their electricity consumption. One way to become more power-efficient is certainly the constant development of better hardware, but we as developers should do our share. This post shows how coding in Rust can help to use existing resources more efficiently, to help preserve our planet — at least a little bit.
Asynchronous programming is pretty weird. While it is straightforward enough to understand in principle (write code that looks synchronous, but may be run concurrently yada yada yada), it is not so obvious how and when async functions actually perform work. This blog aims to shed light on how that works in Rust.