Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

ࣗݾ঺հ Twitter: @mururururu Github: @mururu
 
 The Original Author: StringIO, ExUnit.CaptureIO

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Node.js, Socket.IO

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

BEAM - ErlangVM

Slide 10

Slide 10 text

ܰྔϓϩηε

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

େมͦ͏

Slide 19

Slide 19 text

Phoenix Channel

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

$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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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