Twitter har succes med Scala
Mikroblogging-tjenesten Twitter er en af de store succeshistorier for Ruby og webframeworket Rails. Men når det dynamiske sprog når sine begrænsninger, er det et andet nyt sprog, Scala, som overtager arbejdet.
Scala er et sprog, som afvikles på Javas platform. Det er i tidens ånd et hybridsprog, som kombinerer objektorientering med elementer fra funktionsprogrammering.
I Scala er funktioner med på første klasse og sproget byder på såkaldte algebraiske typer. Fra Erlang har Scala lånt den såkaldte Actor-model til parallelprogrammering. På den objektorienterede side ligner sproget Java, men med mixins - traits - i stedet for interfaces. Scala bruger i udstrakt grad typeinferens, så koden kan se helt dynamisk ud.
»Twitter er primært en Ruby-applikation, med en bunke Ruby-dæmoner som foretager asynkron processering på backend'en,« fortæller udvikler Alex Payne til udvikler-bloggen Artima.
Men Ruby on Rails har ydelsesmæssige begrænsninger, når det handler om at processere data på server-siden, mener han. Og hans personlige opfattelse er, at Ruby, som sprog betragtet, mangler elementer som kunne bidrage til, at udvikleren kan skrive pålidelig og højt-ydende kode.
Hans kollega Steve Jenson tilføjer, at Ruby, ligesom mange andre scriptingsprog, får problemer i miljøer med langlivede processer.
Scala giver fleksibilitet
Her kom Scala ind i billedet for Twitter. Selvom udviklerne er løbet ind i mange problemer med Ruby, kan de stadig godt lide fleksibiliteten i sproget, fortæller Alex Payne, og den fleksibilitet genfinder de i Scala. Samtidig benytter Scala statiske typer, men på en »smertefri« måde, som han udtrykker det. Twitters udviklere har nemlig erfaret, at typerne sniger sig ind i systemet, efterhånden som kodebasen og applikationen vokser.
»Der er masser af kald til Rubys kind_of?-metode,« fortæller Alex Payne, der mener, at systemet vil eksplodere, hvis der ikke foretages nogle typecheck undervejs.
»Det er en skam at skulle skrive al det, når der er en løsning, som har eksisteret i programmeringssprogenes verden i årtier,« siger han med henblik på statiske typer.
Scala og Ruby er meget komplimentære, fortæller Steve Jenson. Twitter bruger blandt andet Scala til en kø-tjeneste, som sender beskeder fra det Rails-baserede frontstykke til dæmonerne på serveren.
»Ruby-udgaven fungerede egentligt rimeligt anstændigt i den normale tilstand, men opstartstiden og opførslen ved crash var uforudsigelig,« siger udvikler Robey Pointer.
Svært at flytte Rails til Jruby
Twitters udviklere overvejede også at benytte Jruby, som er den udgave af Ruby, der i lighed med Scala kører oven på Javas afviklingsmiljø. Men det blev droppet, da det ikke var muligt at portere den del af løsningen, som var udviklet i Rails. Det skyldtes, at applikationen benyttede en række C-baserede moduler, som ikke umiddelbart kunne flyttes til Jruby.
Twitters udviklere mener ikke, er der er så meget at betænke sig på, når det handler om at benytte Scala til produktionssystemer. Men man skal berede sig på at bruge et par timer på at tilrette sit udviklingsmiljø.
»Det virker som om, at IDE-understøttelsen er, om end ikke i sin barndom, så i de akavede teenage-år,« mener Alex Payne.
Kommentarer (5)
Som jeg husker det er første release af scala tilbage i 2003, men spændende at høre nogen bruger det til noget "seriøst".
En spændende post af Obie Fernandez om Twitter og deres brug af Ruby og Scala.
http://blog.obiefernandez.com/content/2009/04/my-reasoned-response-about...
I dynamisk typede sprog kan man hurtigt komme til at træde sig selv over tæerne netop som det formentlig er tilfældet med Twitter: Koden bliver gjort polymorf i den forstand at der i funktionsprologen checkes hvad vi har fået af dataobjekt og så behandler det efter type.
Hvis vi får et Userobjekt er alt fint, men hvis vi får et tal skyder vi på at det er userid og prøver at loade et Userobjekt fra databasen. Hvis vi får en string skyder vi på det er et username og prøver at loade det fra DB osv. Koden bliver fleksibel fordi det er underordnet hvad du præsenterer funktionen for at data. Men det betyder også at koden bliver sløv hvis alle lag ned gennem stakken laver den type tests.
Hvis man tænker sig om kan det sagtens undgås og så er der meget mere hastighed at hente. Det er dog nemmere at have et ordentligt statisk typet sprog hvis man er godt vil have ens kode ren mht. til ovenstående problem.
Hvis man gør koden polymorf i et dynamisk sprog på den måde at man checker på typen og "brancher ud" på baggrund af typen, har man ikke fattet en bjælde. Så er man ikke voksen nok til at nyde livet i den dynamiske overhalingsbane :-)
Det lyder ærlig talt som om der render en del Twitter-medarbejdere rundt og gør mere skade end gavn...
Men ikke et ondt ord om Scala herfra - det ser da både fikst og godt ud, og jeg vil ikke have noget imod at bruge det i fremtiden hvis lejligheden byder sig. Scala, Clojure, Groovy og JRuby - Java er måske nok et dødt sprog, men en sprællevende platform :-)
/Ole
Java er måske nok et dødt sprog
Just for kicks: Hvad ville du så kalde C?
:)
