Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
少数組織で開発する大規模サービス
Search
TVer Inc.
PRO
July 21, 2022
Technology
4
4.6k
少数組織で開発する大規模サービス
2022/07/21
Developers Summit 2022 Summer
イベントURL :
https://event.shoeisha.jp/devsumi/20220721
TVer Inc.
PRO
July 21, 2022
Tweet
Share
More Decks by TVer Inc.
See All by TVer Inc.
採用応募者の個人情報保護の取扱いについて_株式会社TVer
techtver
PRO
0
130
月間4.5億回再生を超える大規模サービス TVer iOSアプリのリアーキテクチャ戦略 - iOSDC2024
techtver
PRO
1
2.8k
成長し続けるTVerサービスを支える オブザーバビリティとカスタマーサポート
techtver
PRO
3
4.5k
Change Tracking でデプロイを記録してパフォーマンスへの影響を分析しやすくしよう
techtver
PRO
1
140
採用人事の立場で行う採用広報・技術広報の裏側 〜TVerがエンジニア採用を本格化するために継続し続けたこと〜
techtver
PRO
2
570
株式会社TVer 会社紹介資料
techtver
PRO
9
56k
採用人事の立場から、採用広報の立ち上げや技術広報の促進をしている話
techtver
PRO
0
910
バックエンドで頑張るSEO/OGP対策
techtver
PRO
0
1.3k
iOSエンジニア不在でもサービスを改善したい!配信サービスのiOSアプリにおける オブザーバビリティの導入と改善
techtver
PRO
0
2.6k
Other Decks in Technology
See All in Technology
rootlessコンテナのすゝめ - 研究室サーバーでもできる安全なコンテナ管理
kitsuya0828
3
390
安心してください、日本語使えますよ―Ubuntu日本語Remix提供休止に寄せて― 2024-11-17
nobutomurata
1
1k
組織成長を加速させるオンボーディングの取り組み
sudoakiy
3
270
10XにおけるData Contractの導入について: Data Contract事例共有会
10xinc
7
710
LINEヤフーにおけるPrerender技術の導入とその効果
narirou
1
260
DynamoDB でスロットリングが発生したとき_大盛りver/when_throttling_occurs_in_dynamodb_long
emiki
1
470
Terraform Stacks入門 #HashiTalks
msato
0
360
【Startup CTO of the Year 2024 / Audience Award】アセンド取締役CTO 丹羽健
niwatakeru
0
1.4k
FlutterアプリにおけるSLI/SLOを用いたユーザー体験の可視化と計測基盤構築
ostk0069
0
130
Next.jsとNuxtが混在? iframeでなんとかする!
ypresto
2
530
あなたの知らない Function.prototype.toString() の世界
mizdra
PRO
3
690
なぜ今 AI Agent なのか _近藤憲児
kenjikondobai
4
1.4k
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.8k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
Thoughts on Productivity
jonyablonski
67
4.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
28
2k
What's new in Ruby 2.0
geeforr
343
31k
Making Projects Easy
brettharned
115
5.9k
How to Ace a Technical Interview
jacobian
276
23k
Raft: Consensus for Rubyists
vanstee
136
6.6k
Adopting Sorbet at Scale
ufuk
73
9.1k
A Philosophy of Restraint
colly
203
16k
Embracing the Ebb and Flow
colly
84
4.5k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5k
Transcript
গ৫Ͱ։ൃ͢ΔେنαʔϏε גࣜձࣾ TVer / Ճզ وࢤ (SRE) גࣜձࣾ TVer /
ւ ܙհ (Backend) 2022/07/21 Developers Summit 2022 Summer
͜ͷηογϣϯʹ͍ͭͯ ຊ͓͢Δ͜ͱ • TVerϦχϡʔΞϧʹ͓͚ΔϞχλϦϯάվળ • গਓͰ։ൃͱվળΛߦ͏ͨΊͷ New Relic׆༻ํ๏
ࣗݾհ ɾՃզ وࢤ (@TAKA_0411) ɾגࣜձࣾTVer ɹαʔϏεࣄۀຊ෦ SRE ɾझຯαφͱήʔϜͱVTuber ɾϗʔϜαφߔޱԹઘ تָཬ
ΞδΣϯμ • TVerͷհ • αʔϏεϦχϡʔΞϧʹ͍ͭͯ • ϦϦʔε४උฤ • ϦϦʔεޙͷվળ •
·ͱΊ
ΞδΣϯμ • TVerͷհ • αʔϏεϦχϡʔΞϧʹ͍ͭͯ • ϦϦʔε४උฤ • ϦϦʔεޙͷվળ •
·ͱΊ
TVerͷհ
TVerͷհ [TVer] 2022 3 ݄ͷಈը࠶ੜ͕ 2 ԯ 5 ઍສճ/݄Λಥഁ!
https://tver.co.jp/news/20220426-1.html
TVerͷհ TVerͷ ٕज़ελοΫ
TVerͷٕज़ελοΫ ※ϑϩϯτΤϯυɺTVΞϓϦɺϞόΠϧΞϓϦέʔγϣϯ ֎෦ͷڠྗձࣾͷ͓ੈʹͳ͓ͬͯΓ·͢
TVerͷհ TVerͷ ΠϯϑϥετϥΫνϟ
TVerͷΠϯϑϥετϥΫνϟ WebαʔϏεͱͯ͠ͷTVer ൪࿈ಈγεςϜͰ Քಇ͍ͯ͠ΔϚΠΫϩαʔϏε
TVer (WebαʔϏε) ͷΠϯϑϥετϥΫνϟ
ΞδΣϯμ • TVerͷհ • αʔϏεϦχϡʔΞϧʹ͍ͭͯ • ϦϦʔε४උฤ • ϦϦʔεޙͷվળ •
·ͱΊ
αʔϏεϦχϡʔΞϧʹ͍ͭͯ
αʔϏεϦχϡʔΞϧʹ͍ͭͯ [TVer] ςϨϏίϯςϯπͷࢹௌମݧࠂମݧͷ্Λࢦ͢ ʮTVer IDʯͷఏڙΛ։࢝ https://tver.co.jp/news/20220404-1.html
αʔϏεϦχϡʔΞϧʹ͍ͭͯ γεςϜͷมߋ • ΠϯϑϥͷԽ • όοΫΤϯυͷ৽ • ϞχλϦϯάͷ৽
αʔϏεϦχϡʔΞϧʹ͍ͭͯ γεςϜͷมߋ • ΠϯϑϥͷԽ • όοΫΤϯυͷ৽ • ϞχλϦϯάͷ৽ɹ←ࠓճ͜͜ͷ ϦχϡʔΞϧΛػʹ New
Relic OneΛϑϧ׆༻
ϞχλϦϯάͷ৽ ϞχλϦϯάͷ৽ • ͷཧ • ಋೖ͢Δػೳͷऔࣺબ • μογϡϘʔυͱσʔλͷ׆༻
ϞχλϦϯάͷ৽ ϞχλϦϯάͷ৽ • ͷཧ • ಋೖ͢Δػೳͷऔࣺબ • μογϡϘʔυͱσʔλͷ׆༻
ϞχλϦϯάͷ৽ Before (ʙ202112݄) ʮNew RelicΛ ยखؒ ͰݟΔͷ͕ͭΒ͍ʂʯ Backend γε Πϯϑϥ
New Relic पΓͷରԠ New Relic पΓͷରԠ New Relic पΓͷରԠ APIͷ։ൃ Fargateݕূ ෛՙςετ ΞΧϯτ ઃܭͱඋ ίετࢼࢉ ͓Αͼܖ ֤෦ॺ͔Β ͷ͍߹Θ ͤରԠ νϡʔχϯά CI/CDඋ ཁ݅ཧ ΞϓϦϑϩ ϯτΤϯυͱ ͷௐ Πϯϑϥߏங ͱCDKपΓͷ උ
After (20221݄ʙ) ϞχλϦϯάͷ৽ SRE (ࢲ) New RelicपΓͷλεΫ ·Δ͝ͱҾ͖ड͚·͢Ͷ ΈΜͳ ͡Ό͋ϦʔυΑΖ͘͠ʂ
ଞͷλεΫਐΊΔͶ
࠷ۙ ϞχλϦϯάͷ৽ Backend SRE μογϡϘʔυͰ ͜ΜͳϝτϦΫε͕ݟ ͍ͨΜ͚ͩͲʙ ͜ͷ߹ʹΞϥʔτ ඈͯ͠ཉ͍͠ΑͶ
Γ͍ͨࣄΛԕྀͤͣʹ૬ஊɾ࣮ݱͰ͖Δମ੍ ◦◦ͱ͍͏ΛΩʔʹ͠ ͯΤϥʔΛௐ͍ࠪͨ͠ ͱࢥͬͯΔΘ͚Α Γ·͢
ϞχλϦϯάͷ৽ ϞχλϦϯάͷ৽ • ͷཧ • ಋೖ͢Δػೳͷऔࣺબ • μογϡϘʔυͱσʔλͷ׆༻
ϞχλϦϯάͷ৽ NRU101 New Relic One ೖ https://newrelic.com/jp/resources/presentations/nru101_20211027
ϞχλϦϯάͷ৽ ࣗͷཧ • MELTΛશͯຬ͍ͨͨ͠ ◦ Metrics, Events, Logs, Traces •
ΤϥʔௐࠪͷͨΊʹ Traces(APM)Λಋೖ͍ͨ͠
ϞχλϦϯάͷ৽ ݱ࣮ • New RelicͷGo Agent(APM)ͷ ಋೖ͕एׯ໘ • APMͷΦʔόʔϔου͕ෆ҆ •
pprofͰྑ͘ͳ͍ʁ • ͍ͬͯ͏͔ࠓඞཁͳΜ͚ͩͬʁ ϦϦʔε·Ͱ͋ͱ2ϲ݄ɾɾɾ
ϞχλϦϯάͷ৽ ͱΓ͋͑ͣ New Relic Go Agent Λ ඞཁ࠷খݶͷՕॴʹ͚ͩಋೖͨ͠
ϞχλϦϯάͷ৽
ϞχλϦϯάͷ৽ Dev (Backend)ɹɹOps (SRE) ಋೖ݁Ռ • EchoͷIntegrationΛઃఆ͢Δͩ ͚Ͱେ෯ʹՄࢹԽͰ͖ͨ • Τϥʔൃੜ࣌ͷτϦΞʔδ͕
Մೳʹͳͬͨ • ࠷খݶͷ࿑ྗͰ࠷େͷޮՌΛಘ Δ͜ͱ͕Ͱ͖ͨ
ϞχλϦϯάͷ৽ গ৫ × New Relic One • ػೳ͕๛ͰΦʔϧΠϯϫϯ • ಋೖͷϋʔυϧ͕͍
• υΩϡϝϯτɾαϙʔτɾίϛϡχςΟ͕ॆ࣮ • ͱΓ͋͑ͣಋೖ͢Δ͚ͩͰେ෯ʹՄࢹԽͰ͖Δ ಋೖɾӡ༻ͷίετ͕࠷খݶͰࡁΜͩ
ϞχλϦϯάͷ৽ ϞχλϦϯάͷ৽ • ͷׂ • ಋೖ͢Δػೳͷऔࣺબ • μογϡϘʔυͱσʔλͷ׆༻
ϞχλϦϯάͷ৽ ΫϥΠΞϯτͷಉ࣌ଓΫϥογϡͷϝτϦΫε
ϞχλϦϯάͷ৽ ि1ͰϞόΠϧΞϓϦͷΫϥογϡωοτϫʔΫΤϥʔΛௐࠪ͠ɺࣾ͘ʹڞ༗
ϞχλϦϯάͷ৽ μογϡϘʔυͱσʔλͷ׆༻ • ඞཁͳϝτϦΫεͰμογϡϘʔυΛඋ • ϑϩϯτΤϯυ͔ΒόοΫΤϯυ·ͰΧόʔ • ΤϥʔΛௐࠪͯࣾ͠ʹڞ༗ • APIͷվળʹAPMΛ׆༻
ࣗݾհ ɾւ ܙհ (@voidofglans) ɾגࣜձࣾTVer αʔϏεࣄۀຊ෦ ɹϦʔυ ΤϯδχΞ ɾ͖ͳͷ:ՐͰম͍ͨϗϧϞϯ ɾಸྑࡏॅͷԕִۈத
ɾNFCຒΊࠐΜͩΓ͢Δͷ͕͖
ΞδΣϯμ • TVerͷհ • αʔϏεϦχϡʔΞϧʹ͍ͭͯ • ϦϦʔε४උฤ • ϦϦʔεޙͷվળ •
·ͱΊ
ϦϦʔε४උฤ • ϑΣʔζʹΑͬͯNew Relicͷ͍͚ • গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ • ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
ϦϦʔε४උฤ • ϑΣʔζʹΑͬͯNew Relicͷ͍͚ • গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ • ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
ϑΣʔζʹΑͬͯNew Relicͷ͍͚ APMಋೖޙͷϦϦʔε·ͰͷϑΣʔζ • 2ϲ݄લ • 1ϲ݄લ • 2िؒલ
ϑΣʔζʹΑͬͯNew Relicͷ͍͚(2ϲ݄લ • Δ͖͜ͱόά௵͠ • ओʹར༻ͨ͠ػೳ ◦ Errors Inbox ◦
Errors ◦ NRQL • 4xx/5xxܥΤϥʔͷ༰Λੳ ◦ 4xx: ΫϥΠΞϯτ͕ఆ͍ͯ͠ͳ͍ύϥϝʔλ͕ͳ͍͔ ◦ 5xx: ఆ͍ͯ͠ͳ͍ॲཧλΠϜΞτ͕ͳ͍͔
ϑΣʔζʹΑͬͯNew Relicͷ͍͚(1ϲ݄લ • Δ͖͜ͱෛՙࢼݧʹΑΔϘτϧωοΫௐࠪ • ओʹར༻ͨ͠ػೳ ◦ Transactions ◦ Go
Runtime ◦ CloudWatch Metrics • ߴෛՙ࣌ͷΞϓϦέʔγϣϯશମͷڍಈΛੳ ◦ TransactionsͰͷSlowest95percentileͳͲΛࢦඪʹ ◦ ϝϞϦϦʔΫɺ์ஔ͞Εͨgoroutineͷଘࡏ ◦ GC AllocationʹΑΔஅଓతͳੑೳྼԽ
ϑΣʔζʹΑͬͯNew Relicͷ͍͚(2िؒલ • Δ͖͜ͱཁٻੑೳͷୡ • ओʹར༻ͨ͠ػೳ ◦ Transactions ◦ CloudWatch
Metrics • શମΛ௨ͨ͠ෛՙࢼݧͰͷ҆ఆύϑΥʔϚϯε ◦ 10msҎ্͔͔ΔAPI ◦ ֤ϛυϧΣΞͷΫΤϦଓͷ ◦ ॻ͖ࠐΈܥAPIͰͷLock,Waitͷ
ϦϦʔε४උฤ • ϑΣʔζʹΑͬͯNew Relicͷ͍͚ • গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ • ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ ૣ͘ߦ͖͚ͨΕɺͻͱΓͰߦ͚ɻ ԕ͘·Ͱߦ͖͚ͨΕɺΈΜͳͰߦ͚ɻ If you want to go fast, go
alone. If you want to go far, go together.
গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ ͓͚ͬʂ ͡Ό͋ͪΐͬͱ1ਓͰߦͬͯ͘Δʂ
গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ ϦϦʔε·Ͱʹ ΈΜͳݱू߹Ͱʂ
• ͦΕͧΕ͕ͦΕͧΕͷ࠷Ͱతʹ • ͷ໌֬ͳղ • ໌֬ͳతͷڞ༗ গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ
• ίέͳ͍͜ͱ͕ॏཁ • Backend/Infra/SREͦΕͧΕ͕ઐੑΛ࣋ͬͯಠཱ͠ ͨϝϯόʔ • ίϛϡχέʔγϣϯίετ͕࠷ݶʹ͑ΒΕͨ গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ
গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ • ൫ͬͨ • ࣍ΈΜͳͰԕ͘ߦ͜͏
ϦϦʔε४උฤ • ϑΣʔζʹΑͬͯNew Relicͷ͍͚ • গਓͰεϐʔυײΛམͱ͞ͳ͍ͨΊʹ • ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
• Α͋͘ΔಥൃతͳεύΠΫ ◦ ্࿈ಈ์ૹΕʹΑΔྲྀೖ ▪ 1minޙ͖ͬ͞·Ͱͷ10ഒҎ্ͷϦΫΤετ ▪ ૿͑Δಉ࣌ଓ ◦ ΞΠυϧࣄॴλϨϯτ༷ग़ԋ൪
◦ ϦΞϧλΠϜ৴൪ऴྃ࣌ ▪ Ϣʔβʔ͕Ұ੪ʹβοϐϯά ▪ ಉظͷͱΕͨສʙेສͷϢʔβʔΞΫγϣϯ ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
• ϦϦʔεલʹSRE͕͔ͬ͠Γઐͯ͘͠Εͨ ◦ New RelicΛݟ͓͚ͯҰൠతͳࢦඪશ෦ݟΕΔ ◦ ఆ͞ΕΔΞΫηεύλʔϯʹ͓͚ΔMetricsͷมԽΛࣄ લʹೝࣝ͢Δ ◦ ෛՙࢼݧ/ରࡦʹूத͢Δ͜ͱ͕Ͱ͖ͨ
ύϑΥʔϚϯεɾνϡʔχϯά/ෛՙରࡦ
ΞδΣϯμ • TVerͷհ • αʔϏεϦχϡʔΞϧʹ͍ͭͯ • ϦϦʔε४උฤ • ϦϦʔεޙͷվળ •
·ͱΊ
ϦϦʔεޙͷվળ • ԣஅతʹՄࢹԽ͞ΕͨMetricsͷԸܙ • ఆظతʹ࣮ࢪ͢ΔμογϡϘʔυோΊΔձ • ͷʹΑΔରԠͷ୲อ
ԣஅతʹՄࢹԽ͞ΕͨMetricsͷԸܙ • ҆ఆՔಇ͍ͯ͠Δ͜ͱ͕ԕͰΘ͔Δ҆৺ײ
ԣஅతʹՄࢹԽ͞ΕͨMetricsͷԸܙ • σόΠε͝ͱͷ࣮ʹΑΔࠩҟͷݕ ◦ σόΠεछผΛCustomAttributeʹ֨ೲ͢Δ ◦ ϦΫΤετΤϥʔͷѲ ▪ iOSΞϓϦ͚ͩಛఆͷϖʔδͰͷAPIϦΫΤετ͕ҟৗʹଟ͍ ⿌
ϦετදࣔͰཁૉ͝ͱʹAPIΛݺͼग़͍ͯͨ͠ ⿌ 30minΒͣͰݪҼಛఆˠ։ൃϕϯμʔͷڞ༗ ⿌ 3ޙͷϦϦʔεʹแؚ͠ɺແࣄղফ🎉
ԣஅతʹՄࢹԽ͞ΕͨMetricsͷԸܙ • ։ൃॳఆ͞Ε͍ͯͳ͍ϢʔβʔγφϦΦ ◦ ࢥͬͨͷͷ3ഒ͘Β͍ݕࡧػೳ͕ΘΕ͍ͯΔʂʂ ◦ ࢥͬͨΑΓxxͷػೳ͕ΘΕͯͳ͍ʂʂ ఆͱӡ༻ဃ͢Δͷ
• աͳϦιʔε͕͙͢Θ͔Δ ◦ ϦϦʔεॳظ҆৺ΛۚͰങ͍ͬͯͨͷͰ५ͳϦιʔε Λ༻ҙ͍ͯͨ͠ ◦ ίετΠϯύΫτΛ࣠ʹॱ࣍Ϧιʔεͷ࠷దԽΛߦ͑ͨ ▪ ͪΖΜ͜ΕՄࢹԽ͞Ε͍ͯΔͷͰμϝͳ߹ͷݕਝ ԣஅతʹՄࢹԽ͞ΕͨMetricsͷԸܙ
• ࡢࠓؾʹͳͬͨࢦඪΛμογϡϘʔυʹՃ • Metricsͷҧײʹؾͮ͘ᄿ֮ͷ܇࿅ • োޙτϥϒϧൃੜ࣌ͷݟͷूੵ ఆظతʹ࣮ࢪ͢ΔμογϡϘʔυோΊΔձ
ͷʹΑΔରԠͷ୲อ • ਖ਼͘͠ઐʹͤΔ ◦ த్ʹ͍݉ͯ͠ΔͱɺԱଌओ؍͕ೖͬͯ͠·͍͕ ͪ ◦ ໌֬ͳͷ ▪ SREࣄ࣮ͱϩάΛ͢ͱ͜Ζʹઐ೦
ΞδΣϯμ • TVerͷհ • αʔϏεϦχϡʔΞϧʹ͍ͭͯ • ϦϦʔε४උฤ • ϦϦʔεޙͷվળ •
·ͱΊ
·ͱΊ • 1ਓͰ๊͑ࠐΉͷΑ͘ͳ͍ • ૣ͘ΔͨΊʹΛ໌֬ʹղ͢Δඞཁ͕͋Δ • ͰͬͺΓΈΜͳͰૣ͘ԕ͘ߦ͖͍ͨʂʂ
·ͱΊ • ແࣄϦϦʔεˍ҆ఆӡ༻͕࢝·ͬͨ🎉 • NewRelicΛ։ൃڥͰ׆༻ ◦ ։ൃ࣌ͷόάτϥοΩϯά ◦ ՝ཧͱͷ࿈ܞ ◦
QAνʔϜʹΑΔNewRelicͰͷࣄ࣮ڞ༗ • ։ൃ৫ͷϦϑΝΫλϦϯάΛ࢝Ί͍͖ͯ·͢ ◦ ࠓ·Ͱͷ୲ΛਓνʔϜͰ୲ ◦ ઐνʔϜʹΑΔεϧʔϓοτΛ୲อͨ͠։ൃ৫
None
None