Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Akka Streams とScala で実装する マルチメディア・オンラインサーバの世界 / Realtime-Server using Akka Streams and Scala

Akka Streams とScala で実装する マルチメディア・オンラインサーバの世界 / Realtime-Server using Akka Streams and Scala

サーバーサイドのストリーム処理ライブラリとして Akka Stremas を選択し、チャットサーバからオンラインゲームサーバまで実装を試みた内容についてレポートします。これからのリアルタイムデータ処理に Akka Streams と Scala がどのように寄与するかも考えます。

664b6e8ebe272fcfa5dbd6070eaf3cd4?s=128

Yusuke Wada

July 01, 2017
Tweet

Transcript

  1. "LLB4USFBNTͱ4DBMBͰ࣮૷͢Δ ϚϧνϝσΟΞɾΦϯϥΠϯαʔόͷੈք DNEFWJP

  2. ࿩͢಺༰  w ࠓ೔΍Δ͜ͱɺ࢖͏ٕज़ w จࣈνϟοτͷ࣮૷ w ϏσΦνϟοτͷ࣮૷ w ΦϯϥΠϯήʔϜαʔόͷ࣮૷

    w "LLBͱ4DBMB࢖ͬͯͲ͏͔ͩͬͨ w ·ͱΊ NJO NJO NJO NJO NJO NJO
  3. ࣗݾ঺հ  w ࿨ా༞հ w ೥݄೔ w ۀ຿4DBMB 1MBZ w

    5XJUUFS!XBEEZ@V w झຯ૲໺ٿ
  4.  ࠓ೔͸ Akka Streams Λ࢖ͬͯ ϦΞϧλΠϜαʔόΛ࡞ͬͯΈ·͢ʂ

  5. "LLBΛ࢖͏  "LLB  ฒྻॲཧͷͨΊͷϥΠϒϥϦ +BWB4DBMB ɻ
 $IBU8PSLαʔόͷνϟοτϝοηʔδ3FBE8SJUF"1* Ͱ׆༻͞Ε͍ͯΔɻ "LLB4USFBNT

     ແݶʹൃੜ͢ΔσʔλΛѻ͏ͨΊͷϥΠϒϥϦɻϓϩμΫτ ͩͱओʹϩάͷৼΓ෼͚΍όονॲཧͰར༻͞Ε͍ͯΔɻ
  6. ͳͥ"LLB ٕज़తͳ໘ന͞  ۀ຿Ͱ"LLB੡ͷϫʔΧʔΛ࡞Δػձ͕͋ͬͨ w "LLB"DUPS୯ҐͷॲཧઃܭͰߴϝϯςφϯεੑ w 4DBMBͷύλʔϯϚονϯάͱͷߴ਌࿨ੑ w "LLBͷϙςϯγϟϧ͸·ͩ·ͩ͋Δ

    Akka ͜ͱ͸͡Ί - Developers IO http://dev.classmethod.jp/server-side/akka-worker/
  7. ͳͥ"LLB ϦΞϧλΠϜlᅂ޷z  ͍Ζ͍ΖͳσόΠε͕Πϯλʔωοτʹͭͳ͕Δ࣌୅ தܧ໾͕ཁΔɻ8FC"1*͸ࠓޙ΋ܗͦ͜ม͑ΕͲඞཁͱ͞ΕΔ͸ ͣɻαʔόαΠυΞϓϦͷ࢓ࣄ͸૿͑ଓ͚Δɻ 10454UPSF(&5͔Β4USFBN΁ ͋ΔΫϥΠΞϯτ͕ɺίϯςϯπΛऔಘ͠Α͏ͱࢥͬͨΒɺʮ୭͔ ͕ߋ৽ͯ͠อଘͨ͠σʔλΛͱΓʹ͍͘ʯͱ͍͏खॱʹͳΔɻͦ͏ Ͱ͸ͳ͘ɺʮ୭͕ݟΔ͔͸Θ͔Βͳ͍͚ͲͱΓ͋͑ͣྲྀ͢ɻྲྀΕͯ

    ͖ͨσʔλ͸ղऍͰ͖Δਓ͕͔͠Δ΂͖खஈͰίϯςπͱͯ͠දࣔ ͢Δʯํ͕ࣜओྲྀʹͳ͍ͬͯ͘ʜ͔΋͠Εͳ͍ɻ
  8. ͳͥ"LLB ೔ຊޠͷࢿྉ͕গͳ͍  ͱ͖ͬͭʹ͍͘ http://doc.akka.io/docs/akka/current/scala/guide/introduction.html http://freecontent.manning.com/akka-in-action-why-use-clustering/

  9. φΠεͳϥΠϒϥϦͳͷͰʜ  গ͠Ͱ΋਌͠ΈΛ࣋ͬͯཉ͍͠

  10. ΍Δ͜ͱɺ΍Βͳ͍͜ͱ  ΍Δ͜ͱ "LLB4USFBNTΛ࢖ͬͯྫ͑͹ͲΜͳ΋ͷ͕࡞ΕΔ͔ʁ
 ͦͷͱ͖ͲΜͳײ͡ͷιʔείʔυʹͳΔͷ͔ʁ
 ࣮ߦ͢ΔͱͲ͏ͳΔ͔ʁ ΍Βͳ͍͜ͱ "LLBΛ࢖͏͜ͱʹΑΔ଱ো֐ੑɺεέʔϥϏϦςΟɺ͓Α ͼ࣮૷ͨ͠ΞϓϦέʔγϣϯͷύϑΥʔϚϯεݕূ͸ɺ࣮ࢪ ͠·ͤΜɻ

  11. ٕज़બ୒ͷީิΛ૿΍͍ͯͨͩ͘͜͠ͱ͕ΰʔϧ  αʔόʔαΠυΞϓϦέʔγϣϯͷٕज़બ୒͸ແݶ αʔόʔαΠυΞϓϦέʔγϣϯͳͷʹαʔόʔϨε͕બ୒ࢶʹڍ ͕Δ࣌୅ʢଞηογϣϯࢀরʣɻ ΠϯϑϥϨΠϠͷίʔσΟϯάɺϞχλϦϯάɺώʔϦϯάखஈ͕ ॆ࣮͠ɺ΋ͱ΋ͱϛυϧ΢ΣΞ͕୲͍ͬͯͨ໾ׂ෼Խͳ͍͠αʔϏ εԽɻ ͱ͸͍͑ɺ"LLBؚΊͯ͋͘·ͰखஈɻαʔόʔαΠυΞϓϦέʔ γϣϯͷ࣮ݱํ๏ͱͯ͠ʮ͜͏͍͏ͷ΋͋ΔΜͩʯΛ࣋ͪؼͬͯཉ

    ͍͠ͱࢥ͍ͬͯ·͢ɻ
  12. "LLB4USFBNTͰαʔόʔαΠυΞϓϦέʔγϣϯ  จࣈνϟοτͷ࣮૷

  13. ਐΊํ  ͲΜͳ΋ͷΛ࡞͔ͬͨ ػೳΛ੔ཧ͢Δ ࢖ٕͬͨज़ʹ͍ͭͯઆ໌͢Δ ιʔείʔυΛಡΉ

  14. ͲΜͳ΋ͷΛ࡞͔ͬͨ  "OHVMBS 3Y+4 8FC4PDLFUͰνϟοτΞϓϦΛ࡞Δ IUUQEFWDMBTTNFUIPEKQDMJFOUTJEFBOHVMBSSYKTXFCTPDLFUDIBU

  15. ػೳΛ੔ཧ͢Δ  αʔό1VCMJTI4VCTDSJCFνϟωϧ ΫϥΠΞϯτϑΥʔϜೖྗͱ1VCMJTI ΫϥΠΞϯτ4VCTDSJCFͱը໘ඳը

  16. ࢖ٕͬͨज़ʹ͍ͭͯઆ໌͢Δ  "OHVMBS ը໘ͷඳըͱ"LLB4USFBNT΍ΓͱΓͰར༻ɻ 3Y+4 8FC4PDLFUͰ઀ଓͨ͠"LLB4USFBNTͷσʔλΛϦΞΫςΟϒʹॲཧ͢Δɻ "LLB4USFBNT νϟοτϝοηʔδͷू໿ͱϒϩʔυΩϟετͷͨΊʹར༻ɻ
 1VCMJTI4VCTDSJCFνϟωϧɻ 8FC4PDLFU

    ௨৴ϓϩτίϧͰ)551ΑΓ΋ϦΞϧλΠϜੑ͕ߴ͍ͪ͜ΒΛ࠾༻ɻ
  17. "OHVMBS  8FCΞϓϦΛߏங͢ΔͨΊͷϑϨʔϜϫʔΫ 5FNQMBUF )5.-จॻΛ֦ுͯ͠ɺ"OHVMBSಛ༗ͷهड़Λߦ ͏͜ͱʹΑΓ%0.ߏ଄ͷ܁Γฦ͠΍ɺΫϦοΫΠ ϕϯτʹ൓Ԡͯ͠σʔλΛߋ৽͢Δ͜ͱ͕Մೳɻ σʔλͷରͱͳΔ$PNQPOFOU͕࣮ߦ͢Δɻ $PNQPOFOU 5FNQMBUFͱηοτɻϏϡʔͰར༻͢ΔσʔλΛ

    ༻ҙͨ͠ΓɺٯʹϏϡʔͰൃੜͨ͠ΠϕϯτΛݕ ஌ͯ͠ޙड़ͷ4FSWJDF΁ॲཧΛҕৡ͢Δɻ 4FSWJDF "OHVMBSͰ͸%*ͷ࢓૊ΈΛಋೖ͢Δ͜ͱʹΑΓɺ ͋ΒΏΔίϯϙʔωϯτ͔ΒOFX͢Δ͜ͱͳ͘σʔ λ$63%ͳͲͷϩδοΫΛݺͼग़͢ɻ֎෦ͱͷ௨ ৴ͳͲ΋͜͜Ͱߦ͏ɻ
  18. "LLB4USFBNT  4PVSDFσʔλൃੜݯ 4JOLσʔλग़ྗઌ 'MPXσʔλॲཧ ෦඼Λ૊Έ߹ΘͤͯάϥϑΛ࡞ Δɻ࡞ͬͨάϥϑΛ࣮ߦ͢Δɻ

  19. "LLB4USFBNT  4PVSDFσʔλൃੜݯ 4JOLσʔλग़ྗઌ 'MPXσʔλॲཧ ෦඼Λ૊Έ߹Θͤͯɺ
 νϟοτγεςϜͷʮϝοηʔδόεʯΛ
 ࡞Δ͜ͱ͕Ͱ͖Ε͹0,

  20. ΈΜͳͰ  ιʔείʔυϦʔσΟϯάλΠϜ ηογϣϯͰ࿩ͨ͠ϙΠϯτ w 8FC4PDLFUͷೖग़ྗʹ'MPX<+T7BMVF +T7BMVF>Λͭͳ͛ Δ͜ͱͰ؆୯ʹαʔόΛߏஙͰ͖Δɻ w #SPBEDBTU)VC

    .FSHF)VCΛ࢖͏͜ͱͰಈతͳάϥϑΛ ఆٛ͢Δ͜ͱ͕Մೳɻ͜ΕΛ1VCMJTI4VCTDSJCFνϟω ϧʹ͢Δɻ
  21. "LLB4USFBNTͰαʔόʔαΠυΞϓϦέʔγϣϯ  ϏσΦνϟοτͷ࣮૷

  22. ࿩͢಺༰  ͲΜͳ΋ͷΛ࡞͔ͬͨ ϏσΦνϟοτͳΒͰ͸ͷཁૉ ΫϥΠΞϯταΠυͷιʔείʔυΛಡΉ

  23. ͲΜͳ΋ͷΛ࡞͔ͬͨ  "OHVMBSͱ"LLB4USFBNTͰଟରଟͷϏσΦνϟοτ
 IUUQEFWDMBTTNFUIPEKQDMJFOUTJEFWJEFPDIBUNFEJBTPVSDFFYUFOTJPOT

  24. ϏσΦνϟοτͳΒͰ͸ͷཁૉ  )5.-.FEJB4PVSDF&YUFOTJPOTར༻ ө૾ͷऔಘͱඳըΛߦ͏"1*ɻ ϝοηʔδ͕จࣈྻͰ͸ͳ͘όΠφϦ "LLB4USFBNTͷجຊతͳߏ੒͸มΘΒͳ͍ɻ ϝϯόʔදͷ؅ཧ͕৽ͨʹඞཁ ࢀՃϢʔβݸผͰϝοηʔδόεΛ༻ҙ͢Δɻ

  25. )5.-.FEJB4PVSDF&YUFOTJPOT  όΠφϦσʔλΛϒϥ΢β"1*ܦ༝Ͱૢ࡞Ͱ͖Δ

  26. όΠφϦΛѻ͏ϝϯόʔදͷ؅ཧ͕ඞཁʹͳΔ 

  27. ओʹΫϥΠΞϯταΠυ  ιʔείʔυϦʔσΟϯάλΠϜ ηογϣϯͰ࿩ͨ͠ϙΠϯτ w ϝϯόʔ͕૿͑Δͱɺ"OHVMBSͷίϯϙʔωϯτ͕উखʹWJEFP λάΛ࡞Δɻ w WJEFPλάͷσʔλιʔεͱͯ͠$PNQPOFOU͕ө૾ͷόΠφ ϦσʔλΛྲྀ͢ɻ

    w 8FC35$ͱ͸ผͷܗͰଟରଟͷϏσΦνϟοτΛ࡞Δ͜ͱ͕Ͱ ͖Δɻ
  28. "LLB4USFBNTͰαʔόʔαΠυΞϓϦέʔγϣϯ  ήʔϜαʔόͷ࣮૷

  29. ࿩͢಺༰  ͭͬͨ͘΋ͷ࣮ԋ ήʔϜαʔόͳΒͰ͸ͷཁૉ ιʔείʔυϦʔσΟϯάλΠϜ

  30. ͭͬͨ͘΋ͷΦϯϥΠϯϚϧόπήʔϜαʔό 

  31. ήʔϜαʔόͳΒͰ͸ͷཁૉ  ήʔϜͷঢ়ଶΛӬଓԽ 3FEJTʹ+40/ͱͯ͠อଘ͢Δɻ lίϚϯυzͰήʔϜঢ়ଶΛߋ৽ ͨͩσʔλΛྲྀ͚ͩ͢Ͱͳ͘ɺϩδοΫΛద༻͢Δɻ ӬଓԽͨ͠ঢ়ଶΛҰఆִؒͰૹग़ ྲྀΕͯ͘ΔσʔλΛͦͷ··ར༻͢Δ͜Ε·Ͱͱ͸ҟͳΔɻ

  32. ήʔϜαʔόུ֓ਤ  ϓϨΠϠʔ͸$PNNBOEΛૹ৴͢Δ ήʔϜαʔό͸ήʔϜϩδοΫΛద༻͠3FEJTΛߋ৽͢Δ ήʔϜαʔό͸ҰఆִؒͰ(BNF4UBUVTΛૹग़͢Δ

  33. "LLB4USFBNTͰ͜Μͳ͜ͱ΋Ͱ͖Δ  ιʔείʔυϦʔσΟϯάλΠϜ ηογϣϯͰ࿩ͨ͠ϙΠϯτ w 4USFBNࣗ਎͕ೳಈతʹϝοηʔδΛൃੜͤ͞Δ 3FEJTͷঢ় ଶΛಡΈࠐΊͱ͍͏໋ྩ ɻ w

    ϝοηʔδΛड͚औͬͨΒ3FEJT͔Βঢ়ଶΛಡΈࠐΜͰྲྀ͢ɻ w 4USFBN಺ͷ'MPXͰύλʔϯϚονΛ༻͍Δ͜ͱͰɺϢʔ βʔ͔ΒͷίϚϯυͳͷ͔ɺೳಈతͳ໋ྩͳͷ͔൑ผ͕Մೳɻ
  34. ٞ࿦ɿϦΞϧλΠϜαʔόʹ͓͍ͯ"LLB͸Ͳ͏͔  4USFBNTͰ1VCMJTI4VCTDSJCFߏஙՄೳ .FSHF)VCͱ#SPBEDBTU)VCͰ8FC4PDLFUͷೖग़ྗΛ ಈతʹͭͳ͙͜ͱ͕Ͱ͖ΔɻଟରଟͷϦΞϧλΠϜαʔόߏ ஙύλʔϯͷͻͱͭɻ ྲྀྔ΍σʔλൃੜස౓ͷௐ੔͕Մೳ ཁ݅ʹԠͯ͡ෛՙͷ੍ޚ͕Մೳɻ͜Ε͸"LLB4USFBNTඪ ४ػೳͱͯ͠උΘ͍ͬͯΔɻ

  35. ٞ࿦ɿϦΞϧλΠϜαʔόʹ͓͍ͯ4DBMB͸Ͳ͏͔  ྲྀΕΔϝοηʔδʹܕ৘ใΛ࣋ͨͤΔ͜ͱ͕Ͱ͖Δ *OQVU͕ԿͰɺ0VUQVU͕Կͷ෦඼ͳͷ͔໌Β͔ɻܕ৘ใ͕ ෆਖ਼ͳ෦඼Λ૊Έ߹ΘͤΑ͏ͱ͢ΔͱίϯύΠϧΤϥʔʹͳ ΔɻϥϯλΠϜΤϥʔͰ͸ͳ͍ɻ ύλʔϯϚονʹΑΔೖग़ྗͷ੍ޚ σʔλͷγϦΞϥΠζɺσγϦΞϥΠζͰ׆༂ɻෆਖ਼ͳσʔ λͷ৵ೖΛ๷͙ͱͱ΋ʹɺग़ྗ͢ΔσʔλͷܕΛอূ͢Δɻ

  36. ·ͱΊ  "LLB4USFBNT ࠓճͷओ໾ɻ࣮ݱखஈ͕๛෋ͳαʔόʔαΠυΞϓϦʹ͓͍ͯϦΞϧλΠϜੑΛٻΊΔͱ ͖ʹͥͻߟྀʹೖΕ͍ͨͰ͢ɻ "OHVMBS ϫϯετοϓͰσʔλतड͔Βը໘ඳը·ͰΠέΔφΠεͳ8FCΞϓϦέʔγϣϯϑϨʔ ϜϫʔΫɻ4FSWJDFͰ8FC4PDLFUͷॲཧΛӅṭ͔ͯͭ͠$PNQPOFOUʹ%*Ͱ͖Δ఺͕ ϞδϡʔϧੑߴͰૉ੖Β͍͠ͱࢥ͍·ͨ͠ɻ )5.-.FEJB4PVSDF&YUFOTJPOT

    'MBTI΍4JMWFSMJHIUͱ͍ͬͨϦονͳ֦ுΛ࢖͏͜ͱͳ͘ϝσΟΞΛϒϥ΢βͰѻ͏ͨΊ ͷ"1*܈ɻࠓճ͔ͳΓॿ͔Γ·ͨ͠ɻ4BGBSJͰ΋࢖͑ΔΑ͏ʹͳΕ͹εϚʔτϑΥϯΛ௨ ͯ͠Ұؾʹීٴ͢ΔͷͰ͸ɻ
  37. ηογϣϯͰར༻ͨ͠ιʔείʔυ͸ͪ͜Β  αʔόʔαΠυ"LLB4USFBNT EFWFMPQFSTJPNFEJBTFSWFSXFCTPDLFUBLLBTUSFBN
 IUUQTHJUIVCDPNDNXBEBZVTVLFEFWFMPQFSTJP USFFNBTUFSNFEJBTFSWFSXFCTPDLFUBLLBTUSFBN ΫϥΠΞϯταΠυ"OHVMBS EFWFMPQFSTJPBOHVMBSNFEJBTUSFBNBQQ
 IUUQTHJUIVCDPNDNXBEBZVTVLFEFWFMPQFSTJP USFFNBTUFSBOHVMBSNFEJBTUSFBNBQQ

  38. ࢀߟ  w "LLBIUUQBLLBJP w "OHVMBSIUUQTBOHVMBSJP w .FEJB4PVSDF&YUFOTJPOTäIUUQTXXXXPSH53NFEJBTPVSDF w .FEJB4PVSDFIUUQTEFWFMPQFSNP[JMMBPSHKBEPDT8FC"1*.FEJB4PVSDF

    w 8FC4PDLFUTIUUQTXXXQMBZGSBNFXPSLDPNEPDVNFOUBUJPOY4DBMB8FC4PDLFUTXFCTPDLFUT