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

Web API サーバーとしての Elixir の可能性

Naoya Ito
August 28, 2015

Web API サーバーとしての Elixir の可能性

API Meetup Tokyo #9 での発表資料です

Naoya Ito

August 28, 2015
Tweet

More Decks by Naoya Ito

Other Decks in Technology

Transcript

  1. 8FC"1*αʔόʔͱͯ͠ͷ
    &MJYJSͷՄೳੑ
    /BPZB*UP
    ,BJ[FO1MBUGPSN *OD

    "1*.FFUVQ5PLZP

    View Slide

  2. ࡢࠓ͜Μͳ͜ͱ͋Γ·ͤΜ͔
    •  ͨͩͷ+40/"1*ʹ3BJMTͰ͸ŋŋŋ
    –  ϋΠτϥϑΟοΫͳҊ݅Ͱ࢖͍ͮΒ͍
    –  ཁ݅ʹରͯ͠ϝϞϦϑοτϓϦϯτ͕େ͖͗͢
    –  ઀ଓ਺͕ଟ͍ͱεέʔϧ͠ͳ͍
    –  ଱ো֐ੑʹෆ҆
    •  ʮεύΠΫͨ͠ͷͰམͪ·ͨ͠ʯͰ͸ࡁ·͞Εͳ͍ɻ޿ࠂ
    αʔόʔͱ͔

    View Slide

  3. ,BJ[FO1MBUGPSNͰ͸ŋŋŋ
    •  ҎԼͷέʔεͰ࣮ࡍʹ͋ͬͨ
    –  ޿ࠂ഑৴ͷ֎෦αʔόʔͱͷ΍ΓͱΓ
    •  ଟྔͷ઀ଓ
    –  3FEJTͱ*0ͯ͠ฦ౴͢Δ͚ͩͷ"1*αʔόʔ
    •  ཁ݅͸γϯϓϧɻෳࡶͳ.PEFM7JFXཁΒͳ͍
    •  Ͱ΋εύΠΫͰམͱͨ͘͠ͳ͍
    ͻͱ·ͣ/PEFKTͰ
    ରԠͨ͠

    View Slide



  4. fork()  
    ϚϧνϓϩηεϞσϧʹΑΔฒߦॲཧ
    ྫ3BJMTͷ࣮ߦ؀ڥ

    View Slide

  5. 1SPT$POT
    •  1SPT
    –  ҆શ
    •  ϦΫΤετ͝ͱʹϝϞϦۭؒ෼཭㱺Ϋϥογϡͯ͠΋
    ଞʹӨڹ͠ͳ͍
    –  ϓϩάϥϛϯάϞσϧ͕୯७ ಉظͰ0,

    –  ϚϧνίΞ
    •  $POT
    –  εέʔϥϏϦςΟʹ೉
    •  ϝϞϦେ㱺࠷େϓϩηε਺ಉ࣌ฒߦ਺্ݶ
    •  04ϓϩηεεϨουͷίϯςΩετεΠον

    View Slide

  6. ࣌ؒ
    A B A C D B ・・・
    select()  /  epoll()  
    ίϯςΩετ
    εΠον
    ΠϕϯτۦಈϞσϧʹΑΔฒߦॲཧ
    ྫ&WFOU.BDIJOF /PEFKT

    View Slide

  7. 1SPT$POT
    •  1SPT
    –  εέʔϥϏϦςΟ ߴ͍ฒߦॲཧੑೳ

    •  ϝϞϦϑοτϓϦϯτখ͍͞
    •  ಉ࣌઀ଓ਺͕૿͑ͯ΋εέʔϧ
    •  $POT
    –  ଱ো֐ੑʹ೉
    •  མͪΔͱ͖͸શ෦མͪΔ
    •  ϝϞϦϦʔΫ͜Θ͍
    –  ϓϩάϥϛϯάϞσϧ͕΍΍ෳࡶ˞/PEFKTͩͱͦΕ΄ͲͰ΋ͳ͍

    –  ϚϧνίΞ$16Λ࢖͍ͮΒ͍

    View Slide

  8. τϨʔυΦϑ
    •  ฒߦॲཧੑೳ͸Ք͛ͳ͍͕҆શͰ୯७ͳ
    Ϛϧνϓϩηε εϨου
    Ϟσϧ͔
    •  ฒߦॲཧੑೳ͕ߴ͍͕ӡ༻ʹؾΛݣ͏Πϕ
    ϯτۦಈϞσϧ͔
    ͙͵͵ŋŋŋ

    View Slide

  9. ͦ͜Ͱ&SMBOHͰ͢

    View Slide

  10. &SMBOHͷ࣮ߦ؀ڥ
    •  #&". &SMBOH7.

    – ܰྔϓϩηεŋŋŋ࣮ߦίϯςΩετ
    •  খ͍͞ϫʔυɺىಈʹdϚΠΫϩඵ
    – ฒߦॲཧੑೳ͕ߴ͍
    •  7.͕ܰྔϓϩηεΛεέδϡʔϦϯά
    –  7.εϨουຖʹϥϯΩϡʔ
    –  ཪଆͰ͸ඇಉظεϨουϓʔϧ
    ref:  h+p://www.erlang-­‐factory.com/upload/presenta=ons/708/HitchhikersTouroEheBEAM.pdf

    View Slide

  11. ΞΫλʔϞσϧ
    ϝοηʔδύογϯά
    ஋͸͢΂ͯίϐʔ
    4IBSFE/PUIJOH

    ϝʔϧϘοΫεʹ
    ΩϡʔΠϯά

    View Slide

  12. &SMBOHͰͷ
    ωοτϫʔΫαʔόʔ
    •  ϦΫΤετʹܰྔϓϩηε
    – ҆શ
    •  ܰྔϓϩηεŋŋŋಠཱ࣮ͨ͠ߦίϯςΩετ
    •  4IBSFE/PUIJOHŋŋŋ͋Δϓϩηε͕Ϋϥογϡ
    ͯ͠΋໰୊ͳ͍
    – ߴ͍ฒߦॲཧੑೳ
    •  ܰྔŋŋŋϝϞϦϑοτϓϦϯτখ͍͞
    •  Ϣʔβʔϥϯυ04ͷίϯςΩετεΠονͳ
    ͠

    View Slide

  13. &SMBOHͷϝϞϦϞσϧ
    •  QFS1SPDFTT($
    –  ϓϩηεຖʹ($
    •  άϩʔόϧ($ͩͱશମʹӨڹ͢Δ
    •  ϓϩηε෼཭
    –  4IBSFE/PUIJOH
    –  ϓϩηε)FBQ
    •  ($͸ܰྔϓϩηεຖʹ૸ΒͤɺཁΒͳ͘ͳͬͨΒഇغ ؆
    ୯Ͱޮ཰͕Α͍

    ҆ఆͨ͠Ԡ౴ੑೳ
    ߴ͍଱ো֐ੑ

    View Slide

  14. 4VQFSWJTPS
    Supervisor ϓϩηε
    ؂ࢹ
    ʮಥવͷࢮʂʯ
    ϓϩηεࢮΜͩ͠ɺઓུ
    ʹ߹Θͤͯ࠶ىಈ͠ͱ͘
    Θ
    crash

    View Slide

  15. -FUJUDSBTI
    •  ࣦഊʹඋ͑ͳ͍ɻྫ֎Λั·͑ͳ͍
    •  4VQFSWJTPSͰ؂ࢹ͓͍ͯͯ͠ɺͦͷ·
    ·ى͜͢ͳΓύϥϝʔλม͑ͯϦτϥΠ͞
    ͤΔͳΓŋŋŋ
    ނোରԠϞσϧ͕
    ݴޠج൫Ͱఏڙ

    View Slide

  16. /PEFKTWT&SMBOH
    •  /PEFKTWT&SMBOH
    –  IUUQLVFOJTIJIBUFOBEJBSZKQFOUSZ

    –  ނোϞσϧɺίʔυมߋɺίʔυҠಈɺແఀࢭΞοϓάϨʔυɺ
    ͜͏͍͏ͷͬͯYͰμ΢ϯλΠϜͷγεςϜͩͱେࣄͩΑ
    Ͷɻ +PF"SNTUSPOH

    –  ݁ہੑೳΑΓ΋ނো଱ੑͳΜͩΑͶᴷͦΕͳ

    View Slide

  17. Ͱ΋&SMBOHͳΜͰ͠ΐ͏

    View Slide

  18. ͦ͜Ͱ&MJYJS

    View Slide

  19. &MJYJS
    •  &SMBOH7.ͷ্Ͱಈ͘ݴޠ
    –  &SMBOH7.ͷڧΈ ฒߦॲཧੑೳɺ଱ো֐ੑ
    Λͦͷ··ʹɺγϯ
    λοΫεΛೃછΈ΍͘͢
    •  KPTFWBMJN&SMBOHͰݟͨ͜ͱ͸ΈΜͳؾʹೖ͚ͬͨͲɺݟͳ͔ͬͨ͜ͱ
    ͸ΈΜͳݏ͍
    –  &SMBOHͱ૬ޓޓ׵
    –  051΋΋ͪΖΜ͋ΔΑ
    •  Ϟμϯͳύοέʔδ؅ཧγεςϜɺ-B[ZίϨΫγϣϯ 4USFBN
    ɺ
    ϓϩτίϧͳͲͷ௥Ճཁૉ
    •  ৄ͘͠͸
    –  IUUQTTQFBLFSEFDLDPNOBPZBFMJYJSHPTIBPKJF

    View Slide

  20. View Slide

  21. Ͱ΋8FC"1*࡞Δͷ
    ೉͍͠ΜͰ͠ΐ͏

    View Slide

  22. 1IPFOJYᴷ&MJYJSPO3BJMT

    View Slide

  23. View Slide

  24. 1IPFOJY
    Cowboy
    Plug
    Phoenix
    .JEEMFXBSF
    )5514FSWFS
    &SMBOH1SPDFTT
    3FFRVFTU

    View Slide

  25. ϕϯνϚʔΫ
    ref:  h+p://www.li+lelines.com/blog/2014/07/08/elixir-­‐vs-­‐ruby-­‐showdown-­‐phoenix-­‐vs-­‐rails/
    $  ./wrk  -­‐t12  -­‐c800  -­‐d180S  -­‐-­‐timeout  2000  "http://tranquil-­‐brushlands-­‐6459.herokuapp.com/showdown"  
    Running  3m  test  @  http://tranquil-­‐brushlands-­‐6459.herokuapp.com/showdown  
       12  threads  and  800  connections  
       Thread  Stats      Avg            Stdev          Max      +/-­‐  Stdev  
           Latency      318.52ms    139.92ms      1.39s        82.03%  
           Req/Sec      224.42          57.23      368.00          68.50%  
       484444  requests  in  3.00m,  0.99GB  read  
       Socket  errors:  connect  0,  read  9,  write  0,  timeout  0  
    Requests/sec:      2691.03  
    Transfer/sec:            5.65MB
    $  ./wrk  -­‐t12  -­‐c800  -­‐d180S  -­‐-­‐timeout  2000  "http://dry-­‐ocean-­‐9525.herokuapp.com/showdown"  
    Running  3m  test  @  http://dry-­‐ocean-­‐9525.herokuapp.com/showdown  
       12  threads  and  800  connections  
         Thread  Stats      Avg            Stdev          Max      +/-­‐  Stdev  
           Latency          3.07s          2.06s        8.36s        70.39%  
           Req/Sec        24.65            9.97        63.00          67.10%  
       54256  requests  in  3.00m,  122.50MB  read  
       Socket  errors:  connect  0,  read  1,  write  0,  timeout  0  
    Requests/sec:        301.36  
    Transfer/sec:        696.77KB
    Phoenix
    Rails  w/  Puma
    ॾ৚݅͋ΔͷͰߟ࡯͸ࣗݾ੹೚Ͱɻ
    1IPFOJY͕ൺֱͯ͠଎͍ͷ͸ؒҧ
    ͍ͳͦ͞͏

    View Slide

  26. ΄͔
    •  &MJYJSຊ൪Քಇ࣮੷
    – υϦίϜ͞Μɺ%"6ສͷ"Eͷ"1*
    •  GBMPPENBSV &MJYJSͷ(SBQF

    •  IUUQXXXTMJEFTIBSFOFUPISTIJCVZBFYFMJYJS
    •  1IPFOJYͷ$IBOOFM
    – ઀ଓܰྔϓϩηεͰॲཧ͢Δϝοηʔδ
    ϋϯυϥ
    •  8FC4PDLFU

    View Slide

  27. ྑ͍͜ͱ͹͔Γݴ͍·͕ͨ͠ŋŋŋ
    •  ฒߦੑೳ͕ߴ͍ɺԠ౴ੑೳ͕ྑ͍ͱ͸ݴ͕ͬͨʮܭࢉ͕
    ଎͍ʯͱ͸ݴͬͯͳ͍
    –  1IPFOJYελοΫ͸3BJMTΑΓ͸଎͍ɺ͚Ͳ΋
    –  ಈతܕ෇͚ݴޠͰ͢͠
    –  ˞ҰԠ)J1&ʹ͢Δͱ଎͘͸ͳΔ΋Α͏
    •  ؔ਺ܕݴޠͱͯ͠͸ͦ͜·ͰߴػೳͰ͸ͳ͍
    •  ݸਓతͳ࿩
    େن໛ӡ༻ͯ͠ͳ͍ͷͰ$POTΛޠΔʹ
    ஌ݟ଍Γͳ͍
    •  &MJYJSྲྀߦΔ͔͸·ͩະ஌਺
    –  ϓϩμΫγϣϯ౤ೖࣄྫ͸·ͩ͜Ε͔Β

    View Slide

  28. લฤॻ͖·ͨ͠ɻ
    ޙฤ͸࣍߸Ͱ

    View Slide

  29. View Slide

  30. ׬

    View Slide