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

パラレルのグループ通話を支える技術スタックと設計思想 / Tech Stack and Arc...

パラレルのグループ通話を支える技術スタックと設計思想 / 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 サーバーに分けられるのでそれぞれ説明していきます。
次に、その中で、パラレルが大事にしている要件があるのでそれを満たすアーキテクチャを説明していきたいと思ってます。聴き終わった後に、ここに書いてある「一貫した通話状態」が何を指していて、何で大事にしているのかがわかるように発表していきたいと思います。

yoheimuta

May 14, 2021
Tweet

More Decks by yoheimuta

Other Decks in Programming

Transcript

  1. ɹύϥϨϧͷ঺հ iOS ͱ Android Ͱ 100ສ DL Ϣʔβʔͷ 70 %

    ͕ Zੈ୅(~ 24ࡀ) ᶃ༑ୡͱू·Δ ᶄ௨࿩͢Δ ᶅίϯςϯπͰ༡Ϳ ݄ؒ૯௨࿩࣌ؒ͸ 4 ԯ෼Ҏ্ Ϣʔβʔͷ 1 ೔ͷฏۉ௨࿩࣌ؒ͸ 3 ࣌ؒ Apple Store ධՁ͸ 4.7/5 (2ສ݅) ༑ୡͱ12࣌ؒ௨࿩Λͭͳ͛ͨ··΋௝͘͠ͳ͍ ͦͷͱ͖ͷؾ෼ʹ߹ΘͤͯɺYouTube Λ
 ಉ࣌ࢹௌͨ͠Γɺେ෋߽Λͯ͠༡Ϳ
  2. ຊ೔ͷςʔϚ • ύϥϨϧͷάϧʔϓ௨࿩ʢϥΠϒ഑৴ʣͷج൫ʹ͍ͭͯ • Ի੠ͱө૾Λѻ͏ϝσΟΞαʔόʔ • ͦΕҎ֎ͷσʔλΛѻ͏ API αʔόʔ •

    ύϥϨϧͷάϧʔϓ௨࿩ج൫Ͱେࣄʹ͍ͯ͠Δ͜ͱ • Ұ؏ͨ͠௨࿩ঢ়ଶΛಘΔͨΊͷΞʔΩςΫνϟͱͦͷมભʹ͍ͭͯ
  3. ύϥϨϧͷάϧʔϓ௨࿩ॲཧͷϑϩʔ 1) ઀ଓ͢Δ 2) ೖࣨΛ஌ΒͤΔ 3) ੾அ͢Δ ༑ୡͷ Bob ͕ಉ͡ϧʔϜʹೖ

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

    Bob ͕ಉ͡ϧʔϜʹೖ ͍ࣨͯ͠Ε͹Ի੠͕ྲྀΕͯ͘Δ HTTPɺWebSocketɺ Push ௨஌ɺͦΕͧΕͰ ࠷৽ͷঢ়ଶ͕൓ө
  5. ύϥϨϧͷάϧʔϓ௨࿩ঢ়ଶ؅ཧ Alice ͷ௨࿩ঢ়ଶ͕
 ೋॏ؅ཧ͞Ε͍ͯΔ Connection Ͱ ௨࿩ঢ়ଶΛ؅ཧ ෳ੡ͨ͠ɺ௨࿩ঢ় ଶΛ؅ཧ Copy

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

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

    — https://ja.wikipedia.org/wiki/෼ࢄγεςϜ ෼ࢄγεςϜ͸ɺϢʔβʹରͯ͠୯ҰͰटඌҰ؏ʢcoherentʣͨ͠γεςϜ ͱͯ͠ݟ͑Δಠཱͨ͠ίϯϐϡʔλͷू߹Ͱ͋Δ “ — λωϯό΢Ϝ&ϑΝϯɾεςΟʔϯஶ, ਫ໺Β༁
 ෼ࢄγεςϜ ݪཧͱύϥμΠϜ
  8. ௨࿩ঢ়ଶͷҰ؏ੑΛߟྀͨ͠ΞʔΩςΫνϟ 2) ઀ଓ͢Δ 4) ੾அ͢Δ 3) ೖࣨΛ஌ΒͤΔ 6) ୀࣨΛ஌ΒͤΔ 1)

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

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

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

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

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

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

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

    ೖࣨΛϦΫΤετ 6) ୀࣨΛϦΫΤετ 1. ΫϥΠΞϯτଆͰҰ؏ੑ Λ֬อ͢ΔΞϓϩʔν 2. ϝσΟΞαʔόʔ͔Βͷ Πϕϯτ௨஌ͰҰ؏ੑΛ֬ อ͢ΔΞϓϩʔν 3) ઀ଓΛ
 ௨஌͢Δ 7) ੾அΛ
 ௨஌͢Δ 3. ϝσΟΞαʔόʹఆظత ʹঢ়ଶΛ໰͍߹ΘͤͯҰ؏ ੑΛ֬อ͢ΔΞϓϩʔν ఆظόονͰ ิਖ਼͢Δ 👍 Πϕϯτ͕ϩετ͠ ͯ΋݁Ռ੔߹ੑΛ୲อ Ͱ͖Δ
  16. ·ͱΊ: ύϥϨϧͷάϧʔϓ௨࿩Λࢧ͑Δٕज़ ελοΫͱઃܭࢥ૝ • ύϥϨϧͷάϧʔϓ௨࿩ج൫͸ɺϝσΟΞαʔόʔͱ API αʔόʔͰߏ੒ • API αʔόʔ͸

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

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