TV視聴参加型システムを支える Socket.IOクラスタの裏側

TV視聴参加型システムを支える Socket.IOクラスタの裏側

C887161d922da14c9cbe957ef4b4a6fe?s=128

Tsuyoshi Torii

July 05, 2013
Tweet

Transcript

  1. TVࢹௌࢀՃܕγεςϜΛࢧ͑Δ   Socket.IOΫϥελͷཪଆ 2013/06/24   Tsuyoshi  Torii  (@toritori0318)   Bascule

     Inc.
  2. ࣗݾ঺հ •  ௗډɹ߶࢘(@toritori0318)   •  גࣜձࣾόεΩϡʔϧ   –  WebΞϓϦέʔγϣϯΤϯδχΞʁ  

    •  Πϯϑϥʗӡ༻อकʗetc…   –  Perl  /  Node.js  /  Python   •  Blog   -­‐  http://d.hatena.ne.jp/toritori0318/   -­‐  http://d.hatena.ne.jp/tori243/  
  3. ΞδΣϯμ 1.  MɾIɾEɾSͱ͸   2.  ϦΞϧλΠϜϝοηʔδϯάγεςϜ ʢSonicShooterʣͷத਎   3.  ͞ΒͳΔεςοϓ

      4.  ·ͱΊ  
  4. MɾIɾEɾS

  5. MɾIɾEɾSͱ͸ μϒϧεΫϦʔϯࢹௌʹΑΔςϨϏ൪૊΁ͷ ࢀՃମݧΛఏڙ͢Δ ϚογϒɾΠϯλϥΫςΟϒɾΤϯλʔς ΠϯϝϯτɾγεςϜ 

  6. None
  7. BloodyTube ݂ӷܕର߅Ϩʔεʹࢹௌऀ͕ࢀՃͯ͠൪૊Λߏ੒͢Δ׬શΠϯλϥΫςΟϒTV   όεΩϡʔϧͷاըɾఏڙɾ੍࡞     ࢹௌऀͷεϚϗ͔ΒͷࢀՃঢ়گ͕ςϨϏʹ൓ө͞ΕΔ   ༏উνʔϜʹ͸ϦΞϧళฮͰར༻Ͱ͖ΔPontaϙΠϯτ͕ఏڙ͞ΕΔ  

    B2O2O(Broadcast  to  Online  to  Offline)ϚʔέςΟϯάࢪࡦʹ΋νϟϨϯδ
  8. SonicShooter

  9. SonicShooter •  SonicShooter͕ग़དྷΔ·Ͱ   •  Socket.IOͷબఆ   •  SonicShooter機能一覧  

    •  γεςϜ֓ཁ   •  Ϋϥελ؅ཧͷ࢓૊Έ   •  Tips  
  10. SonicShooter͕ग़དྷΔ·Ͱ •  ཁ݅   –  ϦΞϧλΠϜʹ༑ୡͷ৘ใΛڞ༗͍ͨ͠   –  ϒϩʔυΩϟετ഑৴͍ͨ͠  

    –  ൚༻ੑ   –  Ϋϩεϒϥ΢βରԠʗΞϓϦରԠ   –  ͳΔ΂҆͘͘   –  εέʔϧ   •  ؆୯ʹ্͛Լ͛Ͱ͖ΔΑ͏ʹ   –  ࠷௿Ͱ΋ಉ࣌20ສϢʔβʂʁ
  11. Socket.IO

  12. Socket.IO •  Ϛϧντϥϯεϙʔτ   –  Ϋϩεϒϥ΢β   –  iPhone  /

     Android  ΞϓϦ   •  ίωΫγϣϯʗೝূ؅ཧ   •  ࠶઀ଓॲཧ   •  ϧʔϜ؅ཧ   •  ϒϩʔυΩϟετ  
  13. Socket.IO •  ໰୊   –  ̎ճΞΫηε໰୊   –  εέʔϧΞ΢τ  

    •  RedisStore   •  ϓϩΩγ   –  HAProxy   –  Nginx   –  Bouncy  /  http-­‐proxy   •  ಠࣗϊʔυ؅ཧ  
  14. SonicShooterػೳҰཡ •  Ϣʔβʗೝূ؅ཧ   •  ϑϨϯυάϥϑ؅ཧ   •  Push  

    –  ϑϨϯυ഑৴   –  ϒϩʔυΩϟετ഑৴   –  ύϒϦοΫϏϡʔΠϯά഑৴   •  Pull   –  ϑϨϯυλΠϜϥΠϯ   –  ϒϩʔυΩϟετ   –  ύϒϦοΫϏϡʔΠϯά  
  15. γεςϜ֓ཁ •  AWS   –  APIαʔό   •  Node.js  0.8.x

     /  express  2.x   –  ιέοταʔό   •  Node.js  0.8.x  /Socket.IO  0.9.x   –  όοναʔό   –  DB   •  DynamoDB/Redis
  16. Consumer S2   Socket S2   API S2   Socket

    S2   Socket S2   Socket S2   API S2   API S2   API Consumer Consumer SonicShooter ιέοτ઀ଓཱ֬·Ͱ id userA host xxx.exam ple.com conn  id 111 ιέοταʔό܈ APIαʔό܈ ιέοταʔόυϝΠϯ FUDʜ ③ ② ① %#ʹอ࣋ ④
  17. Consumer S2   Socket S2   API S2   Socket

    S2   Socket S2   Socket S2   API S2   API S2   API Consumer Consumer SonicShooter ϑϨϯυ഑৴ ͍͚ʔʂ ͍͚ʔʂ ͍͚ʔʂ ιέοταʔό܈ APIαʔό܈ id userB host yyy.exam ple.com conn  id 222 ̍ɽUser"ͷϑϨϯυ ʢ6TFS#ʣΛऔಘ ̎ɽ6TFS#ͷ઀ଓ৘ใΛऔಘ ̏ɽ઀ଓઌʹϝοηʔδૹ৴ User  A User  B ② ④ ③ ①
  18. Consumer S2   Socket S2   API S2   Socket

    S2   Socket S2   Socket S2   API S2   API S2   API Consumer Consumer SonicShooter ブロードキャスト഑৴ CMͰʔ͢ CMͰʔ͢ ιέοταʔό܈ APIαʔό܈ CMͰʔ͢ CMͰʔ͢ User  A User  B ③ ③ ② ①
  19. Consumer S2   Socket S2   API S2   Socket

    S2   Socket S2   Socket S2   API S2   API S2   API Consumer Consumer SonicShooter サーバ間通信 ιέοταʔό܈ APIαʔό܈ 4PDLFUJP User  A User  B
  20. Ϋϥελ؅ཧͷ࢓૊Έ ಈతͳϊʔυ௥Ճʗ࡟আ

  21. Socket   01   API Socket   02   Socket

      03 Batch 01 02 03 ϊʔυ؅ཧ SonicShooter ιέοταʔό܈ όοναʔό܈ APIαʔό܈ DB ʮʯϊʔυʹ ͭͳ͛ͯͶ インスタンスのタグͱ εςʔλεで判断 ① ② a b c d
  22. Socket   01   API Socket   02   Socket

      03 Batch 01 02 03 ϊʔυ࡟আ࣌ SonicShooter ιέοταʔό܈ APIαʔό܈ όοναʔό܈ DB ʮʯϊʔυʹ ͭͳ͛ͯͶ c ① ② b a d e ίωΫγϣϯϓʔ ϧ͔Β࡟আ ③
  23. Socket   01   API Socket   02   Socket

      03 Batch 01 02 03 ϊʔυ௥Ճ࣌ 04 Socket   04 SonicShooter ιέοταʔό܈ APIαʔό܈ όοναʔό܈ DB インスタンスタグと ステータスで判断͠ɺ ࠩ෼Λ%#ొ࿥ ৽ͨʹίωΫγϣ ϯϓʔϦϯά͢Δ ① ② ③
  24. ϝϞɿϊʔυ࡟আ࣌ͷϑϩʔ   •  ΫϥΠΞϯτ   1.  ϊʔυ͕མͪͯίωΫγϣϯ੾அ   2.  ϑΣΠϧΦʔόʔॲཧʢ܁Γฦ͠ʣ

      3.  ઀ଓࣦഊͨ͠Β2ʹ໭Δ   •  όοναʔό   1.  ఆظతʹΫϥελͷҰཡΛऔಘ(EC2Πϯελϯεͷಠࣗλά)   2.  ҰཡͰऔಘͨ͠ϊʔυͷϔϧενΣοΫ   3.  ҰཡͱϔϧενΣοΫ͔Β؅ཧDB΁ͷ௥Ճʗ࡟আͷ൑அΛߦ͏   •  APIαʔό   1.  socket.ioίωΫγϣϯ؅ཧϦετ͔ΒίωΫγϣϯΛ࡟আ͠ɺ੾அ  
  25. ϝϞɿϊʔυ௥Ճ࣌ͷϑϩʔ •  όοναʔό   1.  ఆظతʹΫϥελͷҰཡΛऔಘ(EC2Πϯελϯεͷ ಠࣗλά)   2.  ҰཡͰऔಘͨ͠ϊʔυͷϔϧενΣοΫ

      3.  ҰཡͱϔϧενΣοΫ͔Β؅ཧDB΁ͷ௥Ճʗ࡟আͷ ൑அΛߦ͏   •  APIαʔό   1.  socket.ioίωΫγϣϯϦετʹ௥Ճ͠ɺ৽ن઀ଓ  
  26. αʔόTips •  ಛఆͷϊʔυʹภΒͳ͍Α͏ʹɺϊʔυ ຖʹॏΈ෇͚Λ保持   – Socket.IOίωΫγϣϯ਺ʹΑΓܾఆ   – https://github.com/toritori0318/node-­‐sio.status

  27. ΫϥΠΞϯτTips •  ࠶઀ଓॲཧ   – Socket.IOͷύϥϝʔλௐ੔   – reconnect_failedΠϕϯτͷύον   •  https://github.com/LearnBoost/socket.io/issues/652

      – ผϊʔυ΁ͷϑΣΠϧΦʔόʔ  
  28. ิ଍ɿ઀ଓࣦഊʗ࠶઀ଓͷྲྀΕ •  Socket.IO   –  ϋʔτϏʔτ͕੾ΕΔ   •  <disconnect>Πϕϯτ  

    –  reconnection  delay  ×  max  reconnection  attempts   •  <reconnecting>Πϕϯτ   –  max  reconnection  attempts  ʹ౸ୡ   •  <reconnect_failed>Πϕϯτ   •  SonicShooter(reconnect_faildൃੜޙ)   –  ϊʔυऔಘAPI΁ϦΫΤετ   •  …
  29. ͞ΒͳΔεςοϓ

  30. ࣮੷ ಉ࣌̎̌ສϢʔβ઀ଓ

  31. ಉ࣌ඦສϢʔβ઀ଓ νϟϨϯδ

  32. ಉ࣌ඦສϢʔβ઀ଓ •  ͦͷͨΊͷࢪࡦ   –  APIαʔόͱιέοταʔόͷ݁߹౓ΛԼ͛Δ   •  ௚઀SocketΛͭͳ͙ͷͰ͸ͳ͘ɺؒʹϦϨʔαʔόΛڬΉ  

    •  δϣϒΩϡʔ   •  Amazon  SNS   –  σʔλετΞ   •  TwemproxyʴRedis   •  Riak  
  33. ಉ࣌ඦສϢʔβ઀ଓ •  ̍୆͋ͨΓͷ઀ଓ਺Λ্͛ΔͨΊͷࢪࡦ   – ClusterԽΛ࠾༻͢Δ   – ͋Δ͍͸Socket.IOΛ΍ΊΔ   •  Sock.js

      •  Engine.io   –  Socket.io  1.0…ʁ  
  34. ·ͱΊ

  35. ·ͱΊ •  TvͱεϚʔτϑΥϯ͕ϦΞϧλΠϜʹ࿈ಈ͢Δϓ ϥοτϑΥʔϜ   •  Socket.IOͰ΋े෼ʹେྔͷ઀ଓ͕ࡹ͚Δ   –  ޻෉͸ඞཁ

      •  ϦΞϧλΠϜʹΑΔฐ֐Λೝ͓ࣝͯ͘͠   –  ΞΫηε͕ूத͠ͳ͍޻෉   –  ιέοτʹܨ͕Βͳ͔ͬͨΫϥΠΞϯτ΋ٹ͏खஈ Λ༻ҙ͓ͯ͘͠  
  36. એ఻ 

  37. όεΩϡʔϧͰ͸   ΤϯδχΞΛืू͓ͯ͠Γ·͢ 

  38. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠