Phoenix: Веб-разработка в функциональном стиле.

Роман Смирнов

Системный архитектор @Speekify

romul

Что такое Phoenix?

Phoenix — веб-фреймворк для Elixir.
Elixir — функциональный ЯП под BEAM.
BEAM — виртуальная машина Erlang/OTP.

https://phoenixframework.org/

Зачем ещё один фреймворк?

  • Удобство разработки на уровне Ruby on Rails
  • Стабильность Erlang/OTP
  • Производительность на уровне Go

Идеология

Phoenix предоставляет удобный способ добавить взаимодействие с web в ваше приложение на Elixir.
Ответ от сервера — это запрос, пропущенный через серию последовательных трансформаций.

Plug.Conn

Plug

Спецификация для создания компонуемых функций для трансформации веб-запроса в ответ.

Plug-функция

(Plug.Conn.t, Plug.opts) :: Plug.Conn.t

Функция принимает на вход структуру Plug.Conn и опциональные настройки и возвращает модифицированную структуру Plug.Conn.

Пример:


  @spec discard_robots(Plug.Conn.t, Keyword.t) :: Plug.Conn.t
  def discard_robots(conn, _) do
    user_agent = conn |> get_req_header("user-agent") |> Enum.at(0, "")
    if UserAgent.bot?(user_agent) do
      conn |> put_status(200) |> json("Ok") |> halt
    else
      conn
    end
  end
            

Plug-модуль

В модуле должны быть реализованы 2 функции:

  • init/1 принимает список опций и возвращает настройки, которые автоматически передаются в функцию call/2
    init(Plug.opts) :: Plug.opts
  • call/2 имеет ту же сигнатуру, что и Plug-функция

    call(Plug.Conn.t, Plug.opts) :: Plug.Conn.t

Пример Plug-модуля


  defmodule Plug.RequestId do
    @behaviour Plug

    def init(opts) do
      Keyword.get(opts, :http_header, "x-request-id")
    end

    def call(conn, req_id_header) do
      conn
      |> get_request_id(req_id_header)
      |> set_request_id(req_id_header)
    end

    # ...
  end
          

Пример вызова:

plug Plug.RequestId, http_header: "custom-request-id"

Цепочка Plug-ов

  • Endpoint
  • Router
  • Controllers


$ mix phx.new back_to_school

Endpoint

Router

Controller


$ mix phx.gen.html Content Post posts name:string body:string published_at:datetime
            

Controller

Context

Schema

Template

Phoenix Channels

Позволяют осуществлять двунаправленную коммуникацию с клиентами через веб-сокеты или через long-polling для реализации soft-realtime функционала.
  • Предоставляет абстракцию над PubSub
  • С Phoenix поставляется клиент для JavaScript
  • Есть клиенты для мобильных платформ
    (iOS, Android, Windows Mobile)
  • 2M одновременных подключений и бродкаст за 1s

Спасибо за внимание!




Вопросы?