introdução ao phoenix framework
TRANSCRIPT
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