Introdução ao Phoenix framework

Post on 15-Feb-2017

94 views 5 download

Transcript of Introdução ao Phoenix framework

Introdução aoPhoenix Framework

Arthur Braga Alfredo

1

Sobre o que vou falar

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

2

História

3

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

4

Intel Xeon X5675 3.07Ghz24 processadores 128GB RAM

5

Usando 41% dos processadores27 GB de ram livre

6

7

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

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

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

O que é o PhoenixFramework?

11

É um framework web escrito em

Elixir que implementa o padrão

MVC

Phoenix framework

12

Padrões de desenvolvimento

parecido com Rails ou Django

Phoenix framework

13

Alta produtividade

Alta performance

Escalabilidade

Tolerância a falhas

Phoenix framework

14

O que tem dediferente?

15

Plug

Plugs são componentes websimples que podem ser usados

para criar pipelines.

16

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

Pipeline

17

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

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

Phoenix Channels

Implementação de websocketsem Elixir

20

Phoenix Channels

Websocket é uma API queestabelece conexões de

"soquete" entre um navegadorda web e um servidor

21

Phoenix Channels

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

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

22

Phoenix Channels

defmodule HelloPhoenix.UserSocket do use Phoenix.Socket

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

23

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

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

Phoenix Presence

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

clusters

26

Phoenix Presence

Conflict-free replicated data type(CRDT)

27

Phoenix Presence

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

28

Phoenix Presence

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

29

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

E o que mais?

31

32

“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

Benchmark

34

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

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

E contras?

37

38

39

Curva de aprendizado

Aprender o framework Phoenix é tranquilo

Mudar o paradigma de orientação a objetos para

funcional nem tanto

40

Curva de aprendizado

"Treinamos nossa equipe em 7 dias" - BrianCardarella

41

Falta de profissionais

42

Contra?

43

Onde aprender mais?

44

45

#myelixirstatus

46

47

Duvidas?

48

Obrigado

49