develop realtime web with scala and xitrum

106
Develop realtime and distributed web with Scala and Xitrum Ngoc Dao Saigon Xmas 2014 Hanoi New Year 2015

Upload: ngoc-dao

Post on 12-Jul-2015

9.109 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Develop realtime web with Scala and Xitrum

Develop realtime and distributed web

with Scala and XitrumNgoc Dao

Saigon Xmas 2014Hanoi New Year 2015

Page 3: Develop realtime web with Scala and Xitrum

Slides will be shared at:http://www.slideshare.net/ngocdaothanh

This talk is long.Please ask question immediately when you have one.

For questions/discussions after this talk, please post to:https://www.facebook.com/groups/720666194693928

You can also post to scala-user group:https://groups.google.com/d/forum/scala-user

Page 4: Develop realtime web with Scala and Xitrum

About meWorking at Mobilus in Tokyo: http://mobilus.co.jp/● Server side● Android, iOS

Interests:● Realtime and distributed systems● Web frameworks

(have been written several for Erlang, Scala, Java)● Big data, analytics (learning Apache Spark)

Open source:● https://github.com/ngocdaothanh● https://github.com/xitrum-framework● https://github.com/sinetja● https://github.com/netty

Page 5: Develop realtime web with Scala and Xitrum

Scala@Japan

● Meetups: ~monthly (in Tokyo)● Conferences: yearly

○ 2013:http://scalamatsuri.org/2013/en/program/index.html

○ 2014:http://scalamatsuri.org/en/program/index.htmlhttp://scalamatsuri.org/en/unconference/index.html

Page 6: Develop realtime web with Scala and Xitrum

Red Sand DunesPhan Thiet

Page 7: Develop realtime web with Scala and Xitrum

About you

I guess you already know OOP.

Functional programming:● How many of you have used Ruby?

(somewhat functional, popular)● Have used a more functional language?

(Lisp, Haskell, Erlang, Clojure, F# etc.)

Scala looks like Java and runs on JVM. It’s convenient if you already know Java:● How many of you have used Java?● Have used Scala?

Page 8: Develop realtime web with Scala and Xitrum

● Why use Scala? Compare with Java, Ruby, Node.js etc.● Books, sites

Getting started:● Install Scala● Ways to run Scala program: Hello World

Scala = OOP + functional:● Learn Scala’s functional feature via collections● Learn Scala’s OOP feature via the Animals exercise

Some tools:● Development:

○ REPL (Read–Eval–Print Loop), SBT (Scala Build Tool)○ IDEs: Eclipse, IntelliJ

● Production: ○ xitrum-package○ Scalive

PART 1/5: Scala overview

Page 9: Develop realtime web with Scala and Xitrum

● Web app ≈ normal app + routing● Xitrum:

○ Compare with Scalatra, Lift, Play○ Basic usage:

■ Add routes to the previous demos■ respondXxx

○ Swagger UI, Swagger Codegen○ Metrics○ i18n

PART 2/5: Use Scala for web

Page 10: Develop realtime web with Scala and Xitrum

● Compare with Node.js● Future and future composition● Actor model and Akka actor

↑ NEW programming paradigmA language that doesn't change the way you think about programming is not worth learning.○ Actor vs Thread○ Actor vs Future○ Some pitfalls

● Akka FSM

PART 3/5: Use Scala for concurrency

Page 11: Develop realtime web with Scala and Xitrum

● Realtime web● WebSocket, Socket.IO, SockJS● Tictactoe web game

PART 4/5: Use Scala for realtime web

Page 12: Develop realtime web with Scala and Xitrum

PART 5/5: Use Scala for distributed systems

Compare with Redis

Remoting:● Akka remoting

Clustering:● Akka clustering● Glokka● Hazelcast

Scale Tictactoe to multiple servers

Page 13: Develop realtime web with Scala and Xitrum
Page 14: Develop realtime web with Scala and Xitrum

● Why use Scala? Compare with Java, Ruby, Node.js etc.● Books, sites

Getting started:● Install Scala● Ways to run Scala program: Hello World

Scala = OOP + functional:● Learn Scala’s functional feature via collections● Learn Scala’s OOP feature via the Animals exercise

Some tools:● Development:

○ REPL (Read–Eval–Print Loop), SBT (Scala Build Tool)○ IDEs: Eclipse, IntelliJ

● Production: ○ xitrum-package○ Scalive

PART 1/5: Scala overview

Page 15: Develop realtime web with Scala and Xitrum

● Trendy: Used by by Apple, Foursquare, Guardian, LinkedIn, Netflix, Quora, Sony Pictures Entertainment, Twitter, UK Guardian etc.

● Compare with Java, Ruby, Node.js etc.● Language: ≈ Java + Ruby

○ Fast speed of Java + nice syntax of Ruby:Faster than Ruby + syntax nicer than Java

○ Flexible:■ Static + dynamic:

Compiled to Java .class or run as script like Ruby■ OOP of Java + functional of Ruby

http://www.quora.com/Why-is-Swift-so-similar-to-Scala● Not only a good language: Scala has toys

○ Ecosystem: Can reuse all Java libs○ Concurrent/parallel: Future, Akka (≈ Erlang)○ Big data: Apache Spark

Why use Scala?

Page 16: Develop realtime web with Scala and Xitrum

Books, sites

● http://www.scala-lang.org/documentation/● http://twitter.github.io/effectivescala/● https://github.com/lauris/awesome-scala● https://github.com/akullpp/awesome-java● Search

Page 17: Develop realtime web with Scala and Xitrum

Learn Scala “enough” to do projects

How much is “enough”?

Page 18: Develop realtime web with Scala and Xitrum

Level A1:Beginning application programmer

● Java-like statements and expressions: standard operators, method calls, conditionals, loops, try/catch

● class, object, def, val, var, import, package● Infix notation for method calls● Simple closures● Collections with map, filter, etc● for-expressions

http://www.scala-lang.org/old/node/8610

Page 19: Develop realtime web with Scala and Xitrum

Level A2:Intermediate application programmer

● Pattern matching● Trait composition● Recursion, in particular tail recursion● XML literals

Page 20: Develop realtime web with Scala and Xitrum

Level A3:Expert application programmer

● Folds, i.e. methods such as foldLeft, foldRight

● Streams and other lazy data structures● Actors● Combinator parsers

Page 21: Develop realtime web with Scala and Xitrum

Level L1:Junior library designer

● Type parameters● Traits● Lazy vals● Control abstraction, currying● By-name parameters

Page 22: Develop realtime web with Scala and Xitrum

Level L2:Senior library designer

● Variance annotations● Existential types (e.g., to interface with Java

wildcards)● Self type annotations and the cake pattern

for dependency injection● Structural types (aka static duck typing)● Defining map/flatmap/withFilter for new kinds

of for-expressions● Extractors

Page 23: Develop realtime web with Scala and Xitrum

Level L3:Expert library designer

● Early initializers● Abstract types● Implicit definitions● Higher-kinded types

A1 → A2/L1 → A3/L2 → L3

Page 24: Develop realtime web with Scala and Xitrum
Page 25: Develop realtime web with Scala and Xitrum

Install Scala

1. Download fromhttp://www.scala-lang.org/

2. Config PATH:PATH=path/to/scala-2.11.4/bin:$PATH

REPL (Read–Eval–Print Loop) demo:scala command

Page 26: Develop realtime web with Scala and Xitrum

Ways to run Scala program

● println("Hello World")● Run as script with scala● Compile with scalac and run with scala● Compile with scalac and run with java

Page 27: Develop realtime web with Scala and Xitrum
Page 28: Develop realtime web with Scala and Xitrum

SBT (Scala Build Tool)

http://www.scala-sbt.org/

● Dependency library manager + build tool● Like “gem” + “rake” of Ruby● Like Maven, Gradle● Has plugins to generate project files for IDEs,

like Eclipse and IntelliJ● Has plugins to collect and package .jar files,

ready to deploy to production environment

(Make, Ant are just build tools, not dependency library managers)

Page 29: Develop realtime web with Scala and Xitrum

Install SBT

1. Download fromhttp://www.scala-sbt.org/download.html

2. Config PATH:PATH=path/to/sbt/bin/dir:$PATH

sbt:java -Xms256M -Xmx512M-jar `dirname $0`/sbt-launch-0.13.7.jar "$@"

Learn SBT:http://www.scala-sbt.org/documentation.html

Page 30: Develop realtime web with Scala and Xitrum

Simple SBT-based project structure

Page 31: Develop realtime web with Scala and Xitrum

build.sbtorganization := "com.mycompany"

name := "hello"

version := "1.0"

scalaVersion := "2.11.4"

scalacOptions ++= Seq("-deprecation", "-feature", "-unchecked")

javacOptions ++= Seq("-source", "1.6", "-target", "1.6")

libraryDependencies += "tv.cntt" %% "xitrum" % "3.21"

libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.1.2"

Packaged .jar file:hello_2.11-1.0.jar

Page 32: Develop realtime web with Scala and Xitrum

$ sbt tasksconsole Starts the Scala interpreter

compile Compiles sourcesclean Deletes files produced by the buildrun Runs a main class

package Produces project jar filepublish Publishes project jar file to a repositorypublish-local Copies project jar file to ~/.ivy2

test Executes all teststest-only Executes the tests provided as argumentstest-quick Executes the tests that either failed before

Page 33: Develop realtime web with Scala and Xitrum

SBT plugins

http://www.scala-sbt.org/release/docs/Community-Plugins.html

Generate Eclipse project:https://github.com/typesafehub/sbteclipse

Generate IntelliJ project:https://github.com/mpeltonen/sbt-idea

Package project:https://github.com/xitrum-framework/xitrum-package

Page 34: Develop realtime web with Scala and Xitrum

Hello World demo

● sbt console● sbt run● sbt eclipse● Run in Eclipse● Debug in Eclipse● sbt xitrum-package● Run with java● Add dependency library

http://search.maven.org/● Scalive

Page 35: Develop realtime web with Scala and Xitrum

Rules of thumb

Use dependency manager:● Do not download dependency libraries

manually● Do not commit dependency libraries

IDEs:● Generate project files for IDEs● Do not commit project files

Page 36: Develop realtime web with Scala and Xitrum
Page 37: Develop realtime web with Scala and Xitrum

Scala = OOP + functional

Unifying Object-Oriented and Functional Programminghttp://web.stanford.edu/class/cs94si/OOPFP.pdf

Page 38: Develop realtime web with Scala and Xitrum

Functional language

● Pass a function as an argument to another function=> Convenient syntaxf(123, g)f(123, { // ...})

● Immutable data structures=> Thread-safe○ Tail recursion

Page 39: Develop realtime web with Scala and Xitrum

Learn Scala’s functional feature via collections

● From a collection, create another collection of same size=> map

● From a collection, create another collection of larger size=> flatMap

● From a collection, create another collection of smaller size=> filter

● From a collection, create one element=> foldLeft, foldRight, reduce

http://www.scala-lang.org/api/current/index.html#scala.collection.Seq

Page 40: Develop realtime web with Scala and Xitrum

map

Page 41: Develop realtime web with Scala and Xitrum

flatMap

Page 42: Develop realtime web with Scala and Xitrum

filter

Page 43: Develop realtime web with Scala and Xitrum

foldLeft

Roll

Page 44: Develop realtime web with Scala and Xitrum

val a = 1

var b = 1b = 2

val → immutable:val c = Seq(1, 2, 3)

var → immutable:var d = Seq(1, 2, 3)d = Seq(4, 5, 6)

val → mutable:val e = Array(1, 2, 3)e(0) = 4

var → mutable:var f = Array(1, 2, 3)f = Array(4, 5, 6)f(0) = 4

Page 45: Develop realtime web with Scala and Xitrum

val VS varimmutable VS mutable collection

Order of preference (best practice):● val● var● val → immutable: strictly functional● var → immutable● val → mutable● var → mutable: do not use

Some languages only allow val → immutableScala is flexible:var and mutable are OK to use in small, closed scope

Page 46: Develop realtime web with Scala and Xitrum

For your curiosity: How to write programs with only constants?

Example problem:

Without var, mutable:● Generate a collection of positive numbers

that are <= n, and are multiple of 3 or 5.gen(n: Int): Seq[Int]

● Calculate sum of all numbers in a collection.sum(nums: Seq[Int]): Int

Page 47: Develop realtime web with Scala and Xitrum

With var and mutable

import scala.collection.mutable.ArrayBufferdef gen(n: Int): Seq[Int] = { val buf = ArrayBuffer[Int]() var i = 1 while (i <= n) { if (i % 3 == 0 || i % 5 == 0) buf.append(i) i += 1 } buf}

Page 48: Develop realtime web with Scala and Xitrum

def gen(n: Int): Seq[Int] = { val nums = 1 to n nums.filter { i => i % 3 == 0 || i % 5 == 0 }}

def gen(n: Int): Seq[Int] = { for { i <- 1 to n if (i % 3 == 0 || i % 5 == 0) } yield i}

Page 49: Develop realtime web with Scala and Xitrum

Without var and mutable

● Use recursion to loop● Optimize: Use tail recursion

○ Use accumulator

Page 50: Develop realtime web with Scala and Xitrum

def gen(n: Int): Seq[Int] = { // Stop condition if (n < 3) return Seq()

// Recursion if (n % 3 == 0 || n % 5 == 0) gen(n - 1) :+ n else gen(n - 1)}

Stackoverflowif n is big enough

Page 51: Develop realtime web with Scala and Xitrum

def genAcc( n: Int, acc: Seq[Int]): Seq[Int] = { if (n < 3) return acc

// Tail recursion; Scala compiler will // convert to “while” loop if (n % 3 == 0 || n % 5 == 0) genAcc(n - 1, n +: acc) else genAcc(n - 1, acc)}

def gen(n: Int) = genAcc(n, Seq())

Page 52: Develop realtime web with Scala and Xitrum

def genAcc( n: Int, acc: Seq[Int]): Seq[Int] = { if (n < 3) return acc

if (n % 3 == 0 || n % 5 == 0) genAcc(n - 1, n +: acc) else genAcc(n - 1, acc)}

How to write programs with only constants?

State is storedat function arguments

State is set/changedat function call

Page 53: Develop realtime web with Scala and Xitrum
Page 54: Develop realtime web with Scala and Xitrum

How I learn an OOP language:● Learn basic syntax● Learn collections● Animals exercise:

abstraction, encapsulation,inheritance, polymorphism

Learn Scala’s OOP feature via the Animals exercise

Page 55: Develop realtime web with Scala and Xitrum

Animals exercise

trait (interface) Animal● name: String● talk()

class Cat extends Animalclass Dog extends Animal

class Zoo● addAnimal(a: Animal)● talkAll()

Page 56: Develop realtime web with Scala and Xitrum

scala-lang.org → /api/ Companion object Class Trait

http://youtu.be/GQxUEAXX_fE

How to read Scaladoc

Page 57: Develop realtime web with Scala and Xitrum
Page 58: Develop realtime web with Scala and Xitrum

● Web app ≈ normal app + routing● Xitrum:

○ Compare with Scalatra, Lift, Play○ Basic usage:

■ Add routes to the previous demos■ respondXxx

○ Swagger UI, Swagger Codegen○ i18n

PART 2/5: Use Scala for web

Page 59: Develop realtime web with Scala and Xitrum

Web ≈ Routing

function

Input Output

function

Input Output

Page 60: Develop realtime web with Scala and Xitrum

Web ≈ RoutingA web library/framework is not worth using if its routing feature sucks.

function

Request Response

function

ResponseRequest

Request

Request

Router

Page 61: Develop realtime web with Scala and Xitrum

Xitrum

http://xitrum-framework.github.io/

Compare with Scalatra, Lift, Play

Demos:https://github.com/xitrum-framework/xitrum-demos

Skeleton to create new project:https://github.com/xitrum-framework/xitrum-new

Page 62: Develop realtime web with Scala and Xitrum

● Basic usage:○ Add routes to the previous demos○ respondXxx

● Swagger UI, Swagger Codegen● Metrics● i18n

Xitrum

Page 63: Develop realtime web with Scala and Xitrum
Page 64: Develop realtime web with Scala and Xitrum

● Compare with Node.js● Future and future composition● Actor model and Akka actor

↑ NEW programming paradigmA language that doesn't change the way you think about programming is not worth learning.○ Actor vs Thread○ Actor vs Future○ Some pitfalls

● Akka FSM

PART 3/5: Use Scala for concurrency

Page 65: Develop realtime web with Scala and Xitrum

Compare with Node.js

Node.js:● Single thread => Single core● Complicate to scale to multiple cores or multiple

servers; except for shared-nothing (non-realtime) systems

● Callback hell

Scala:● Multiple threads; immutable data structures, future, and

actor provide more safety for multithread programming● Easy to scale● No callback hell

Page 66: Develop realtime web with Scala and Xitrum

Future

http://docs.scala-lang.org/overviews/core/futures.html

Think about Future as a thread pool with some nice methods to:● send tasks to it● get results● handle failures● compose the above together

Page 67: Develop realtime web with Scala and Xitrum

Future composition

ff

ff

f

f

f

f1

f2

f3

f

Think about Node.js callback hell!

● Future.sequence● for comprehension

Page 68: Develop realtime web with Scala and Xitrum

val taskParams = Seq(123, 456, 789)val taskFutures: Seq[Future[String]] = tasks.map { ms =>

future { Thread.sleep(ms) s"Result for $ms" }}

val gatheredFuture: Future[Seq[String]] = Future.sequence(taskFutures)

Page 69: Develop realtime web with Scala and Xitrum

val purchase = for { usd <- future { con.getValue(USD) } chf <- future { con.getValue(CHF) } if isProfitable(usd, chf)} yield connection.buy(amount, chf)

purchase onSuccess { amount =>println("Purchased " + amount + " CHF")

}

Page 70: Develop realtime web with Scala and Xitrum
Page 71: Develop realtime web with Scala and Xitrum

↑ NEW programming paradigm

A language that doesn't change the way you think about programming is not worth learning.Alan Perlis(the first recipient of the Turing Award)

Actor model and Akka actor

Page 72: Develop realtime web with Scala and Xitrum

Benefit of actor in one sentence

C vs Java:You can use memory without having to release memory manually.

Thread vs actor:You can use concurrency without having to create threads manually.

Don't communicate by sharing memory; share memory by communicating.

Page 73: Develop realtime web with Scala and Xitrum

Actor model● Actor =

states + mailbox + behaviors (msg handlers)

● From outside, can’t manipulate actors directly.● To interact with an actor, must send messages to it.● Each actor has a mailbox, messages are put to mailbox,

and processed one by one. ← An actor is like a single threaded process (each actor is like a Node.js process); it doesn’t do more than one thing at a time.

http://www.cs.tsukuba.ac.jp/~yas/cs/csys-2013/2013-12-03/

Page 74: Develop realtime web with Scala and Xitrum

Actor vs Thread

Thread:● Heavy weight: Can only create not too many threads;

usually: 2000~5000● Shared state ← Source of bugs● Passive: Have to call object.method() to make the object

alive.Actor:● Light weight: Can create millions of actors;

usually: ~2.5 million actors/GB● Self contained, shared nothing● Active: Actors are alive by themselves. ← Easy to model

programs that have millions of on-going things (very high level of concurrency), like MMOG games.

Page 75: Develop realtime web with Scala and Xitrum

Actor vs Thread

● Thread: n dimensions, hard to reason about.● Actor: 1D, one thing at a time.

var1

var1

Page 76: Develop realtime web with Scala and Xitrum

Actor vs Thread

Just like JVM automatically manages memory for you:● Actor is a high level logical way to think, to

model programs.● At lower level, actors run above a thread

pool.

Page 77: Develop realtime web with Scala and Xitrum

Actor vs Future

Actor:● Messaging● Scheduling● FSM● Monitoring and supervision● Location transparency

(actors on one server can send messages to actors on another server)=> Easier to scale out to multiple servers/clustering

Future:● Syntax is easier to write● Composable● More typesafe

Page 78: Develop realtime web with Scala and Xitrum

Akka http://akka.io/(an implementation of the actor model)

Summary:https://jraviton.wordpress.com/2015/01/16/lets-brush-up-on-scala-actors/

Page 79: Develop realtime web with Scala and Xitrum

Demo: Counter

// First, define messagesobject Counter { case class Inc(amount: Int) case class Dec(amount: Int)}

Page 80: Develop realtime web with Scala and Xitrum

import akka.actor.Actor

// Define actor state and message handlersclass Counter(name: String) extends Actor { // Actor state private var value = 0

...

Page 81: Develop realtime web with Scala and Xitrum

...

import Counter._

// Message handlers def receive = { case Inc(amount) => value += amount println(s"Value: $value")

case Dec(amount) => value -= amount println(s"Value: $value") }}

Page 82: Develop realtime web with Scala and Xitrum

import akka.actor.{ActorSystem, Props}

// Think of this as a thread poolval system = ActorSystem("mysystem")

// Create actor reference (actor instance)val c1 = system.actorOf( Props(new Counter("mylock")))

// Send messages to the actorc1 ! Counter.Inc(1)c1 ! Counter.Dec(2)

Page 83: Develop realtime web with Scala and Xitrum

Some pitfalls

Send mutable msgs between actors.↑ May lead to bug, if actor A sends msg M to actor B, state of B incorporates M, then M is later changed by A.=> Shared memory

Fix: Use immutable messages.

Page 84: Develop realtime web with Scala and Xitrum

Some pitfallsFrom inside actor:anObject.foo(new Callback { def onCallback() { // Modify actor state directly }})↑ May lead to bug, because the actor’s thread and the callback’s thread may be 2 different threads. Remember: An actor is like a single threaded process, can’t do more than one thing at a time. An actor should be self contained, shared nothing.

Fix: self ! msgFromCallback

Page 85: Develop realtime web with Scala and Xitrum

Good read

● Concurrent Programming for Scalable Web Architectureshttp://berb.github.io/diploma-thesis/index.html

● Functions + Messages + Concurrency = Erlanghttp://www.infoq.com/presentations/joe-armstrong-erlang-qcon08

● Akka dochttp://doc.akka.io/docs/akka/2.3.8/scala.html

Page 86: Develop realtime web with Scala and Xitrum
Page 87: Develop realtime web with Scala and Xitrum

Akka FSM

● FSM: Finite State Machine● Implemented based on actors● Very good for realtime multiplayer games, to

manage states of game sessions and inter-player interactions

Example:Code Lockhttps://github.com/ngocdaothanh/code-lock-fsm-akka

Page 88: Develop realtime web with Scala and Xitrum
Page 89: Develop realtime web with Scala and Xitrum

● Realtime web● WebSocket, Socket.IO, SockJS● Tictactoe web game

PART 4/5: Use Scala for realtime web

Page 90: Develop realtime web with Scala and Xitrum

HTTP problem:Server can send data to clients only one time.

Some years ago:Flash (open TCP socket connection to server)

Now:WebSockethttps://developer.mozilla.org/en-US/docs/WebSockets/Writing_WebSocket_client_applications

Realtime web ≈ server push

Page 91: Develop realtime web with Scala and Xitrum

var sock = new WebSocket('ws://domain/path');

sock.onopen = function() { console.log('onopen');};

sock.onmessage = function(e) { console.log('onmessage: ' + e.data); sock.send(e.data);};

sock.onclose = function() { console.log('onclose');};

Server can push data to clients multiple times

Page 92: Develop realtime web with Scala and Xitrum

WebSocket problem

New browsers are required:● Internet Explorer: 10● Firefox: 6● Chrome: 4● Safari: 5● Opera: 12.10

Page 93: Develop realtime web with Scala and Xitrum

WebSocket emulators

SockJS: WebSocket-like API● JavaScript client:

https://github.com/sockjs/sockjs-client● Protocol:

https://github.com/sockjs/sockjs-protocolhttp://sockjs.github.io/sockjs-protocol/sockjs-protocol-0.3.3.html

● Closer to WebSocket, much simpler than Socket.IO=> Server side support for many languages

Socket.IO: More complicate built-in features, like rooms● http://socket.io/● Node.js

Page 94: Develop realtime web with Scala and Xitrum

SockJS

● Provides WebSocket-like API● Supports all browsers, e.g. IE 6● Transports: websocket xhr-streaming xdr-

streaming iframe-eventsource iframe-htmlfile xhr-polling xdr-polling iframe-xhr-polling jsonp-polling

● Requires○ Client side: sockjs.js○ Server side: SockJS protocol

implementation

Page 95: Develop realtime web with Scala and Xitrum

var sock = new WebSocket('ws://domain/path');

sock.onopen = function() {

};

sock.onmessage = function(e) {

sock.send(e.data);

};

sock.onclose = function() {

};

var sock = new SockJS('http://domain/path');

sock.onopen = function() {

};

sock.onmessage = function(e) {

sock.send(e.data);

};

sock.onclose = function() {

};

WebSocket vs SockJS

Page 96: Develop realtime web with Scala and Xitrum

Tictactoe web game

https://github.com/xitrum-framework/xitrum-tictactoe

Page 97: Develop realtime web with Scala and Xitrum

Tictactoe web game

Exercises:● Instead of letting player actors send messages directly

to each other, use an intermediate game actor for each game.

● Let users other than the players watch games.● Use Scala.js to convert game logic code written in Scala

to JavaScript, to share game logic code between server side and client side.http://www.scala-js.org/

● Use Akka FSM instead of become.

Page 98: Develop realtime web with Scala and Xitrum
Page 99: Develop realtime web with Scala and Xitrum

Compare with Redis

Remoting:● Akka remoting

Clustering:● Akka clustering● Glokka● Hazelcast

Scale Tictactoe to multiple servers

PART 5/5: Use Scala for distributed systems

Page 100: Develop realtime web with Scala and Xitrum

Compare with Redis

Redis:● Separate process● Single point of failure

Akka, Hazelcast:● In-process

=> Faster, easier to use● Redundancy, failover

Page 101: Develop realtime web with Scala and Xitrum

Akka remoting

http://doc.akka.io/docs/akka/2.3.8/scala/remoting.html

Page 102: Develop realtime web with Scala and Xitrum

Akka clustering

http://doc.akka.io/docs/akka/2.3.8/scala/cluster-usage.html

Page 103: Develop realtime web with Scala and Xitrum

Glokka

https://github.com/xitrum-framework/glokka

A Scala library that allows you to register and lookup actors by names in an Akka cluster.

Page 104: Develop realtime web with Scala and Xitrum

Hazelcast

Program ≈ Code + Data

Distributed Program ≈ Distributed Code + Distributed Data

Akka ≈ Distributed CodeHazelcast ≈ Distributed Data + Distributed Code

http://hazelcast.org/http://hazelcast.com/

Page 105: Develop realtime web with Scala and Xitrum

http://docs.hazelcast.org/docs/3.4/manual/html/

● Distributed data structures: Map, Multimap, Queue, Set, List, Topic (pub/sub), Lock, AtomicLong, AtomicReference, Semaphore, CountDownLatch, IdGenerator

● JCache● Distributed ExecutorService● Transaction● MapReduce, Aggregators● Integration: Hibernate, Servlet session replication,

Spring● Client: Java, C++, .NET, REST, memcache

Page 106: Develop realtime web with Scala and Xitrum

Scale Tictactoe to multiple servers

Only need to change Lobby lookup=> Use Glokka

Config Akka cluster:config/akka.conf