introdução ao phoenix framework

49
Introdução ao Phoenix Framework Arthur Braga Alfredo 1

Upload: arthur-braga-alfredo

Post on 15-Feb-2017

94 views

Category:

Software


5 download

TRANSCRIPT

Page 1: Introdução ao Phoenix framework

Introdução aoPhoenix Framework

Arthur Braga Alfredo

1

Page 2: Introdução ao Phoenix framework

Sobre o que vou falar

HistóriaO que é o Phoenix FrameworkAlgumas featuresPrós e contras de se adotar

2

Page 3: Introdução ao Phoenix framework

História

3

Page 4: Introdução ao Phoenix framework

https://blog.whatsapp.com/196/1-million-is-so-2011

4

Page 5: Introdução ao Phoenix framework

Intel Xeon X5675 3.07Ghz24 processadores 128GB RAM

5

Page 6: Introdução ao Phoenix framework

Usando 41% dos processadores27 GB de ram livre

6

Page 7: Introdução ao Phoenix framework

7

Page 8: Introdução ao Phoenix framework

Chris McCord

Programador ruby

Estava desenvolvendo uma aplicação de chat

Encontrou muitos desafios, principalmente

relacionadas a tolerância a falhas e comunicação

em tempo real

História

8

Page 9: Introdução ao Phoenix framework

Chris McCord

Descobriu Elixir em 2013

Desenvolveu uma biblioteca de websockets

Viu a oportunidade de criar um framework com

foco em produtividade no estilo do rails

História

9

Page 10: Introdução ao Phoenix framework

Dezembro de 2013: Início do desenvolvimento do Phoenix

Setembro de 2014: José Valim entra para o Core Team

Agosto de 2015: Lançada versão 1.0

História

10

Page 11: Introdução ao Phoenix framework

O que é o PhoenixFramework?

11

Page 12: Introdução ao Phoenix framework

É um framework web escrito em

Elixir que implementa o padrão

MVC

Phoenix framework

12

Page 13: Introdução ao Phoenix framework

Padrões de desenvolvimento

parecido com Rails ou Django

Phoenix framework

13

Page 14: Introdução ao Phoenix framework

Alta produtividade

Alta performance

Escalabilidade

Tolerância a falhas

Phoenix framework

14

Page 15: Introdução ao Phoenix framework

O que tem dediferente?

15

Page 16: Introdução ao Phoenix framework

Plug

Plugs são componentes websimples que podem ser usados

para criar pipelines.

16

Page 17: Introdução ao Phoenix framework

pipeline :browser do plug :accepts, ["html"] plug :fetch_session plug :fetch_flash plug :protect_from_forgery plug :put_secure_browser_headers end

Pipeline

17

Page 18: Introdução ao Phoenix framework

pipeline :browser do plug :accepts, ["html"] plug :fetch_session plug :fetch_flash plug :protect_from_forgery plug :put_secure_browser_headers plug Rumbl.Authentication, repo: Rumbl.Repo end

Pipeline

18

Page 19: Introdução ao Phoenix framework

pipeline :browser do plug :accepts, ["html"] plug :fetch_session plug :fetch_flash plug :protect_from_forgery plug :put_secure_browser_headers plug Rumbl.Authentication, repo: Rumbl.Repo plug Rumbl.Authorization, repo: Rumbl.Repo end

Pipeline

19

Page 20: Introdução ao Phoenix framework

Phoenix Channels

Implementação de websocketsem Elixir

20

Page 21: Introdução ao Phoenix framework

Phoenix Channels

Websocket é uma API queestabelece conexões de

"soquete" entre um navegadorda web e um servidor

21

Page 22: Introdução ao Phoenix framework

Phoenix Channels

defmodule HelloPhoenix.Endpoint do use Phoenix.Endpoint, otp_app: :hello_phoenix

socket "/socket", HelloPhoenix.UserSocket ...end

22

Page 23: Introdução ao Phoenix framework

Phoenix Channels

defmodule HelloPhoenix.UserSocket do use Phoenix.Socket

## Channels channel "room:*", HelloPhoenix.RoomChannel ...

23

Page 24: Introdução ao Phoenix framework

Phoenix Channelsdefmodule HelloPhoenix.RoomChannel do use Phoenix.Channel

def join("room:lobby", _message, socket) do {:ok, socket} end def join("room:" <> _private_room_id, _params, _socket) do {:error, %{reason: "unauthorized"}} end

def handle_in("new_msg", %{"body" => body}, socket) do broadcast! socket, "new_msg", %{body: body} {:noreply, socket} end

def handle_out("new_msg", payload, socket) do push socket, "new_msg", payload {:noreply, socket} endend

24

Page 25: Introdução ao Phoenix framework

let channel = socket.channel("room:lobby", {})let chatInput = $("#chat-input")let messagesContainer = $("#messages")

chatInput.on("keypress", event => { if(event.keyCode === 13){ channel.push("new_msg", {body: chatInput.val()}) chatInput.val("") }})

channel.on("new_msg", payload => { messagesContainer.append(`<br/>[${Date()}] ${payload.body}`)})

channel.join() .receive("ok", resp => { console.log("Joined successfully", resp) }) .receive("error", resp => { console.log("Unable to join", resp) })

export default socket

Phoenix Channels

25

Page 26: Introdução ao Phoenix framework

Phoenix Presence

Replicação de informações eprocessos entre diferentes

clusters

26

Page 27: Introdução ao Phoenix framework

Phoenix Presence

Conflict-free replicated data type(CRDT)

27

Page 28: Introdução ao Phoenix framework

Phoenix Presence

defmodule MyApp.Presence do use Phoenix.Presence, otp_app: :my_app, pubsub_server: MyApp.PubSubend

28

Page 29: Introdução ao Phoenix framework

Phoenix Presence

children = [ ... supervisor(MyApp.Presence, []),]

29

Page 30: Introdução ao Phoenix framework

Phoenix Presence

defmodule MyApp.MyChannel do use MyApp.Web, :channel alias MyApp.Presence

def join("some:topic", _params, socket) do send(self, :after_join) {:ok, assign(socket, :user_id, ...)} end

def handle_info(:after_join, socket) do push socket, "presence_state", Presence.list(socket) {:ok, _} = Presence.track(socket, socket.assigns.user_id, %{ online_at: inspect(System.system_time(:seconds)) }) {:noreply, socket} endend

30

Page 31: Introdução ao Phoenix framework

E o que mais?

31

Page 32: Introdução ao Phoenix framework

32

Page 33: Introdução ao Phoenix framework

“We do not have ONE web-server handling 2 millionssessions. We have 2 million webservers handling one

session each.”

“Because we have one web server per user we caneasily make the system fault tolerant or scalable”

Joe Armstrong

33

Page 34: Introdução ao Phoenix framework

Benchmark

34

Page 35: Introdução ao Phoenix framework

Ecosistema moderno

Technical Requirements ServerHTTP Server Nginx and Puma

Request processing Ruby on Rails

Long-running requests Java and Go

Server-wide state Redis

Persistable data Redis and MongoDB

Background jobs Cron, Bash and Ruby

Service crash recovery Upstart

35

Page 36: Introdução ao Phoenix framework

Ecosistema otp

Technical Requirements ServerHTTP Server Erlang

Request processiong Erlang

Long-running requests Erlang

Server-wide state Erlang

Persistable data Erlang

Background jobs Erlang

Service crash recovery Erlang

36

Page 37: Introdução ao Phoenix framework

E contras?

37

Page 38: Introdução ao Phoenix framework

38

Page 39: Introdução ao Phoenix framework

39

Page 40: Introdução ao Phoenix framework

Curva de aprendizado

Aprender o framework Phoenix é tranquilo

Mudar o paradigma de orientação a objetos para

funcional nem tanto

40

Page 41: Introdução ao Phoenix framework

Curva de aprendizado

"Treinamos nossa equipe em 7 dias" - BrianCardarella

41

Page 42: Introdução ao Phoenix framework

Falta de profissionais

42

Page 43: Introdução ao Phoenix framework

Contra?

43

Page 44: Introdução ao Phoenix framework

Onde aprender mais?

44

Page 45: Introdução ao Phoenix framework

45

Page 46: Introdução ao Phoenix framework

#myelixirstatus

46

Page 47: Introdução ao Phoenix framework

47

Page 48: Introdução ao Phoenix framework

Duvidas?

48

Page 49: Introdução ao Phoenix framework

Obrigado

49