@josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156...

45
@josevalim / phoenixframework.org

Transcript of @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156...

Page 1: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

@josevalim / phoenixframework.org

Page 2: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Glossary

• Phoenix (web framework) • Elixir (programming language) • Erlang VM

Page 3: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077
Page 4: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Switch

Switch

Page 5: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Switch

Browser

Endpoint

Server

Page 6: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

http://stackoverflow.com/questions/1636455/where-is-erlang-used-and-why

Page 7: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

http://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/

2 million connections on a single node

Page 8: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Intel Xeon CPU X5675 @ 3.07GHz 24 CPU - 96GB Using 40% of CPU and Memory

Page 9: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Phoenix Channels

Page 10: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

var socket = new Phoenix.Socket("/ws"); socket.connect();

var channel = socket.channel(“chat:lobby");

channel.on("user_joined", function(message){ // ... });

channel.on("new_message", function(msg){ // ... });

$input.on("enter", function(e){ channel.push("new_message", { content: $input.val(), username: App.username }); });

channel.join();

Page 11: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

defmodule Chat.UserSocket do use Phoenix.Socket

channel "chat:lobby", Chat.LobbyChannel channel "room:*", Chat.RoomChannel

# def connect(params, socket) # def id(socket) end

Page 12: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

defmodule Chat.LobbyChannel do use Phoenix.Channel

def join("chat:lobby", message, socket) do broadcast! socket, “user_joined”, %{username: message[“username"]} {:ok, socket} end

def handle_in("new_message", message, socket) do broadcast socket, "new_message", %{content: message["content"], username: messages[“username"]} socket end end

Page 13: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Server

Browser

Native Mobile

Embedded Device

“Browser" (IE)

Outside viewServer

Page 14: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Switch

Phone

Phone

Phone

Phone

Outside viewSwitch

Page 15: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Inside view

Client Server

Transport socket.connect()

Channels socket.join(channel)

Pubsub

• Distributed Erlang • Redis • PostgreSQL? • XMPP?

• Isolated • Concurrent

Page 16: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

phoenixframework.org

Page 17: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077
Page 18: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Performance

Page 19: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Channels Performance

Page 20: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Subscribers per second

Time (s)

Clients

Page 21: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

htop

Page 22: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

HTTP(S) Performance

Page 23: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Library Throughput (req/s) Latency (ms)

Plug (elixir) 198 328 0.63

Phoenix (elixir) 179 685 0.61

Gin (go) 176 156 0.65

Play (scala) 171 236 1.89

Express Cluster (node) 92 064 1.24

Martini (go) 32 077 3.35

Sinatra (ruby) 30 561 3.50

Rails (ruby) 11 903 8.50

$ wrk -t20 -c100 -d30S --timeout 2000 https://github.com/mroth/phoenix-showdown

Page 24: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Inside view

Client Server

• Isolated • Concurrent

/users

/users

/

/admin

/search?q=elixir

Page 25: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Isolated and Concurrent

• Crashes are isolated • Data is isolated

(GC is per process, no global pauses) • Load balances on IO and CPU

(efficient on multicore)

Page 26: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Productivity

Page 27: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Productivity• Short-term productivity

• Documentation / Guides • Workflows / Generators

• Long-term productivity • Introspection • Maintainability

Page 28: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077
Page 29: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077
Page 30: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Generators as learning tools

$ mix phoenix.gen.html $ mix phoenix.gen.json $ mix phoenix.gen.channel

Page 31: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

More…• Form builders • Static build tools with ES6 as default • Live reloading • Pretty error pages • First-class concurrent test tools • Packages via hex.pm

Page 32: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Long term productivity:

Functional Programming

Page 33: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Long term productivity: Applications

Page 34: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Application

Pubsub

Super visor

TCP

Client

Page 35: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Applications• Package and run our code • Can be started and stopped as a unit • Provide unified configuration • Hold processes and state in the

supervision tree

Page 36: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Observer Demo

Page 37: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Applications

• Introspection & Monitoring • Visibility of the application state • Easy to break into "components" • Reasoning when things go wrong

Page 38: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

Summing up

Page 39: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

phoenixframework.org

Page 40: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077
Page 41: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

elixir-lang.org

Page 42: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077
Page 43: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

consulting and software engineering

Page 44: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

consulting and software engineering

Elixir coaching

Elixir design review

Custom development

Page 45: @josevalim / phoenixframework - GOTO Conference...Phoenix (elixir) 179 685 0.61 Gin (go) 176 156 0.65 Play (scala) 171 236 1.89 Express Cluster (node) 92 064 1.24 Martini (go) 32 077

@josevalim / phoenixframework.org