scala & reactive systems
DESCRIPTION
Många större företag, exempelvis LinkedIn och Twitter, använder programspråket Scala för att bygga system som är reactive. Scala, från scalable language, är ett programspråk som integrerar funktionell programmering med objektorientering. Program i Scala körs på Javas virtuella maskin (JVM) och kan använda befintliga bibliotek i Java. Med en expressiv, kraftfull, och kompakt syntax har Scala snabbt blivit ett av de populäraste programspråken. Det handlar om egenskaper som moderna, skalbara system för webben behöver ha. För många är exempelvis Java, Python, Ruby, och NodeJS vanliga val när det gäller att bygga lösningar för webben. Frågan är hur enkelt det är att vara reactive med dessa språk? Förutom att introducera Scala, försöker Viktor under denna lunch reda ut begreppet reactive och se hur Scala kan vara ett av de bästa teknikvalen i sammanhanget. Viktor Lövgren är konsult på Valtech och har aktivt följt utvecklingen av Scala under en längre tid. Under 2014 utvecklade han betygen.se i Scala för att lära sig mer om hur det kan användas för webbutveckling. Viktor anser att fler borde få upp ögonen för Scala och våga effektivisera sin kod och därmed sin utvecklingsprocess!TRANSCRIPT
![Page 1: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/1.jpg)
Scala & Reactive Systems Viktor Lövgren / @vlovgr
![Page 2: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/2.jpg)
Utveckling 1960-2000 Utveckling idag
En maskin Kluster av många maskiner
Enkärniga processorer Flerkärniga processorer
Dyrt med RAM Billigt med RAM
Dyrt med lagringsutrymme Billigt med lagringsutrymme
Långsamma nätverk Snabba nätverk
Få samtidiga användare Många samtidiga användare
Små datamängder Stora datamängder
Svarstider i sekunder Svarstider i millisekunder
![Page 3: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/3.jpg)
Hur ska vi utveckla mjukvara med dagens förutsättningar?
![Page 4: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/4.jpg)
Reactive Manifesto
![Page 5: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/5.jpg)
Reactive Systems — Responsive
• Svarar inom en tidsgräns, om möjligt. • Upptäcker fel tidigt och hanterar dem. • Ger en konsistent användarupplevelse.
• Bygger företroende hos användaren.
![Page 6: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/6.jpg)
Reactive Systems — Resilient
• Kan vara responsive trots fel i systemet. • Isolerar fel till en specifik komponent. • Klarar av att hantera fel och återställa sig. • Replikerar komponenter, hög tillgänglighet.
![Page 7: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/7.jpg)
Reactive Systems — Elastic
• Kan vara responsive när belastningen ökar. • Allokerar resurser efter användningen. • Inga centrala flaskhalsar, replikering. • Distribuera lasten, skala efter behov.
![Page 8: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/8.jpg)
Reactive Systems — Message Driven
• Kommunicera med asynkrona meddelanden. • Felhantering — återställ från fel i systemet. • Back pressure — diskutera lastbalansering. • Location transparency mellan komponenter.
![Page 9: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/9.jpg)
Reactive Systems
![Page 10: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/10.jpg)
Reactive Systems — Microservices
• Isolerade komponenter (vs. monoliter) • Lättare att skriva, förstå, underhålla, … • Hanterar fel bättre, kan fortsätta fungera. • Share nothing design: inget delat tillstånd.
![Page 11: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/11.jpg)
![Page 12: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/12.jpg)
“Preliminary results of another Ruby to Scala transition show a jump from 7K to
19K transactions/hour on 1/2 the hardware.” — Dragos Manolescu (micro-workflow.com)
![Page 13: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/13.jpg)
Vad ska vi använda för teknik?
![Page 14: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/14.jpg)
Scala, Akka, Play
![Page 15: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/15.jpg)
Martin Odersky
• Ph.D. ETH, Zurich. • EPFL, Lausanne. • Javac / Generics. • Scala, sedan 2001.
![Page 16: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/16.jpg)
• Organisation grundad av Martin Odersky. • Leder utvecklingen av flera öppna projekt.
• Scala, Akka, Play, Slick, SBT, Scala IDE, … • Bra resurs för material runt dessa verktyg. • Teknikval förklaras av Reactive Manifesto.
Typesafe
![Page 17: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/17.jpg)
![Page 18: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/18.jpg)
• Imperativ- och funktionell programmering. • Skalbart, kan växa med användarnas behov. • Byggt ovanpå Java, kompilerar till bytecode. • Kraftfullt typsystem, grymma collections. • Möjlighet till domänspecifika språk (DSLs).
Scala i korta drag
![Page 19: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/19.jpg)
• Open source byggverktyg för Scala och Java. • Kan jämföras vid Maven eller Ant för Java. • Beroenden hanteras med Apache Ivy. • Inkrementell kompilering, interaktivt skal. • Plugins för det mesta man kan tänka sig.
Scala Build Tool (SBT)
![Page 20: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/20.jpg)
• Utvecklingsmiljö: IntelliJ, Eclipse (Scala IDE). • Installera Scala Build Tool (SBT) eller Scala. • Starta Scalas interaktiva skal (REPL).
• Read-Evaluate-Print-Loop (REPL). • Alternativt, använd Scala Worksheets.
Komma igång
![Page 21: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/21.jpg)
brew install scala scala
Installation (Mac)
![Page 22: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/22.jpg)
brew install sbt sbt console
Installation (Mac)
![Page 23: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/23.jpg)
Demo: Komma igång
![Page 24: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/24.jpg)
• Flera möjliga val, t.ex. ScalaTest, ScalaCheck. • ScalaTest har färdigt stöd för bl.a. TDD/BDD. • ScalaCheck: property-based testing.
• Generera random input; kör flera gånger. • ScalaTest och ScalaCheck kan kombineras.
Testning i Scala
![Page 25: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/25.jpg)
• Java 8 kom med mycket ny funktionalitet. • Lambda-uttryck, streams, parallella streams. • Idéerna kan ses som inspirerade av Scala. • Scala har betydligt mer än så att erbjuda.
Java 8 — behövs Scala?
![Page 26: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/26.jpg)
// 61 rader kod i Java public final class Person {
private String name; private int age;
public Person(final String name, final int age) { ... }
// getName, setName, getAge, setAge // apply, copy, equals, hashCode, toString }
Java — enkel modell
![Page 27: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/27.jpg)
// 1 rad kod i Scala case class Person(name: String, age: Int)
Scala — enkel modell
![Page 28: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/28.jpg)
• 17 olika språk, 729 projekt, 80 miljoner rader. • Slutsatser från granskningen:
• Stark typning är bättre än svag typning. • 122 feltyper i JavaScript; ej i TypeScript.
• Bättre kodkvalité med funktionella språk.
Python, Ruby, NodeJS, … — behövs Scala?
![Page 29: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/29.jpg)
“We need to rewrite our Java/Scala application in JavaScript/Python/Ruby/
$your_favorite_dynamic_lang.”
— Nobody, never.
![Page 30: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/30.jpg)
![Page 31: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/31.jpg)
• TrueAccord, migrering Python till Scala. • Top 3 faktorer som avgjorde valet:
• Interoperabilitet med Java. • Funktionell programmering. • Economy of code.
Python — varför Scala?
![Page 32: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/32.jpg)
“At TrueAccord, this level of code correctness [Scala type safety] saves us invaluable time
and money in the long run.”
![Page 33: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/33.jpg)
• WhitePages migrering från Ruby till Scala. • Elegant mix av objekt-orientering och FP. • Statisk typning: Typigenkänning, hitta fel. • Kör på JVM: Snabb, Tooling, Java-bibliotek. • Smidig hantering av samtidighet med Akka.
Ruby — varför Scala?
![Page 34: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/34.jpg)
• Travis CI build status för projekt på GitHub. • Urval av några språk och webbramverk:
• 5. Scala (99.9) / 18. Elixir (90) / 26. F# (88) • 29. Ruby (80) / 33. Flask (65) / 34. Rails (60) • 38. Express (30) / 39. Sinatra (15)
Vad är sannolikheten att det bygger?
![Page 36: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/36.jpg)
![Page 37: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/37.jpg)
• Universitetets tjänst för tentamensresultat. • Kunna se statistik på tentamensresultat. • Data finns redan, men inte lättillgänglig. • Idé: hämta och lagra resultaten.
Tentamensresultat
![Page 38: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/38.jpg)
• Generera en query mot universitetets tjänst. • Använd en parser som läser data från svaret. • Upprepa för varje sida (10 tentamen/sida). • Problem: hur får vi tag i alla resultat?
Hämta och lagra resultaten
![Page 39: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/39.jpg)
• Problem: tjänstens paginering är långsam. • Möjligt att söka efter resultat i datumperiod. • Idé: dela upp sökning i en mängd perioder. • Behöver bara ta reda på det äldsta resultatet. • Kör flera parallella queries med Akka.
Hämta och lagra resultaten
![Page 40: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/40.jpg)
• Verktyg för concurrency, distributed apps. • Bygger på message-passing mellan actors. • Actors ordnas i en hierarki; felhantering. • Kommunikation är location transparent. • Många ramverk bygger på Akka, t.ex. Play.
Akka
![Page 41: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/41.jpg)
“In despegar.com, we have migrated a
core Java app to Akka and Scala. Now we handle same traffic with a quarter of hardware.”
![Page 42: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/42.jpg)
• Idé: skriv ett API för att komma åt resultat. • Flera möjliga teknikval i Scala för detta.
• Exempelvis: Play framework, Spray. • Båda ramverken är byggda med Akka.
Gör resultaten mer lättillgängliga
![Page 43: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/43.jpg)
• Refresh workflow / Type safety överallt. • Det mesta för modern webbutveckling.
• RESTful som standard, bra JSON-stöd. • Plugins för LESS/SASS, CoffeeScript, etc. • Skalbart med Akka / Java NIO (Jetty).
Play Framework
![Page 44: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/44.jpg)
• En komplett IDE byggd som en webbapp. • Många exempelprojekt med olika tekniker. • Guider integreras smidigt i projekten. • Enkelt att komma igång och testa.
Typesafe Activator
![Page 45: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/45.jpg)
Installation (Mac)
brew install typesafe-activator activator
![Page 46: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/46.jpg)
• Data är nu lättillgänglig — använd den. • Lanserade betygen.se i början av augusti. • Använder Play framework i grunden. • WebJars för client-side dependencies.
Bygg en webbtjänst för statistik
![Page 47: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/47.jpg)
• Grundläggande funktionalitet i Java, 2012. • Allt skrevs om från grunden i Scala, 2014. • 1/4 så lite kod i Scala (1100 rader vs. 4500). • Mindre dokumentation (0 rader vs. 2500). • Lättare och mer naturlig syntax i Scala.
Lösning i Scala vs. Java
![Page 48: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/48.jpg)
Lösning i Scala vs. Java
// Java; ServiceQuery ~ 234 rader kod final ServiceQuery query = new ServiceQuery.Builder() .examinationDate(DateRange.after(Date.year(2012))) .courseName("envariabel").build();
// Scala; Query ~ 63 rader kod val query = Query(Course(name="envariabel"), date=from(2012))
![Page 50: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/50.jpg)
• Lätt att komma igång, roligt att använda. • Funktionellt med styrkorna i Java (JVM). • Skalbarhet i grunden; tillförlitliga system. • Interagera med existerande Java-system. • Används av stora företag — fler följer!
Sammanfattning — varför Reactive + Scala?
![Page 51: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/51.jpg)
• Coursera (kurser av Martin Odersky): • Grundkurs: Functional programming. • Fortsättning: Reactive programming.
• Böcker, t.ex. Scala for the Impatient. • Konferenser, t.ex. Scala Days.
Lär dig mera
![Page 52: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/52.jpg)
• Awesome Scala — lista över Scala-verktyg. • Scala Times — nyhetsbrev varje vecka. • StackOverflow Scala — bra översikt av Scala. • Scala Stockholm — meetup-grupp för Scala.
Lär dig mera
![Page 53: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/53.jpg)
Tack för mig! Viktor Lövgren / @vlovgr
![Page 54: Scala & reactive systems](https://reader034.vdocuments.us/reader034/viewer/2022052508/55946c3f1a28ab7f2b8b4755/html5/thumbnails/54.jpg)