Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Introdução ao Phoenix framework

Arthur
August 20, 2016

Introdução ao Phoenix framework

Palestra apresentada no RuPy de Belo Horizonte em 20/08/2016. Falei sobre a história e a motivação da criação do Phoenix framework, channels, presence e plugs.

Arthur

August 20, 2016
Tweet

More Decks by Arthur

Other Decks in Programming

Transcript

  1. Sobre o que vou falar História O que é o

    Phoenix Framework Algumas features Prós e contras de se adotar 2
  2. 7

  3. 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
  4. 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
  5. 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
  6. pipeline :browser do plug :accepts, ["html"] plug :fetch_session plug :fetch_flash

    plug :protect_from_forgery plug :put_secure_browser_headers end Pipeline 17
  7. 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
  8. 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
  9. Phoenix Channels Websocket é uma API que estabelece conexões de

    "soquete" entre um navegador da web e um servidor 21
  10. Phoenix Channels defmodule 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} end end 24
  11. 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
  12. 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} end end 30
  13. 32

  14. “We do not have ONE web-server handling 2 millions sessions.

    We have 2 million webservers handling one session each.” “Because we have one web server per user we can easily make the system fault tolerant or scalable” Joe Armstrong 33
  15. Ecosistema moderno Technical Requirements Server HTTP 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
  16. Ecosistema otp Technical Requirements Server HTTP Server Erlang Request processiong

    Erlang Long-running requests Erlang Server-wide state Erlang Persistable data Erlang Background jobs Erlang Service crash recovery Erlang 36
  17. 38

  18. 39

  19. Curva de aprendizado Aprender o framework Phoenix é tranquilo Mudar

    o paradigma de orientação a objetos para funcional nem tanto 40
  20. 45

  21. 47