Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
WebシステムのパフォーマンスとGo
Search
karupanerura
November 01, 2019
Programming
1.8k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebシステムのパフォーマンスとGo
DeNA.go #3
karupanerura
November 01, 2019
More Decks by karupanerura
See All by karupanerura
音を出したい
karupanerura
0
120
Perl Meets \w+ あるいは開発を支えるPerl活用の実例集
karupanerura
0
98
log
karupanerura
1
120
Use Perl as Better Shell Script
karupanerura
0
970
GoでParserを書く
karupanerura
4
1.1k
マイ隙間家具OSSたちのご紹介
karupanerura
2
310
Mustache Template 話 2024
karupanerura
0
80
1つの言語を原点に色々な言語を学ぶということ
karupanerura
4
4.5k
Javaの実装をPerlでテストする
karupanerura
0
1.5k
Other Decks in Programming
See All in Programming
カツオ、ご期待ください
suneo3476
0
140
Embedded Swiftで作る自作USBデバイス によるiOSデバイスの自動テスト / iOSDC Japan 2026 glassfiber
glassfiber
0
260
巨大モノリシックアプリ モダン化大作戦
ktcryomm
1
1.2k
標準パッケージに uuid が追加された 背景から見る Go らしい意思決定 / go_127_uuid_decision
convto
5
9.4k
ソニーのクラウド共通基盤の変遷とAI時代の開発スタイルに合わせた進化 / The Journey of Sony’s Common Cloud Platform and Its Evolution for AI-Native Development
kenjiyoneyama
0
210
世界の中心で、AI(App Intents)をさけぶ ー App Intents中心設計の実践ガイド
touyou
0
750
選挙速報を多くのユーザーへ 届ける Live Activities 設計
hamayokokuririn
0
210
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
300
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
1
410
UPDATE をやめる — EF Core でマスタをバージョン管理する
panda728
PRO
0
1.1k
更なる可用性を求めて、5年間運用したKotlinのアプリケーションをGoでリプレイスする話
ken_tunc
0
430
APNsからLive Activityを開始する話
yumnumm
0
140
Featured
See All Featured
Mobile First: as difficult as doing things right
swwweet
225
10k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
580
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
300
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Heart Work Chapter 1 - Part 1
lfama
PRO
10
36k
The Curse of the Amulet
leimatthew05
3
15k
How to make the Groovebox
asonas
2
2.5k
Leo the Paperboy
mayatellez
10
2.3k
It's Worth the Effort
3n
188
29k
Balancing Empowerment & Direction
lara
6
1.3k
Ruling the World: When Life Gets Gamed
codingconduct
0
380
Transcript
WebγεςϜͷ ύϑΥʔϚϯεͱGo DeNA.go #3 id:karupaneura
id:karupanerura • ιϑτΣΞΤϯδχΞ @ DeNA, Co,. LTD. • ͓ࣄ: ϓϥοτϑΥʔϜ։ൃ
(Perl/Go/Java/etc..) • ISUCON8: ༧બग़νʔϜ (࡞ɺϕϯνϚʔΧʔ) • αϚʔΠϯλʔϯγοϓ2019: ΤϯδχΞ͚ίʔε։ൃ • දཧࣄ @ Japan Perl Association
Goal
WebγεςϜʹ͓͚ΔຊͷGoͷڧΈ Λߟ͑ͯ͠Β͏
ҙࣝ • ʮͱΓ͋͑ͣGoͰॻ͍͓͚͍ͯΜͰ͠ΐʁʯ • ͍͘ΒLLͱൺͯϕϯνϚʔΫ͕༏ल͔ͩΒͱ͍ͬͯͦΓΌ… • ʮͰISUCONͰ༧બ௨աͯ͠ΔͷGoͷνʔϜ͔Γ͡ΌΜʯ • ༗རͳଆ໘ͨ͘͞Μ͋Δ͚Ͳ…είΞ͕͍νʔϜ…
ݱ࣮ΛݟΑ͏
ͱ͔ͬ͠Γ͖߹͓͏
ࠓճ͢͜ͱ • WebγεςϜʹ͓͚ΔύϑΥʔϚϯεͱͳʹ͔ • Ͳ͏͍ͬͨͷ͕ϘτϧωοΫʹͳΔͷ͔ • ͦͷͨΊʹGoͷػೳΛͲͷΑ͏ʹ׆༻͢Δͱྑ͍ͷ͔
ࠓճ͞ͳ͍͜ͱ • DeNAαϚʔΠϯλʔϯγοϓͷৄࡉ • ͲͷΑ͏ʹܭଌͯ͠ϘτϧωοΫΛൃݟ͢ΔͱΑ͍͔
ͦͦύϑΥʔϚϯεͬͯͳΜ͚ͩͬʁ
WebγεςϜʹ͓͚ΔཧతύϑΥʔϚϯε • γεςϜશମͰߟ͑ͨͱ͖... • ୯Ґ࣌ؒͨΓʹͨ͘͞ΜͷϦΫΤετΛॲཧͰ͖Δ • ಉ࣌ʹෳͷϦΫΤετΛޮΑ͘ॲཧͰ͖Δ • ϦΫΤετ୯ҐͰඞཁͱ͢ΔϦιʔε͕গͳ͘ࡁΉ •
͋·ΓແବʹϦιʔεΛফඅ͠ͳ͍
ҰํͰݱ࣮ͷγεςϜͷଟ͘ ཧతͳύϑΥʔϚϯεͰͳ͍
ͳͥύϑΥʔϚϯεԼ͢Δ͔ • γεςϜશମͰߟ͑ͨͱ͖ʹ... • ୯Ґ࣌ؒͨΓʹͨ͘͞ΜͷϦΫΤετΛॲཧͰ͖ͳ͍ • ಉ࣌ʹෳͷϦΫΤετΛॲཧ͢Δޮ͕ѱ͍ • ϦΫΤετ୯ҐͰඞཁͱ͢ΔϦιʔε͕ଟ͍ •
ແବʹϦιʔεΛফඅͯ͠͠·͏
ύϑΥʔϚϯεͷԼཁҼΛഉআ͢Ε ύϑΥʔϚϯε্Ͱ͖Δ
ύϑΥʔϚϯεͷԼཁҼΛഉআ͢Ε ύϑΥʔϚϯε্Ͱ͖Δ γεςϜશମͷϘτϧωοΫʹ͢Δ͖
۩ମྫΛҎͯߟ͑ͯΈΔ
DeNA αϚʔΠϯλʔϯγοϓ2019 ΤϯδχΞίʔε
՝: ΞϓϦέʔγϣϯΛ͍͍ײ͡ʹͤΑ (͍͍ײ͡ʹύϑΥʔϚϯεؚ·ΕΔ)
ΞϓϦέʔγϣϯհ (demo)
ύϑΥʔϚϯεཁ݅ ʮ֨҆εϚϗͷൃചΛه೦͠CMʹग़ԋதͷਓؾܳਓ͕ϦΞϧλ ΠϜͰ࣭Λड͚͚ΔઐνϟϯωϧΛ։ઃ͠·͢ɻʯ ͜͜·Ͱ͑ΒΕΕޚͷࣈɺഒͰେৎͳΒ҆Մೳɿ • 5000ൃݴ/ඵ (x2: 10000ൃݴ/ඵ) • 5ສਓͷಉ࣌ଓ
(10ສಉ࣌ଓ)
γεςϜߏਤ • EC2 1 • AppͱDBಉډ • ALBͰTLSΛॲཧ • S3/Cloud
Frontະ༻
ύϑΥʔϚϯεվળͷྲྀΕ for { • ܭଌ • ϘτϧωοΫΛಛఆ • ϘτϧωοΫΛղফ }
ύϑΥʔϚϯεվળͷྲྀΕ for { • ܭଌ • ϘτϧωοΫΛಛఆ • ϘτϧωοΫΛղফɹˡɹࠓճ͜͜ʹ }
࣮ࡍͷύϑΥʔϚϯεվળ
վળޙͷγεςϜߏਤ • App/DB • S3/Cloud Front׆༻ • ΄͔MySQLνϡʔχϯά
ൃݴ͕ଟ͘ͳΔͷରࡦ
ൃݴ͕ଟ͘ͳΔͷରࡦ • νϟοταʔϏεͷൃݴ͕ଟ͍ͱͲ͏ͳΔ͔ • DBͷinsert͕٧·Δ (MySQLͷνϡʔχϯάͰҰఆվળ͢Δ) • insert͕ͳͥ٧·Δ͔ • DBͷϩοΫΛಉ࣌ଟൃతʹऔΔ͜ͱʹͳΔ͔Β
insertͷϩοΫڝ߹ʹͲ͏ରॲ͢Δ͔ • insertDBͷϩοΫΛऔΔ͜ͱʹͳΔ • ϩοΫΛऔΔػձΛΒ͢͜ͱʹΑͬͯϩοΫڝ߹ΛݮΒͤΔ • ෳͷൃݴΛ·ͱΊͯinsert͢Δͱ... • 1ճͷϩοΫͰෳͷൃݴ͕insertͰ͖͓ͯಘ
insertΛbufferingͯ͠·ͱΊͯΔ • ൃݴΛόοϑΝϦϯάͯ͠insert͢Δworker goroutineΛ࡞ • ϦΫΤετΛॲཧ͢Δgoroutine͔Βchannelܦ༝Ͱ͛Δ • channelͰinsertͷ݁ՌΛड͚औΔ • workerbuffer͕Ұఆ݅ཷ·ͬͨͱ͖͔ҰఆͷintervalͰॲཧ
࣮ࡍͷίʔυ • ʢDBνϡʔχϯά͚ͩͰΛղফͯ͠͠·ͬͨͷͰະ࣮ʣ • DeNA.goͷͨΊʹॻ͖ԼΖͦ͏ͱࢥ͚ͬͨͲؒʹ߹Θͳ͔ͬͨ
ಉ࣌ଓ͕ଟ͘ͳΔͷରࡦ
ಉ࣌ଓ͕ଟ͘ͳΔͱ • ൃݴͷऔಘ͕ଟ͘ͳΔ • ͚ࠩͩऔಘ͍ͨ͠ • ͔͠͠৽ணΛpolling͢Δͱൃݴͷগͳ͍νϟϯωϧ͕ਏ͍ • ʢॳظ࣮શൃݴΛऔΔAPIΛpollingͯ͠Δʣ
Server Sent Events • ҰੲલͷComet͕༷Λཧͯ͠ਖ਼نԽ͞Ε·ͨ͠తͳͭ • WebSocketΑΓѻ͍͕؆୯ • αʔόʔͱΫϥΠΞϯτͰίωΫγϣϯΛషΓଓ͚Δ •
αʔόʔ͔ΒΫϥΠΞϯτʹσʔλΛpushͰ͖Δ (ٯෆՄ)
DBʹϦΫΤετΛඈ͞ͳ͍ • ͖ͬ͞ͷͭͱಉ͡ཁྖͰworker͕࠷৽ͷൃݴΛbuffering͢Δ • DBworker͚͕ͩpollingͯ͠bufferΛߋ৽͍ͯ͘͠ • client͝ͱʹ࠷ޙͷൃݴΛอ͓͍࣋ͯͯͦ͠ΕҎ߱ͷΛ௨ • ௨͞ΕͨͷΛServer Sent
EventsͰclientʹૹΔ
࣮ࡍͷίʔυ (worker goroutine)
࣮ࡍͷίʔυ (worker goroutine)
࣮ࡍͷίʔυ (worker goroutine)
࣮ࡍͷίʔυ (http handler)
ͦͷଞ
sync.Pool • ϦΫΤετͷbytes.BufferͳͲΛৗʹ࡞ΔͱGC͕ਏ͍ • sync.PoolΛ͏ͱgoroutine͝ͱʹڝ߹͠ͳ͍Pool͕࡞ΕΔ • ϝϞϦޮྑ͍͕ϝϞϦফඅ͍ͯ͘͠ͷͰѻ͍ʹҙ
encoding/json • ϨεϙϯεΛ࡞Δͷʹඞͣͦ͠ΕͱಉαΠζͷόοϑΝΛ࡞ Δඞཁͳ͍ • ࡞ͬͨͿΜ͔Βૹ͍͚ͬͯΑ͍ • ͨͩ͠ (*json.Encoder).Write ్தͰerrorΛฦ͠ࢭ·Δ͜ͱ
͕͋Δ • ਖ਼͘͠ϨεϙϯεΛฦͨ͢Ίʹbufferඞཁ
io • sync.PoolͰอ࣋ͨ͠bytes.BufferΛhttp.ResponseWriter • bytes.Bufferio.WriterToΛ࣮͍ͯ͠ΔͷͰWriteToͰ͖Δ • bytes.BufferͷWriteTobytes.Bufferͷposition͚ͩม͍͑ͯ ͖ޮΑ͘WriteͰ͖Δ • io.CopyBufferͳͲศར
database/sql • σϑΥϧτͰDBͱͷଓΛόοϑΝϦϯάͯ͘͠ΕΔ • SetMaxIdleConns/SetMaxOpenConns/SetConnMaxLifetime • ࣮ࡍͷنʹ͋Θͤͯௐ͢Δͱଓ͕࠷దԽͰ͖Δ • SetMaxIdleConnsͷσϑΥϧτ2
·ͱΊ
·ͱΊ • Goʹ͚ͨͩ͠Ͱ͘ͳΒͳ͍ͷͰϦιʔεΛޮΑ͓͘͏ • ಛʹϘτϧωοΫʹͳΓ͍͢Ϧιʔεʹҙ • ༨༟͕͋ΔϦιʔεΛ׆༻ͯ͠͠Α͏ • جຊػೳio, syncͳͲศརͳඪ४ύοέʔδΛ·ͣ׆༻͠Α͏
• ݶΓ͋ΔϦιʔεΛޮΑ͘׆༻͢Δϊϋͷๅݿ