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

Swiftに適したサーバーアーキテクチャを再考して実装までしてみる

Yuki Takei
December 19, 2016

 Swiftに適したサーバーアーキテクチャを再考して実装までしてみる

Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016

Yuki Takei

December 19, 2016
Tweet

More Decks by Yuki Takei

Other Decks in Technology

Transcript

  1. Swiftʹదͨ͠αʔόʔΞʔΩςΫ
    νϟΛ࠶ߟ࣮ͯ͠૷·Ͱͯ͠ΈΔ
    Yuki Takei(noppoMan) @Tokyo-Server-Side Swift Meetup#5 Dec, 19, 2016

    View Slide

  2. TSSS Meetupɺ
    ͳΜͱ൒೥ͿΓͷ։࠵Ͱ͢ʂ

    View Slide

  3. ࣗݾ঺հ

    View Slide

  4. Swift͕OpenԽ͔ͯ͠Βɺ
    ৭ʑͳϥΠϒϥϦΛ࡞ͬͯެ։͍ͯ͠·͢ɻ

    View Slide

  5. OSS
    • Slimane -> Web Framework
    • Skelton -> Event Driven HTTP Server
    • Suv -> Async Net, I/O Platform (libuv based)

    View Slide

  6. Slimaneͷ։ൃணख͔Βૣ͍͜ͱʹ΋͏໿1೥
    (࠷ۙ͸͋·Γ΍ͬͯͳ͍ͷͰ͕͢ɺɺ)

    View Slide

  7. ͔ͭͯ͸ɺSwift͕ຬ଍ʹLinuxͰ͸ಈ͔ͣ

    View Slide

  8. Server-Side-SwiftͷΩʔϓϨΠϠʔͨͪ΋ϑϨʔϜϫʔΫͳͲ
    ͷେ෦෼ΛࣗલͰ࡞͍ͬͯ·ͨ͠ɻ

    View Slide

  9. ͔͠͠

    View Slide

  10. Swift3͕ϦϦʔε͞ΕͯɺServer SideͰ΋Swiftͷඪ४APIΛੵ
    ۃతʹ࢖͍ͬͯ͜͏ͱ͍ͬͨྲྀΕʹͳ͖͍ͬͯͯ·͢ɻ

    View Slide

  11. ͦ͜ͰɺࠓͷServe Side Swiftʹదͨ͠
    αʔόʔΞʔΩςΫνϟͱ͸ҰମͲΜͳ΋ͷͳͷ͔ʁ

    View Slide

  12. ͦΕΛࣗ෼ͳΓʹ࠶ߟ͠ɺ࣮૷ͯ͠Έ·ͨ͠ɻ
    ͱ͍͏͓࿩Ͱ͢ɻ

    View Slide

  13. ·ͣ͸ɺࠓճͷൃදͷωλͱͳΔϥΠϒϥϦͷ͝঺հͰ͢

    View Slide

  14. View Slide

  15. • Swift3͕ඪ४Ͱఏڙ͢ΔAPIΛੵۃతʹ࢖ͬͨωοτ
    ϫʔΫϥΠϒϥϦ
    • ϑϨʔϜϫʔΫͰ͸ͳ͘ɺ͋͘·ͰωοτϫʔΫϓϩ
    άϥϛϯά؀ڥ
    • جຊతʹ͸ಉظI/OͷAPIΛఏڙ (callbackΛۃྗഉআ)
    • ඇಉظϓϩάϥϛϯά͸ಠࣗͷAPIΛར༻͢Δ(ޙड़)
    • ݱࡏ͸HTTP(S)ɺTCPͷServer/ClientͱIP(v4, 6)Λఏڙ
    Prorsumͱ͸ʁ

    View Slide

  16. Ͱ͸ૣ଎ɺSwiftʹదͨ͠αʔόʔΞʔΩςΫνϟͱ͸Կͳͷ͔
    ୳͍͖͍ͬͯͨͱࢥ͍·͢ɻ

    View Slide

  17. ͦͷલʹɺͲΜͳछྨͷαʔόʔΞʔΩςΫνϟ͕͋ͬͨͷ͔ɺ
    ͓͢͜͠͞Β͍Ͱ͢ɻ

    View Slide

  18. ୅දతͳαʔόʔΞʔΩςΫνϟ
    • ϚϧνεϨουϞσϧ
    • ϚϧνϓϩηεϞσϧ
    • Πϕϯτۦಈ
    • ϋΠϒϦουϞσϧ

    View Slide

  19. ϚϧνεϨουϞσϧ
    main
    process
    worker
    thread
    worker
    thread
    worker
    thread
    client
    client
    client
    thread
    ϦΫΤετຖʹthreadΛ࡞Γ(࠷ۙ͸Pool͕ओྲྀ)ɺͦͷthread্ͰϦΫΤετΛࡹ͘ɻ
    ϓϩηεͱҧ͍ϝϞϦΛڞ༗Ͱ͖ΔɻʢϩοΫʹΑΔഉଞ੍ޚඞਢʣ
    C10K໰୊͕࿩୊ʹͳͬͨɻ
    thread
    thread

    View Slide

  20. ϚϧνϓϩηεϞσϧ
    ਤ͸ϚϧνεϨουʹࣅ͍ͯΔ͕ɺϓϩηεΛϑΥʔΫͯ͠ϝϞϦۭؒΛ෼͚Δɻ
    ϑΥʔΫͨ͠ϓϩηε಺ͰϦΫΤετΛࡹ͍͍ͯ͘ɻ
    ਌ࢠؒͷ௨৴͸υϝΠϯιέοτΛ࢖͏
    main
    process
    worker
    process
    fork
    worker
    process
    worker
    process
    client
    client
    client
    fork
    fork

    View Slide

  21. ΠϕϯτۦಈϞσϧ
    γϯάϧίΞ্ʹΠϕϯτϧʔϓΛ࡞੒͠ɺιέοτ΍ϑΝΠϧγεςϜ΁
    ͷॻ͖ࠐΈ࣌ʹΠϕϯτ(callback౳)ΛൃՐ͢ΔɻγϯάϧίΞͷͨΊɺ
    ϨʔείϯσΟγϣϯ΍deadlock౳Λؾʹ͢Δඞཁ͕ແ͍͕ɺϚϧνίΞ
    Λ׆͔͢͜ͱ͕ग़དྷͳ͍ɻC10K໰୊Λղܾͨ͠
    main
    process
    select, epoll, kqueue
    client
    client
    client

    View Slide

  22. ϋΠϒϦοτϞσϧ
    Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳ਺ͷΞʔΩςΫ
    νϟΛ૊Έ߹Θͤͨ΋ͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔͸ෆ໌)
    Node.jsͰ͸ClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess
    ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ
    master
    client
    worker
    worker
    uv_loop
    uv_loop
    uv_loop
    passing fds
    passing fds
    fork
    fork
    client

    View Slide

  23. ͜ͷ಺ɺSlimane͸libuvϕʔεͷͨΊɺNode.jsͱશ͘Ұॹͷ
    Πϕϯτۦಈ+WorkerProcessϞσϧΛ࠾༻͍ͯ͠·ͨ͠ɻ

    View Slide

  24. ϋΠϒϦοτϞσϧ
    Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳ਺ͷΞʔΩςΫ
    νϟΛ૊Έ߹Θͤͨ΋ͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔͸ෆ໌)
    Node.jsͰ͸ClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess
    ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ
    master
    client
    worker
    worker
    uv_loop
    uv_loop
    uv_loop
    passing fds
    passing fds
    fork
    fork
    client

    View Slide

  25. ϋΠϒϦοτϞσϧ
    Πϕϯτۦಈ+WorkerThread OR WorkerProcessϞσϧͳͲෳ਺ͷΞʔΩςΫ
    νϟΛ૊Έ߹Θͤͨ΋ͷ(͜ͷݴ༿͕࣮ࡏ͢Δ͔͸ෆ໌)
    Node.jsͰ͸ClusterϞδϡʔϧΛར༻͢Δ͜ͱͰɺΠϕϯτۦಈ+WorkerProcess
    ϞσϧΛఏڙ͢Δɻ͜ΕʹΑΓɺϚϧνίΞΛ׆͔͢͜ͱ͕ՄೳͱͳΔɻ
    master
    client
    worker
    worker
    uv_loop
    uv_loop
    uv_loop
    passing fds
    passing fds
    fork
    fork
    client
    ͜ΕͰ͢Ͷ

    View Slide

  26. Ͱ͸ɺProrsum͸ͱ͍͏ͱʁ

    View Slide

  27. ProrsumͷΞʔΩςΫνϟΛඥղ͘લʹɺ
    ·ͣ͸SwiftͷඇಉظI/O΍ฒྻॲཧͷํ๏ΛֶͿඞཁ͕͋Γͦ
    ͏Ͱ͢

    View Slide

  28. SwiftͰ͸ɺiOSͳͲͰUIඳըΛࢭΊͯ͠·͏Α͏ͳॏ͍ॲཧΛ
    ॻ͘ࡍʹɺGCDͱ͍͏APIΛ࢖͍͔ͬͯͨͱࢥ͍·͢

    View Slide

  29. Grand Central Dispatch(GCD)
    • DispatchQueue
    • DispatchSource
    • DispatchGroup
    • DispatchSemaphore
    ௨ৗ͸ΞϓϦέʔγϣϯதʹهड़͢ΔεϨου؅ཧ༻ͷίʔυΛɺ
    γεςϜϨϕϧͰ࣮૷ͨ͠΋ͷ (By Apple ฒߦϓϩάϥϛϯάΨΠυ)
    https://developer.apple.com/jp/documentation/ConcurrencyProgrammingGuide.pdf
    ୅දతͳ΋ͷ͸ҎԼʁ

    View Slide

  30. ཁ͸ɺThreadͷ؅ཧ΍ฒྻϓϩάϥϛϯά͸θϩ͔Β࣮૷
    ͢ΔͱେมͳͷͰɺγεςϜଆʢLinuxͰ͋Ε͹ϥΠϒϥϦ
    ଆʣͰ࣮૷ͨ͠΋ͷΛɺϓϩάϥϚʹ࢖͍΍͘͢ఏڙ͠·
    ͢Αͱ͍͏΋ͷɻ

    View Slide

  31. Dispatch Queue
    • λεΫΛqueuingͯ͠ɺ͋ΔThread্Ͱඇಉظ/ಉظత
    ʹ࣮ߦ͢Δ͜ͱ͕ग़དྷΔAPI
    • mainQueue, GlobalQueueɺϢʔβʔ࡞੒Queueʹ෼͔
    ΕΔ
    • SerialͱConcurrentͷattribute͕͋Δ
    • queueʹରͯ͠༏ઌॱҐͷίϯτϩʔϧ͕Մೳ
    • ҰͭͷQueue͸࣮ߦ׬ྃ·ͰϒϩοΫ͞ΕΔ

    View Slide

  32. Dispatch Queue
    Serial
    Task Task Task
    Task Task
    queue.async {}
    Concurrent
    Task Task
    Task Task
    Task Task Task Task
    queue.async {}
    executing
    waiting
    balancing

    View Slide

  33. Dispatch Source
    • ϑΝΠϧهड़ࢠͳͲΛ؂ࢹͯ͠ɺԿ͔ͷΠϕϯτ
    Λػʹొ࿥ࡁΈͷcallbackΛݺͼग़ͨ͢ΊͷAPI
    • ΠϕϯτυϦϒϯͳϓϩάϥϛϯά͕ॻ͚Δ
    • OSґଘͳඇಉظؔ਺Λ͏·͘ϥοϓͯ͘͠Εͯ
    ͍Δ(libevʹ͍ۙ)
    • ίʔυΛಡΜͩΒɺMacͰ͸kqueueΛ࢖ͬͯ
    ϑΝΠϧهड़ࢠΛ؂ࢹ͍ͯͨ͠

    View Slide

  34. Dispatch SourceͰ؂ࢹՄೳͳ΋ͷͷҰ෦
    • Timer
    • Signal
    • FileSystem
    • Socket
    • MemoryPressure

    View Slide

  35. ͨͱ͑͹ɺϑΝΠϧ΁ͷॻ͖ࠐΈΛݕ஌ͯ͠ɺϓ
    ϩάϥϜΛ࠶ίϯύΠϧ͢ΔΑ͏ͳϓϩάϥϜͳ
    Ͳ͕؆୯ʹॻ͚ΔΑ͏ʹͳΓ·͢ɻ
    (LinuxͰ͸ݱঢ়epoll࢖͍ͬͯͳ͍ͨΊɺKitura͸ࣗલͰepoll
    Λॻ͍ͯ·ͨ͠স)

    View Slide

  36. ͜͜·Ͱந৅Խ͞ΕͨAPI͕͋ΔͷͰɺ
    GCDΛ׆͔ͨ͠ΞʔΩςΫνϟ͕SwiftͰ͸ྑͦ͞͏Ͱ͢

    View Slide

  37. ͦΕΒΛ౿·͑ɺࠓճܾ·ͬͨΞʔΩςΫνϟ͕ͪ͜Β

    View Slide

  38. ProrsumͷαʔόʔΞʔΩςΫνϟ
    DispatchSource + DispatchQueueΛ࢖ͬͨ
    Πϕϯτۦಈ + WorkerThreadͷϋΠϒϦοτϞσϧ
    main
    thread
    DispatchSourceͰɺ
    listeningSocketΛ؂ࢹ
    Queue
    Queue
    Queue
    Queue Queue
    Queue Queue
    Queue Queue
    client
    DispatchQueue(concurrent)
    nonblocking I/O
    blocking I/O

    View Slide

  39. GCDʹΑΓɺΠϕϯτۦಈϞσϧͷϚϧνίΞΛ׆͔ͤͳ͍໰
    ୊Λ1ϓϩηε͚ͩͰղܾͰ͖·ͨ͠ɻ
    (CPUΛ࢖͍੾Ε͍ͯͳ͍ͱ͍͏ผ໰୊͕·ͩ͋Δ…)

    View Slide

  40. ·ͨɺγϯάϧϓϩηεͱ͍͏͜ͱͰ
    Slimaneʹൺ΂ͯϓϩηε؅ཧ͸ඇৗʹ؆୯ʹ

    View Slide

  41. ͔͠͠ɺ·ͨ৽ͨͳ໰୊͕ൃੜ

    View Slide

  42. Slimane͸׬શͳΠϕϯτۦಈαʔόʔͩͬͨͷͰɺɺ

    View Slide

  43. View Slide

  44. CallBack Hell!!

    View Slide

  45. View Slide

  46. callbackͷ໰୊఺
    • ͦ΋ͦ΋Swiftඪ४Ͱ͸ඇಉظύϥμΠϜʹऑ͍ (Promise΍
    FutureɺAsync/Await͕ݴޠػೳʹͳ͍)
    • ΤϥʔϋϯυϦϯά͕೉͍͠(callbackຖʹΤϥʔॲཧ͕ඞཁ)
    • try catchͱ૬ੑѱ͍
    • ॥؀ࢀরΛ࡞Γ΍͍͢ʢΩϟϓνϟϦετΛॻ͖๨ΕΔʣ
    • return͠๨Εͯcallback͕2ճݺ͹ΕΔ໰୊
    • @escapingͱ͔ɺ(T)->Voidͱ͔Կճ΋ॻ͘ͷ໘౗

    View Slide

  47. ͔͠͠ɺɺ

    View Slide

  48. GCD΋ɺඇಉظॲཧͷ݁ՌΛblockͰड͚औΔͱ͍͏Ξ
    ϓϩʔνΛ࠾༻͍ͯ͠·ͨ͠ɺɺ
    ʢͱ͸͍͑ɺ͜ΕʹΑΓɺϨʔείϯσΟγϣϯͳͲΛ͋·Γؾʹ͠ͳͯ͘ྑ͘ͳ
    Γ·͢ɻʣ

    View Slide

  49. block = callback

    View Slide

  50. ·ɺ·͔͞ww

    View Slide

  51. View Slide

  52. View Slide

  53. ͑ɺ݁ہwww

    View Slide

  54. ͪΐͬɺ଴ͯΑ͒

    View Slide

  55. SwiftͰαʔόʔॻ͘ͷ͖͋ΒΊΑ͏͔ͳ…
    ஫) DispatchGroup΍DispatchSemaphore
    Ͱ͋Δఔ౓callbackΛແ͘͢͜ͱ͸ग़དྷ·͢

    View Slide

  56. ͨͩɺΈ͞ͳΜࢥ͍ग़͍ͯͩ͘͠͞ɻ

    View Slide

  57. ඇಉظͷϑϩʔ੍ޚΛcallbackҎ֎Ͱղܾͨ͋͠ͷݴޠΛ

    View Slide

  58. View Slide

  59. ……….

    View Slide

  60. GoݴޠͩΑʔ

    View Slide

  61. Goݴޠͱ͸
    Go͸ϓϩάϥϛϯάݴޠͷͻͱͭɻGoogleʹΑͬͯ։ൃ
    ͞Ε͓ͯΓ[4]ɺઃܭʹϩϒɾύΠΫɺέϯɾτϯϓιϯΒ
    ͕ؔΘ͍ͬͯΔɻ
    ओͳಛ௃ͱͯ͠ɺܰྔεϨοσΟϯάͷͨΊͷػೳɺ
    PythonͷΑ͏ͳಈతܕ෇͚ݴޠͷΑ͏ͳϓϩάϥϛϯάͷ
    ༰қੑɺͳͲ͕͋ΔɻGoॲཧܥͱͯ͠͸ίϯύΠϥͷΈ͕
    ։ൃ͞Ε͍ͯΔɻ
    Wikipedia, Go (ϓϩάϥϛϯάݴޠ)ΑΓ

    View Slide

  62. Goݴޠͷฒߦ/ฒྻॲཧ
    GoݴޠͰ͸GoroutineΛ࢖ͬͯɺฒߦ/ฒྻॲཧΛ࣮ݱ͍ͯ͠·͢ɻ
    ฒߦ(Concurrent) ฒྻ(parallel)

    View Slide

  63. Goroutine
    Goroutine͸ෳ਺Thread্ʹଟॏԽ͞ΕͨCoroutineͷΑ͏ͳಈ࡞Λ͢Δɻ
    Ұͭͷgoroutine͕௕͍࣌ؒϒϩοΫ͢Α͏ͳؔ਺Ͱ΋ɺผͷgoroutineʹhand off͠
    ͯॲཧΛଓߦ͢ΔͨΊɺCPUΛ༨Βͤͣʹޮ཰తʹϓϩάϥϜΛ࣮ߦͰ͖Δ
    G1
    G2
    G3
    G4 G5
    sleep(1)
    G6
    G4
    G5
    sleep(1)
    G6 G8
    G4
    G7
    G9
    thread1
    thread2
    thread3

    View Slide

  64. Channel
    Gorotuine͸ThreadؒΛ·͍ͨͰ࣮ߦ͞ΕΔͨΊɺGoroutineಉ࢜ͰҰͭͷม਺΁ΞΫ
    ηε͢ΔͱRace Condition͕ൃੜͯ͠͠·͏ɻ
    ͦΕΛ๷͙ͨΊʹɺGoͰ͸Channelͱ͍͏ػೳ͕ఏڙ͞Ε͓ͯΓɺͦΕΛ࢖ͬͯ஋
    Λૹड৴͢Δ
    G1
    G2
    G3
    send
    send
    send
    main
    thread
    receive
    Channel

    View Slide

  65. ίʔυ
    ͜ͷϓϩάϥϜͷ݁Ռ͸ɺHello WorldͱWorld HelloͷͲͪΒ
    ͔ʹͳΓ·͢

    View Slide

  66. goroutineͰ͔֬ʹthreadΛ࢖ͬͨฒྻॲཧʢඇಉظॲཧʣ
    ͕ߦΘΕ͍ͯΔ͜ͱ͕Θ͔Γ·ͨ͠ɻ

    View Slide

  67. View Slide

  68. ඇಉظͰ͸͋Δͷʹɺίʔυ͸ͱͯ΋ಉظతͰ͢ΑͶɻ

    View Slide

  69. ͳͥͳΒɺChannelͷૹड৴͸ϒϩοΫ͞ΕΔ͔ΒͰ͢ɻ

    View Slide

  70. = ChannelΛ࢖ͬͨഉଞ੍ޚͰ͢Ͷ

    View Slide

  71. DispatchQueue͸ThreadϕʔεͰͨ͠ɻ

    View Slide

  72. ͱ͍͏͜ͱ͸ʂ

    View Slide

  73. Goroutine+ChannelͷΠϯλʔϑΣʔεΛ࢖͑͹ɺ
    SwiftͰ΋ඇಉظॲཧ͕ಉظతʹॻ͚ͦ͏Ͱ͢ɻ
    (Context switch͸OSଆͰ͕͢..)

    View Slide

  74. ͦ͜ͰɺProrsumʹGoroutineͱChannelͷΑ͏ͳػೳΛ࣮૷͠
    ͯΈ·ͨ͠

    View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. View Slide

  79. ChannelʹΑΓɺϓϩάϥϚ͸DispatchQueueؒͷ஋ͷڞ༗࣌
    ʹɺഉଞ੍ޚ͔Β։์͞Ε·͢

    View Slide

  80. • ݱঢ়͸ͨͩͷDispatchQueue.asyncͷΤΠϦΞε
    • serial͔ɺconcurrent͔࣮ߦ࣌ʹબ୒Մೳ
    • GoͷΑ͏ʹϒϩοΩϯάॲཧΛۭ͖εϨουʹ
    context switch࣮ͤͯ͞ߦ͢ΔΑ͏ͳ࠷దԽ͸͞
    Ε͍ͯͳ͍
    • ThreadϕʔεͳͷͰɺGoroutineΑΓ΋΋ͪΖΜ
    Ϧιʔεͷރׇ͸ૣ͍
    Prorsumͷgo()ʹؔͯ͠

    View Slide

  81. • ࣮͸MutexLockΛ࢖ͬͨ୯ͳΔδΣωϦοΫͳڞ༗ϝϞϦ
    • lock͕͔͔ΔͨΊɺ࢖͍ա͗ͨΒੑೳ͸ྼԽ͢Δ
    • Buffer͸LinkedListͰ࣮૷͞Ε͍ͯΔ
    • Buffer capacityΛӽ͑ͯૹ৴͢Δͱthrow͢Δ
    • Goͱҧ͍ɺtry catchͰΤϥʔͷัଊ͕Մೳ
    • Processؒͷ௨৴͸Ͱ͖ͳ͍(ErlangͷActorͳͲͱ͸׬શ
    ʹผ෺)
    ProrsumͷChannelʹؔͯ͠

    View Slide

  82. Ͱ͸ɺProrsumͰΞϓϦέʔγϣϯΛॻ͍ͯɺGCDͱChannel
    ͷ૊Έ߹Θ͕࣮ͤ༻తͳͷ͔ݟͯΈ·͠ΐ͏

    View Slide

  83. ࠓճ͸ɺJSON-RPC ServerΛॻ͍ͯΈ·ͨ͠

    View Slide

  84. View Slide

  85. ಈ࡞σϞ

    View Slide

  86. ιʔείʔυͷղઆ

    View Slide

  87. ؾʹͳΔύϑΥʔϚϯε

    View Slide

  88. ࠓճ͸ɺGoɺKituraɺNode.jsͦͯ͠Prorsum
    ͰϕϯνϚʔΫରܾΛͯ͠Έ·ͨ͠ɻ

    View Slide

  89. Benchmarking
    Request/sec
    0
    17500
    35000
    52500
    70000
    Prorsum Kitura Go 1.7 HTTP Server Express
    14,769
    64,768
    17,144
    29,436
    ɾwrk -d 30s -t 4 -c 20
    ɾResponded with the 10 length of random JSON array
    ɾMachine: MacOS Sierra, 8 logical cores, 8GB RAM

    View Slide

  90. • Go଎͗͢ (´ʀωʀʆ)ŲƄƂŕ
    • KituraͱExpress͸ϑϨʔϜϫʔΫͳͷͰɺ͜ͷϕϯν
    ϚʔΫࣗମ͸׬શʹFairͰ͸ͳ͍
    • Prorsum͸2Ґͱ͍͏݁Ռ͕ͩɺϦΫΤετͷread/writeΛ
    ϊϯϒϩοΩϯάʹ͢Ε͹ɺGOʹ΋͏গ͠೑ബͦ͠͏
    • Node.jsͱಉ౳Ҏ্ͳύϑΥʔϚϯε͸ɺ΄΅Swiftඪ४Ͱ
    ΋ग़Δ
    • ࠓճ࠶ߟͨ͠ΞʔΩςΫνϟ͸ɺҰԠ੒ޭʁ
    ײ૝

    View Slide

  91. ࠷ޙʹ

    View Slide

  92. swift-server/work-groupʹͯҎԼͷϥΠϒϥϦΛ
    Swiftඪ४Ͱ࢖͑ΔΑ͏ʹ࢓༷ࡦఆதͰ͢ɻ
    • RFC 7230-7235(HTTP/1.1)
    • RFC 6455 (WebSocket)
    • RFC 7540(HTTP/2.0)
    • TCP/IP(v6,v4), UDP including I/O
    • TLS/Encryption
    https://github.com/swift-server/work-group

    View Slide

  93. • ͓ͦΒ͘ݱߦͷϑϨʔϜϫʔΫ΋ެࣜαʔόʔAPI
    ʹ৐͔ͬͬͯ͘Δͱࢥ͍·͢ɻ
    • ؤுͬͯࣗ࡞ͯ͠΋ɺެ͕ࣜग़ͨλΠϛϯάͰ࣌
    ؒͷແବʹͳΔՄೳੑ͕͋Γ·͢ɻ
    • ಛʹTLS΍HTTPपΓ͸RFC΋ଟྔͰɺ࣮૷΋ෳࡶ
    ͳͨΊ׬੒·Ͱʹ݁ߏͳ͕͔͔࣌ؒΓ·͢ɻ

    View Slide

  94. 3rd partiy੡ͷϥΠϒϥΛԼखʹ૿΍͢ΑΓ΋ɺServer-
    Work-Groupͷٞ࿦ʹࢀՃͯ͠ɺ͍͍ඪ४ϥΠϒϥϦΛ
    ࡞͍ͬͯ͘΄͏͕ݐઃతͰ͢ɻ
    (ͦͯ͠ɺૣ͘ຊ൪αʔϏεͰ࢖͑ΔΑ͏ʹ…

    View Slide

  95. Prorsum΋HTTP΍TLSपΓ͸ɺެࣜ൛ʹReplace͢Δ༧ఆͰ͢ɻ

    View Slide

  96. ͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ

    View Slide