$30 off During Our Annual Pro Sale. View Details »

「ElixirがリアルタイムWebに強い」 というのは本当か?

mururu
April 01, 2017

「ElixirがリアルタイムWebに強い」 というのは本当か?

Elixir Conf Japan 2017

mururu

April 01, 2017
Tweet

More Decks by mururu

Other Decks in Technology

Transcript

  1. ʮElixir͕ϦΞϧλΠϜWebʹڧ͍ʯ
    ͱ͍͏ͷ͸ຊ౰͔ʁ
    Elixir Conf Japan 2017

    View Slide

  2. ࣗݾ঺հ
    Twitter: @mururururu
    Github: @mururu


    The Original Author: StringIO, ExUnit.CaptureIO

    View Slide

  3. ʮElixir͕ϦΞϧλΠϜWebʹڧ͍ʯ
    ͱ͍͏ͷ͸ຊ౰͔ʁ

    View Slide

  4. “ϦΞϧλΠϜɾ΢ΣϒʢReal-time webʣ͸ɺ
    Πϯλʔωοτ্ͷϢʔβʔͷॻ͖ࠐΈ΍ಈ޲
    Λɺଈ͔࣌ͭେن໛ʹଞͷϢʔβʔͱڞ༗͢Δ
    ࢓૊Έͷ૯শɻ”
    - Wikipedia

    View Slide

  5. Node.js, Socket.IO

    View Slide

  6. • ϩϯάϙʔϦϯά
    • SSE
    • WebSocket

    View Slide

  7. • ίωΫγϣϯͷҡ࣋
    • ૒ํ޲௨৴
    • ௿஗Ԇ
    WebSocket
    $MJFOU $MJFOU
    Server
    $MJFOU

    View Slide

  8. • େྔͷίωΫγϣϯͷҡ࣋(c10k, c100k?)
    • ԟʑʹͯ͠εςʔτϑϧ
    • ௿஗Ԇ
    • ଱ো֐ੑ
    ՝୊

    View Slide

  9. BEAM - ErlangVM

    View Slide

  10. ܰྔϓϩηε

    View Slide

  11. ܰྔϓϩηε
    • N:MεϨουϞσϧ
    • minimum 309 words
    • ϝοηʔδύογϯά
    • Shared nothing
    • ܰྔϓϩηε͝ͱͷGC
    • ϓϦΤϯϓςΟϒͳεέʔδϡʔϦϯά
    1
    spawn fn -> 1 + 2 end
    spawn fn -> loop() end
    spawn dead

    View Slide

  12. ܰྔϓϩηε
    • N:MεϨουϞσϧ
    • minimum 309 words
    • ϝοηʔδύογϯά
    • Shared nothing
    • ܰྔϓϩηε͝ͱͷGC
    • ϓϦΤϯϓςΟϒͳεέʔδϡʔϦϯά
    1 1 1
    045ISFBE 045ISFBE

    View Slide

  13. ܰྔϓϩηε
    • N:MεϨουϞσϧ
    • minimum 309 words
    • ϝοηʔδύογϯά
    • Shared nothing
    • ܰྔϓϩηε͝ͱͷGC
    • ϓϦΤϯϓςΟϒͳεέʔδϡʔϦϯά
    1
    309 words

    View Slide

  14. • N:MεϨουϞσϧ
    • minimum 309 words
    • ϝοηʔδύογϯά
    • Shared nothing
    • ܰྔϓϩηε͝ͱͷGC
    • ϓϦΤϯϓςΟϒͳεέʔδϡʔϦϯά
    ܰྔϓϩηε
    1 1
    receive do
    {:get, key, caller} ->
    send caller, find(key)
    end

    View Slide

  15. ܰྔϓϩηε
    • N:MεϨουϞσϧ
    • minimum 309 words
    • ϝοηʔδύογϯά
    • Shared nothing
    • ܰྔϓϩηε͝ͱͷGC
    • ϓϦΤϯϓςΟϒͳεέʔδϡʔϦϯά
    1 1
    Copy

    View Slide

  16. ܰྔϓϩηε
    • N:MεϨουϞσϧ
    • minimum 309 words
    • ϝοηʔδύογϯά
    • Shared nothing
    • ܰྔϓϩηε͝ͱͷGC
    • ϓϦΤϯϓςΟϒͳεέʔδϡʔϦϯά
    1 1
    045ISFBE
    resume
    stopped

    View Slide

  17. • େྔͷίωΫγϣϯͷҡ࣋(c10k, c100k?)
    • ԟʑʹͯ͠εςʔτϑϧ
    • ௿஗Ԇ
    • ଱ো֐ੑ
    ՝୊

    View Slide

  18. େมͦ͏

    View Slide

  19. Phoenix Channel

    View Slide

  20. Phoenix Channel
    • ιϑτϦΞϧλΠϜͳ ʢWebʣΞϓϦέʔ
    γϣϯΛ༰қʹ࣮ݱ͢ΔϑϨʔϜϫʔΫ
    • ϓϥΨϒϧͳτϥϯεϙʔτ
    • ϓϥΨϒϧͳ PubSub όοΫΤϯυ

    View Slide

  21. Phoenix Channel
    • Phoenix.Socket
    • ΫϥΠΞϯτ͔Βͷड͚ޱ
    • Phoenix.Channel
    • τϐοΫ୯Ґͷνϟϯωϧͷ PubSub

    View Slide

  22. Phoenix.Socket
    defmodule HelloPhoenix.UserSocket do
    use Phoenix.Socket
    channel "room:*", HelloPhoenix.RoomChannel
    def connect(_params, socket) do
    {:ok, socket}
    end
    def id(_socket), do: nil
    end
    ग़య: http://www.phoenixframework.org/docs/channels

    View Slide

  23. Phoenix.Channel
    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
    end
    ग़య: http://www.phoenixframework.org/docs/channels

    View Slide

  24. $MJFOU
    gen_tcp, ranch,
    cowboy
    Phoenix.Socket ->

    Phoenix.Transports.WebSocket
    Phoenix.Channel ->
    Phoenix.Channel.Server
    Phoenix.PubSub.PG2
    $MJFOU
    gen_tcp, ranch,
    cowboy
    Phoenix.Socket ->

    Phoenix.Transports.WebSocket
    Phoenix.Channel ->
    Phoenix.Channel.Server
    x topics x topics

    View Slide

  25. σϞ
    used: https://github.com/
    koudelka/visualixir

    View Slide

  26. ·ͱΊ
    • ϦΞϧλΠϜWebʹ͓͚Δ՝୊
    • ܰྔϓϩηε
    • ͦΕΛ༰қʹར༻Ͱ͖Δ Phenix Channel

    View Slide

  27. ʮElixir͕ϦΞϧλΠϜWebʹڧ͍ʯ
    ͱ͍͏ͷ͸ຊ౰͔ʁ
    Elixir Conf Japan 2017

    View Slide