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

パラレルのグループ通話を支える技術スタックと設計思想 / Tech Stack and Architecture of Parallel's Group Voice Chat

パラレルのグループ通話を支える技術スタックと設計思想 / Tech Stack and Architecture of Parallel's Group Voice Chat

TECH STAND #4 常時接続SNS~ライブ配信基盤を支える技術~の発表資料です。

パラレルは iOS と Android のアプリで、若い世代を中心に利用されています。
リリースして 1 年と少しで、100 万 DL を達成することができました。
ユーザーの 1 日の平均通話時間が 3 時間とすごく長いのが一つ特徴としてあります。ただ、友達と話しているとはいえ、3 時間もひたすら会話だけをずっとしているというわけでは当然ありません。
パラレルのユーザーは、友達とグループ通話をしながら、パラレル内でミニアプリとして提供している YouTube の同時視聴をしたり、ミニゲームとして提供している大富豪やお絵かきしりとりを一緒に遊んで、一日平均 3 時間以上パラレルで過ごしています。

次に自己紹介ですが、ハンドルネーム yoheimuta で GitHub や Twitter で活動してます。
左はこれまでのキャリアで、業界は様々ですが一貫してスマホネイティブアプリ領域をメインでやってきたので、クライアントからサーバー・SRE まで幅広くやることが多いです。基本的にはサーバーエンジニアに主軸を置いてます。
右はパラレルで ruby のバグを踏んだので、それを特定して本家 ruby にバグレポートを提出する過程をまとめた記事です。rubyweekly という毎週発行されている記事のトップに取り上げられたこともあって多くの人に見てもらえました。ニッチなテーマだと思ったので英語で Medium に書いたのが良かった気がします。おかげさまで、知らない海外の人から直接メールで Mongo DB 使った puma server が最近クラッシュするんだけど何でかわかる?という相談が来ていて少し困ってます。ユーザー数が増えてきたので、こんなことも最近やってますという紹介でした。
ということで、ここから本日のテーマに移っていこうと思います。

まず、パラレルのグループ通話基盤を紹介します。パラレルのグループ通話基盤は大きく、メディアサーバーと API サーバーに分けられるのでそれぞれ説明していきます。
次に、その中で、パラレルが大事にしている要件があるのでそれを満たすアーキテクチャを説明していきたいと思ってます。聴き終わった後に、ここに書いてある「一貫した通話状態」が何を指していて、何で大事にしているのかがわかるように発表していきたいと思います。

6914735c2aaaa9fa1d7e5c8ddde6de4c?s=128

yoheimuta

May 14, 2021
Tweet

Transcript

  1. ύϥϨϧͷάϧʔϓ௨࿩Λࢧ͑Δ ٕज़ελοΫͱઃܭࢥ૝ TECH STAND #4 ৗ࣌઀ଓSNS~ϥΠϒ഑৴ج൫Λࢧ͑Δٕज़~
 Presented by @yoheimuta Ϣʔβʔ1ਓ͋ͨΓͷ1೔ฏۉ

    ௨࿩͕࣌ؒ3࣌ؒҎ্ 
  2. ɹύϥϨϧͷ঺հ iOS ͱ Android Ͱ 100ສ DL Ϣʔβʔͷ 70 %

    ͕ Zੈ୅(~ 24ࡀ) ᶃ༑ୡͱू·Δ ᶄ௨࿩͢Δ ᶅίϯςϯπͰ༡Ϳ ݄ؒ૯௨࿩࣌ؒ͸ 4 ԯ෼Ҏ্ Ϣʔβʔͷ 1 ೔ͷฏۉ௨࿩࣌ؒ͸ 3 ࣌ؒ Apple Store ධՁ͸ 4.7/5 (2ສ݅) ༑ୡͱ12࣌ؒ௨࿩Λͭͳ͛ͨ··΋௝͘͠ͳ͍ ͦͷͱ͖ͷؾ෼ʹ߹ΘͤͯɺYouTube Λ
 ಉ࣌ࢹௌͨ͠Γɺେ෋߽Λͯ͠༡Ϳ
  3. @yoheimuta ήʔϜ ޿ࠂ഑৴ɾSDK CtoC ίϚʔε ৗ࣌઀ଓSNS ύϥϨϧͰ࠷ۙ
 ΍ͬͯͨ͜ͱ ͜Ε·Ͱͷ ΩϟϦΞ

    https://rubyweekly.com/issues/549

  4. ຊ೔ͷςʔϚ • ύϥϨϧͷάϧʔϓ௨࿩ʢϥΠϒ഑৴ʣͷج൫ʹ͍ͭͯ • Ի੠ͱө૾Λѻ͏ϝσΟΞαʔόʔ • ͦΕҎ֎ͷσʔλΛѻ͏ API αʔόʔ •

    ύϥϨϧͷάϧʔϓ௨࿩ج൫Ͱେࣄʹ͍ͯ͠Δ͜ͱ • Ұ؏ͨ͠௨࿩ঢ়ଶΛಘΔͨΊͷΞʔΩςΫνϟͱͦͷมભʹ͍ͭͯ
  5. ύϥϨϧͷάϧʔϓ௨࿩ͱ͸ 1) ೖ͍ࣨͨ͠ϧʔϜ Λλοϓ͢Δ

  6. ύϥϨϧͷάϧʔϓ௨࿩ͱ͸ 1) ೖ͍ࣨͨ͠ϧʔϜ Λλοϓ͢Δ 2) ௨࿩ʹࢀՃ͢Δ

  7. ύϥϨϧͷάϧʔϓ௨࿩ͱ͸ 1) ೖ͍ࣨͨ͠ϧʔϜ Λλοϓ͢Δ 2) ௨࿩ʹࢀՃ͢Δ 3) ϧʔϜΛୀࣨ͢Δ

  8. ύϥϨϧͷάϧʔϓ௨࿩ͱ͸ 1) ೖ͍ࣨͨ͠ϧʔϜ Λλοϓ͢Δ 2) ௨࿩ʹࢀՃ͢Δ 3) ϧʔϜΛୀࣨ͢Δ 4) ௨࿩͕ऴΘΔ

  9. ύϥϨϧͷάϧʔϓ௨࿩ͱ͸ • ಛఆͷϧʔϜʹೖࣨ͢Δͱͦ͜Ͱάϧʔϓ௨࿩͕࢝·Δ • ϥΠϒ഑৴ͷจ຺Ͱ͍͏ͱɺશһ͕ίϥϘϥΠϒ഑৴͍ͯ͠Δͱଊ͑Δ͜ ͱ͕Ͱ͖Δ • αʔόʔΛ௨ͯ͠ɺϢʔβʔؒͰԻ੠ʢϝσΟΞʣͷ΍ΓऔΓ͕ߦΘΕΔ

  10. ύϥϨϧͷάϧʔϓ௨࿩ج൫

  11. ύϥϨϧͷάϧʔϓ௨࿩ॲཧͷϑϩʔ 1) ઀ଓ͢Δ

  12. ύϥϨϧͷάϧʔϓ௨࿩ॲཧͷϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ HTTPɺWebSocketɺ Push ௨஌ɺͦΕͧΕͰ ࠷৽ͷঢ়ଶ͕൓ө ༑ୡͷ

    Bob ͕ಉ͡ϧʔϜʹೖ ͍ࣨͯ͠Ε͹Ի੠͕ྲྀΕͯ͘Δ
  13. ύϥϨϧͷάϧʔϓ௨࿩ॲཧͷϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ 3) ੾அ͢Δ ༑ୡͷ Bob ͕ಉ͡ϧʔϜʹೖ

    ͍ࣨͯ͠Ε͹Ի੠͕ྲྀΕͯ͘Δ HTTPɺWebSocketɺ Push ௨஌ɺͦΕͧΕͰ ࠷৽ͷঢ়ଶ͕൓ө
  14. ύϥϨϧͷάϧʔϓ௨࿩ॲཧͷϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ 3) ੾அ͢Δ 4) ୀࣨΛ஌ΒͤΔ ༑ୡͷ

    Bob ͕ಉ͡ϧʔϜʹೖ ͍ࣨͯ͠Ε͹Ի੠͕ྲྀΕͯ͘Δ HTTPɺWebSocketɺ Push ௨஌ɺͦΕͧΕͰ ࠷৽ͷঢ়ଶ͕൓ө
  15. ύϥϨϧͷάϧʔϓ௨࿩ॲཧϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ

  16. ύϥϨϧͷάϧʔϓ௨࿩ॲཧϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ 3) ੾அ͢Δ 4) ୀࣨΛ஌ΒͤΔ

  17. ύϥϨϧͷάϧʔϓ௨࿩ॲཧϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ 3) ੾அ͢Δ 4) ୀࣨΛ஌ΒͤΔ 1->2ɺ3->4

    Λਖ਼֬ ͔ͭૉૣ͘ߦ͍͍ͨ 🙏
  18. ύϥϨϧͷάϧʔϓ௨࿩ঢ়ଶ؅ཧ Connection Ͱ ௨࿩ঢ়ଶΛ؅ཧ Original

  19. ύϥϨϧͷάϧʔϓ௨࿩ঢ়ଶ؅ཧ Connection Ͱ ௨࿩ঢ়ଶΛ؅ཧ ෳ੡ͨ͠ɺ௨࿩ঢ় ଶΛ؅ཧ Copy Original

  20. ύϥϨϧͷάϧʔϓ௨࿩ঢ়ଶ؅ཧ Alice ͷ௨࿩ঢ়ଶ͕
 ೋॏ؅ཧ͞Ε͍ͯΔ Connection Ͱ ௨࿩ঢ়ଶΛ؅ཧ ෳ੡ͨ͠ɺ௨࿩ঢ় ଶΛ؅ཧ Copy

    Original ิ଍: ϧʔϜ͝ͱʹઐ༻αʔόʔΛ ׂΓ౰ͯͯɺͦͷ 1 ୆͕઀ଓ؅ཧ ͱϩδοΫΛ·Δͬͱ࣮૷͢ΔΑ ͏ͳ࡞Γʢex. ϦΞϧλΠϜήʔϜ αʔόʔʣͰ͸ͳ͍ͱ͍͏ҙຯ
  21. ύϥϨϧͷάϧʔϓ௨࿩ঢ়ଶ؅ཧ Connection Ͱ ௨࿩ঢ়ଶΛ؅ཧ ෳ੡ͨ͠ɺ௨࿩ঢ় ଶΛ؅ཧ Copy Original Q. ௨࿩ঢ়ଶͷೋॏ؅ཧͷͲ

    ͕͜໰୊ͳΜ͚ͩͬʁ
  22. ύϥϨϧͷάϧʔϓ௨࿩ঢ়ଶ؅ཧ Connection Ͱ ௨࿩ঢ়ଶΛ؅ཧ ෳ੡ͨ͠ɺ௨࿩ঢ় ଶΛ؅ཧ Copy Original A. ෼ࢄγεςϜʹ

    ͓͚ΔҰ؏ੑͷ
 ໰୊͕ൃੜ͢Δ Q. ௨࿩ঢ়ଶͷೋॏ؅ཧͷͲ ͕͜໰୊ͳΜ͚ͩͬʁ
  23. ෼ࢄγεςϜʢDistributed Systemʣ ෼ࢄγεςϜͱ͸ɺओʹωοτϫʔΫʹΑΓ઀ଓ͞Εͨෳ਺ͷίϯϐϡʔλ ʹΑͬͯߏ੒͞ΕͨγεςϜͷ͜ͱͰ͋Δɻ
 ରٛޠ͸ɺूதγεςϜʢӳޠ: central system, centralized systemʣɻ “

    — https://ja.wikipedia.org/wiki/෼ࢄγεςϜ ෼ࢄγεςϜ͸ɺϢʔβʹରͯ͠୯ҰͰटඌҰ؏ʢcoherentʣͨ͠γεςϜ ͱͯ͠ݟ͑Δಠཱͨ͠ίϯϐϡʔλͷू߹Ͱ͋Δ “ — λωϯό΢Ϝ&ϑΝϯɾεςΟʔϯஶ, ਫ໺Β༁
 ෼ࢄγεςϜ ݪཧͱύϥμΠϜ
  24. Ұ؏ੑ(Consistency) Ұ؏ੑͱ͸ɺ෼ࢄγεςϜͰෳ੡Λͨ͠ࡍʹൃੜ͢Δ
 ໰୊Ͱ͢ɻ
 
 Ұ؏ੑ͕ʮ͋Δʯͱ͸ɺෳ੡σʔλͷ͋Δ෼ࢄγεςϜͰɺ ؍࡯ऀ͔ΒʮҰҙͳσʔλΛอ͍࣋ͯ͠Δ༷ʹݟ͑Δʯঢ়ଶ Λࢦ͠·͢ɻ
 
 Ұ؏ੑ͕ʮͳ͍ʯͱ͸ɺෳ੡σʔλͷ͋Δ෼ࢄγεςϜͰɺ ؍࡯ऀ͔Βʮ୯ҰσʔλΛอ͍࣋ͯ͠ͳ͍༷ʹݟ͑Δʯঢ়ଶ

    Λࢦ͠·͢ɻ “ — https://techblog.yahoo.co.jp/architecture/2015-04-ditributed-consistency/
 ෼ࢄγεςϜͷҰ؏ੑʹؔ͢Δಈ޲ʹ͍ͭͯ
  25. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 4) ੾அ͢Δ 3) ೖࣨΛ஌ΒͤΔ 6) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 5) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν
  26. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 4) ੾அ͢Δ 3) ೖࣨΛ஌ΒͤΔ 6) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 5) ୀࣨΛϦΫΤετ ΄΅ϦΞϧλΠϜ
 ʹಉظ͕औΕΔ👍 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν
  27. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 4) ੾அ͢Δ 3) ೖࣨΛ஌ΒͤΔ 6) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 5) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν ⚠ ΫϥΠΞϯτʹ
 ҟৗʢΫϥογϡɾ ճઢஅʣ͕ൃੜ͢Δ ͱɺഁ୼
  28. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 5) ੾அ͢Δ 4) ೖࣨΛ஌ΒͤΔ 8) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 6) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν 3) ઀ଓΛ
 ௨஌͢Δ 7) ੾அΛ
 ௨஌͢Δ 2. ϝσΟΞαʔόʔ͔Βͷ Πϕϯτ௨஌ͰҰ؏ੑΛ֬ อ͢ΔΞϓϩʔν
  29. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 5) ੾அ͢Δ 4) ೖࣨΛ஌ΒͤΔ 8) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 6) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν 3) ઀ଓΛ
 ௨஌͢Δ 7) ੾அΛ
 ௨஌͢Δ 👍 ΫϥΠΞϯτʹ
 ҟৗ͕ൃੜͯ͠΋ɺ Ұ؏ੑ͕ಘΒΕΔ 2. ϝσΟΞαʔόʔ͔Βͷ Πϕϯτ௨஌ͰҰ؏ੑΛ֬ อ͢ΔΞϓϩʔν
  30. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 5) ੾அ͢Δ 4) ೖࣨΛ஌ΒͤΔ 8) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 6) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν 3) ઀ଓΛ
 ௨஌͢Δ 7) ੾அΛ
 ௨஌͢Δ ⚠ Πϕϯτ௨஌͕ ϩετɾେ෯஗Ԇ͢ ΔՄೳੑ͕͋Δ 2. ϝσΟΞαʔόʔ͔Βͷ Πϕϯτ௨஌ͰҰ؏ੑΛ֬ อ͢ΔΞϓϩʔν
  31. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 5) ੾அ͢Δ 4) ೖࣨΛ஌ΒͤΔ 8) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 6) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν 2. ϝσΟΞαʔόʔ͔Βͷ Πϕϯτ௨஌ͰҰ؏ੑΛ֬ อ͢ΔΞϓϩʔν 3) ઀ଓΛ
 ௨஌͢Δ 7) ੾அΛ
 ௨஌͢Δ 3. ϝσΟΞαʔόʹఆظత ʹঢ়ଶΛ໰͍߹ΘͤͯҰ؏ ੑΛ֬อ͢ΔΞϓϩʔν ఆظόονͰ ิਖ਼͢Δ
  32. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 5) ੾அ͢Δ 4) ೖࣨΛ஌ΒͤΔ 8) ୀࣨΛ஌ΒͤΔ 1)

    ೖࣨΛϦΫΤετ 6) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν 2. ϝσΟΞαʔόʔ͔Βͷ Πϕϯτ௨஌ͰҰ؏ੑΛ֬ อ͢ΔΞϓϩʔν 3) ઀ଓΛ
 ௨஌͢Δ 7) ੾அΛ
 ௨஌͢Δ 3. ϝσΟΞαʔόʹఆظత ʹঢ়ଶΛ໰͍߹ΘͤͯҰ؏ ੑΛ֬อ͢ΔΞϓϩʔν ఆظόονͰ ิਖ਼͢Δ 👍 Πϕϯτ͕ϩετ͠ ͯ΋݁Ռ੔߹ੑΛ୲อ Ͱ͖Δ
  33. ݁Ռ੔߹ੑ(Eventual Consistency) ݁Ռ੔߹ੑͱ͸…Ұ࣌తͳҰ؏ੑ͕อͨΕ͍ͯͳ͍ঢ়ଶΛڐ༰͠ɺ࣌ؒͷܦաͱͱ΋ ʹ࠷ऴతʹҰ؏ੑ͕อͨΕ͍ͯΔঢ়ଶʹҠߦ͢ΔҰ؏ੑϞσϧͰ͢ɻ ݁Ռ੔߹ੑ͸ɺଟ͘ͷNoSQLͳͲͷ෼ࢄγεςϜͷ࣮૷Ͱ࠾༻͞Ε͍ͯΔҰ؏ੑϞσ ϧͰɺ࣮૷͕༰қͳͷ͕ར఺Ͱ͢ɻ݁Ռ੔߹ੑͷ෼ࢄγεςϜͱͯ͠͸ɺ DNSʢDomain Name Systemʣ΍ɺ෼ࢄσʔλϕʔεͰ͸લड़ͨ͠Amazon Dynamo΍

    CassandraͳͲ͕୅දతͰ͢ɻ “ — https://techblog.yahoo.co.jp/architecture/2015-04-ditributed-consistency/
 ෼ࢄγεςϜͷҰ؏ੑʹؔ͢Δಈ޲ʹ͍ͭͯ
  34. ·ͱΊ: ύϥϨϧͷάϧʔϓ௨࿩Λࢧ͑Δٕज़ ελοΫͱઃܭࢥ૝ • ύϥϨϧͷάϧʔϓ௨࿩ج൫͸ɺϝσΟΞαʔόʔͱ API αʔόʔͰߏ੒ • API αʔόʔ͸

    GCP / GKE ্ͰՔಇ͍ͯ͠Δ • ΫϥΠΞϯτɺϝσΟΞαʔόʔɺAPI αʔόʔͷ͏ͪɺࠓճ͸ϝσΟΞ αʔόʔͱ API αʔόʔؒͰ௨࿩ঢ়ଶͷ݁Ռ੔߹ੑΛ֬อ͢ΔΞʔΩςΫ νϟΛ঺հ • ۩ମతͳ࣮૷্ͷ഑ྀ΍ɺΫϥΠΞϯτͱϝσΟΞαʔόʔͰͷ௨࿩ঢ় ଶͷҰ؏ੑΛ֬อ͢ΔͨΊͷऔΓ૊Έʹ͍ͭͯ͸ɺϖʔδ਺ͷ౎߹্ׂ Ѫͨ͠
  35. @yoheimuta ex. ϑϦʔΫ Ξ΢τ @cou929 ex. hey ಸྑ୓ւ ࠓճൃදͨ͠ج൫ ͷϝΠϯ࣮૷ऀ

    ࢁాਸਔ ex. LINE ླ໦ݴੜ ex. BASE @jarinosuke ex. ϝϧϖΠ ɹύϥϨϧ͸ੵۃ࠾༻தͰ͢ 😎 • ٕज़໘Ͱಛʹ΍Γ͍ͨ͜ͱ • ͜͜·Ͱ঺հͨ͠Α͏ͳ؍఺ ΛؚΊɺ௨࿩ج൫ΛΑΓ҆ఆ ͤ͞Δ͜ͱ • ௨࿩͠ͳ͕ΒଞͷεϚϗήʔ ϜΛͯ͠΋ʰམͪͳ͍ʱʰϥ ά͘ͳΒͳ͍ʱʰిྗΛফඅ ͠ͳ͍ʱΛ௥ٻ͢Δ͜ͱ • ϘΠνΣϯͳͲ໘ന͍Ի੠ػ ೳΛ࡞͍ͬͯ͘͜ͱ ۀ຿ҕୗͰख఻ͬͯ͘Ε ͍ͯΔ EN ͕ 8 ໊