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
GraphQLサーバを作る苦しみと解決手法
Search
mackee
July 21, 2020
Technology
9.5k
16
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
GraphQLサーバを作る苦しみと解決手法
吉祥寺.pm23
https://kichijojipm.connpass.com/event/182287/
mackee
July 21, 2020
More Decks by mackee
See All by mackee
Go1.27で導入されるジェネリクスメソッドでできること
mackee
0
140
perlをWebAssembly上で動かすと何が嬉しいの??? / Where does Perl-on-Wasm actually make sense?
mackee
0
1k
Agentに至る道 〜なぜLLMは自動でコードを書けるようになったのか〜
mackee
6
5.9k
今!ソフトウェアエンジニアがハードウェアに手を出すには
mackee
14
7.1k
ワンバイナリWebサービスのススメ
mackee
10
8.8k
tanukistack ライブコーディング / tanukistack live-coding
mackee
0
680
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
1.2k
perl for shell, awk and sed programmers
mackee
3
2.8k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
1.1k
Other Decks in Technology
See All in Technology
2026 TECHFRESH 畢業分享會 - AI-Native 重塑軟體工程與虛擬講師
line_developers_tw
PRO
0
1.3k
【2026年版】 ベクトル検索とEmbedding最前線
mocobeta
19
5k
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
0
250
LayerXにおけるセキュリティ管理の現在地と次の一手
tosho
0
250
生成 AI 実践ガイド (概略版) AIガバナンス編
asei
0
130
Oracle AI Database@Azure:サービス概要のご紹介
oracle4engineer
PRO
6
2k
攻撃者視点で考えるDetection Engineering
cryptopeg
3
2k
iAEONの段階的リアーキテクト戦略 / iAEON's_Gradual_Re-architecture_Strategy
aeonpeople
0
230
白金鉱業Meetup_Vol.24_「AIエージェントは分けるほど良い」は本当か? / Is it true that “the more you divide AI agents, the better”?
brainpadpr
1
420
徹底討論!ECS vs EKS!
daitak
0
550
マルチアカウント環境での コーディングエージェントを使った障害調査が大変なので AIエージェントにReadOnly権限を付与してみた / ReadOnly AI Agents for Multi-Account AWS Incident Response
yamaguchitk333
2
110
20260619 私の日常業務での生成 AI 活用
masaruogura
1
230
Featured
See All Featured
BBQ
matthewcrist
89
10k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
340
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
170
Six Lessons from altMBA
skipperchong
29
4.3k
Making Projects Easy
brettharned
120
6.7k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Discover your Explorer Soul
emna__ayadi
2
1.1k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
240
Designing for humans not robots
tammielis
254
26k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Transcript
GraphQLαʔόΛ࡞Δۤ͠Έ ͱղܾख๏ @mackee_w a.k.a macopy 2020-07-21 ٢ࣉ.pm23
͢͜ͱ • ͱͱGraphQLʹջٙతͩͬͨਓ͕ • GraphQL͕͢ͰʹΘΕ͍ͯΔϓϩδΣΫτͰͪΐͬͱۤ͠Έ • ࡞Γͧ͢ʂͱͳͬͨͱ͖ʹ·ͨGraphQLΛ͏ཧ༝
macopy *ʮ ߏମҠ͠ସ͑ۀʯ * WebΞϓϦέʔγϣϯΤϯδχΞ * ୲αʔόαΠυ(Perl/Go) * Ϛελσʔλཧ͕ಘҙͰ͕͢࠷ ۙͦ͏͍͏ࣄ͕͋Γ·ͤΜ
࠷ۙͷ͓ࣄ
ࠓͷओ GraphQL
͔ͯ͠͠٢ ࣉpmʹGraphQL ͷ͕དྷ͍ͯ Δʁʁʁ
GraphQL͓͞Β͍ • Web͚ΫΤϦݴޠ • ಉׂ͡Λ͢Δͷ: OpenAPI, gRPC, JSON-RPC… • GitHubͳͲͷWeb
APIͰ࠾༻ྫ͋Γ • `/graphql`Έ͍ͨͳ୯ҰͷΤϯυϙΠϯτʹΫΤϦΛ͛Δ • ϨεϙϯεJSON͕Α͘ΘΕΔ(͕ɺผʹԿͰྑ͍ͣ)
GraphQLΛ͏ͱ͖ͷྲྀΕ εΩʔϚ ΫΤϦ ม Ϩεϙϯε POST /graphql
GraphQLɺԿ͕͏Ε͍͠ͷʁ • ܕ͕͋ͬͯૉΒ͍͠ • ܕ໊ʹ`!`͕ͭ͘ͱnot nullable • ඞཁͳfieldͷߜΓࠐΈɺҰॹʹऔΓ͍ͨϦιʔεͷҰׅऔಘͰ͖Δ • ࣹӨbatch
requestΈ͍ͨͳΈΛ࡞Γࠐ·ͣʹࡁΉ • पลπʔϧ/ϥΠϒϥϦ͕͍ͬͺ͍͋ͬͯૉΒ͍͠ • GraphiQL, apollo-client/apollo-server ͳͲͳͲ
͜ͷ”͏Ε͍͠” ୭ͷࢹ͔ʁ
αʔό(Perl)୲ͷࢲࢹͰݟΔͱ
GraphQLɺԿ͕͏Ε͍͠ͷʁ • ܕ͕͋ͬͯૉΒ͍͠ • ܕ໊ʹ`!`͕ͭ͘ͱnot nullable • ඞཁͳfieldͷߜΓࠐΈɺҰॹʹऔΓ͍ͨϦιʔεͷҰׅऔಘͰ͖Δ • ࣹӨbatch
requestΈ͍ͨͳΈΛ࡞Γࠐ·ͣʹࡁΉ • पลπʔϧ/ϥΠϒϥϦ͕͍ͬͺ͍͋ͬͯૉΒ͍͠ • GraphiQL, apollo-client/apollo-server ͳͲͳͲ ←ͤͳͰαʔόɺPerlͶΜ… ɹundefେܴͶΜ… ↑͑ɺͭ·Γൃߦ͞ΕΔSQL͕ݻఆͰ͖ͳ͍ʁʁ ɹࠔΔͷͰʁʁʁ ↑ͦΕPerlʹ͋Δͷʁʁʁʁʁ
GraphQLΛຊ֨తʹ͏લ·Ͱͷҹ(1) • ΫϥΠΞϯτଆͷૢ࡞ͰσʔλͷऔΓग़͠ํ͕ಈతʹมΘΓ͏Δͷड ͚ೖΕ͕͍ͨ • ύϑΥʔϚϯενϡʔχϯά͕͔ͳΓ͍͠ • RESTful APIʹൺͯGraphQLͰN+1ͷղܾ͕͍͕͜͜͠ΩϞ ͩͱࢥΘΕΔ
• RESTful APIͰฦ͢σʔλͷܗ͕ҰఆͩͱܾΊଧͪνϡʔχϯάͰ͖ Δ GraphQLͦΕ͕ग़དྷͳ͍
GraphQLΛຊ֨తʹ͏લ·Ͱͷҹ(2) • GitHub API v4(GraphQL)͕ग़ͨͱ͖ʹΘʔ͍ͱ৮ͬͯΈͨͱ͖ͷײ • GraphQLݴޠΛ֮͑Δͷ͕ղ(ʹݟ͑ͨ) • ୯ͳΔJSONͷੜͰͳ͍ಠࣗDSL •
ͪΐͬͱෳࡶͰωετ͕ਂͯ͘ྔ͕ଟ͍ΫΤϦΛൃߦ͢Δͱ500͕ฦ͖ͬͯͨ • ʮGitHubͰ͢Β͜͏ͳΔΜ͔ͩΒզʑʹ…ʯ • ͨͿΜࠓComplexityΛܭࢉͯ͠200Ͱฦͤͳ͍Αͱݴͬͯ͘ΔͷͰͳ͍͔
͕ٕज़બ͢ΔͳΒબͳ͍ͩΖ͏…
ԑ͕ͳ͍ͱࢥ͍͕ͬͯͨɺ͔͠͠…
ࠓ಄ʹҟಈͨ͠ ςʔϚʮࠓͷલͷ׆ಈΛৼΓฦΔʯ
ҟಈޙͷձ • ʮͳΜ͔͜ͷϖʔδදࣔ͞ΕΔ·Ͱॏ͍͠ɺαʔό͘͢͝CPU৯͏ ΜͰ͢ΑͶʯ • ʮͲΕͲΕݟͯΈΔ͔…͋͋׳Ε͠ΜͩPerlͩ…ʯ •ʮͬɺGraphQLͩ…ʯ
ॏ͍ϖʔδΛνϡʔχϯά͢Δ • ͜ͷ࣌ͰԿ͕ݪҼ͔Θ͔Βͳ͍ • GraphQLͰͳ͘ɺΞϓϦέʔγϣϯϩδοΫͷํʹݪҼ͕͋Δ͔ • WebΞϓϦαʔόͷCPUΛ৯͏࣌ͰDBͰͳ͍ • …͔͜͠͠ͷࡐͷൃදͰ͜͜ʹॻ࣌͘ͰΦν͕ݟ͍͑ͯΔ •
ͳʹͱ͋ΕͦͷϖʔδͰୟ͔Ε͍ͯΔAPIΛൈ͖ग़ͯ͠ϑϨʔϜάϥ ϑΛग़ͧ͢
Devel::NYTProfͷ݁Ռ • ԣ͕࣠࣌ؒͰॎ͕ίʔϧελοΫ • ͖Ε͍ͳϏϧ͕ݐͬͨ • ΞϓϦέʔγϣϯϩδοΫ ؙ͍ͷ෦ • Ϗϧ͕ݐͬͯΔͷResolverͱݺ
ΕΔfieldΛղܾ͢ΔϝιουΛ ࠶ؼతʹ୳͍ͯ͠Δ෦
PerlͷGraphQL.pm • ࠷ઌͷϞμϯPerl • Function::Parameters • Return::Type • ܕ͕ΨνΨνʹॻ͔Ε͍ͯΔ •
͔͠͠Perlಈతܕ͚ݴޠͳͷͰಈతʹ ܕνΣοΫ͠·͢ • ↑͕͜͜ϘτϧωοΫʹͳΔ • ܕνΣοΫΛແޮԽ͢ΔΑ͏ʹ Function::ParametersΛ͍͡ΔͱΫΤϦ୯Ґ Ͱݟͯ3ഒߴԽ͞Εͨ
GraphQL APIͷߴԽͷҊ • GraphQL.pm͓ΑͼFunction::ParametersΛ͍ͬͯ͡Pull RequestΛग़͢ • ܕνΣοΫແޮԽຊମΛ͍͡Δ͔͠ແ͍ • ͕ɺ͜ͷPull Request͕Authorʹཧղ͞ΕΔࣗ৴͕ͳ͍…͋ͱͬ͞͞ͱղܾ͍ͨ͠
• Ωϟογϡ͢Δ • GraphQLͰΘΕΔresolverϦιʔε୯ҐͷΩϟογϡͰແҙຯ • GraphQLΛύʔεͨ࣌͠Ͱෛ͚͕֬ఆ͍ͯ͠Δ • GraphQLΛGraphQL.pmͰύʔε͢ΔલʹϨεϙϯεΩϟογϡΛฦ͢ => ࠾༻
GraphQLΩϟογϡ͕ࠔͱ͍͏ᷚ • ΤϯυϙΠϯτ1Օॴ, ΫΤϦbodyʹ٧ΊΒΕ͍ͯΔͷͰ… • query stringʹΫΤϦΛೖΕͯϨεϙϯεΩϟογϡ͢Δख๏ͳͲ ͋ΔΒ͍͠ • nginxͰͳ͘Perlʹདྷ͔ͯΒΩϟογϡ͢Δ͜ͱʹ͠ɺBodyಡΉ
• ͔͠͠BodyΛGraphQLͱͯ͠ಡΉͱෛ͚ͳͷͰGraphQLͱͯ͠ಡ ·ͳ͍
ΫΤϦΛϋογϡԽͨ͠ͷΛredisͰ ϨεϙϯεΩϟογϡ ※ηογϣϯͳͲߟྀ͢Δͱ͔,$variablesnormalize͢ΔͳͲ͏গ͕͠ඞཁ
CPUͷεύΠΫ͕؇͞Εͯ ΊͰͨ͠ΊͰͨ͠
ୈೋষ ͜ͷମݧΛͨ͠ਓ͕ؒ શ෦࡞Γ͠ΛΔͱ͖ʹ ·ͨGraphQLΛબΔ͔
શ෦࡞Γ͠ͷܦҢ • ͜ͷGraphQLΛ͍ͬͯΔ෦ɺͦΕൈ͖ʹ͔ͯ͠ͳΓࠐΈೖͬ ͨϩδοΫ͕ೖ͍ͬͯΔ • νʔϜͰཧղͰ͖͍ͯΔਓ͕গͳ͍ • ͔͠͠αʔϏεͷ֩ͷ෦ͳͷͰ༷มߋػೳՃΛόϯόϯೖΕ ͍ͨ •
͔ͳΓͰ͔͍ػೳՃΛ͍ͨ͠ => ࡞Γ͔͢…
࡞Γ͍ͭ͢ͰʹGraphQLΛ˓˓͍ͨ͠ • ݱঢ়ͷΈෳࡶͳGraphQLΫΤϦΛॻ͘ͱWebαʔό͕ॏ͘ͳΔ ಛੑ • ΩϟογϡͰ͖ΔͷඇϩάΠϯϢʔβͰϦΞϧλΠϜੑ͕ແ͍༰ͩ ͚Ͱݶք͕͋Δ • ͦͦGraphQLΛ˓˓ͯ͠ղܾ͍ͨ͠ •
◦◦ʹʮΊΔʯͱ͔ʮҡ࣋ͨ͠··ΈΛม͑Δʯͱ͔ͦͷ Μ͕ೖΓ·͢
࡞Γ͢ଞͷཁҼ • ύϑΥʔϚϯεཁ͕݅ଞͷ෦ͱҧ͏ • िͳͲʹਓ͕ϫοͱདྷͨΒΘΕΔ͕ීஈશ͘ΘΕͳ͍ • ࠷ۙਓ͕૿͑ͯDBෛՙؾʹͳΓ࢝Ίͨ
GraphQLے͕ѱ͍ͷ͔ʁ • ͜ͷ͚ͩฉ͘ͱʮͬۙدΒΜͱ͜ʯͬͯࢥ͏ਓ͍Δ͔ • Γ͚ͯߟ͑Δ • ݱঢ়ͷΈΑΓ͍͍ղ๏͕͋Δͷ͔ • ͦΕͱ •
GraphQLࣗମ͕ۤ࿑ʹରͯ͠Ϧλʔϯ͕߹ͬͯͳ͍ͷ͔
WebϑϩϯτΤϯυଆͷਓʹҙݟΛฉ͍ͯΈΔ • ʮ͢Ͱʹ։ൃ͕͜ͳΕ͖͍ͯͯΔʯʮπʔϧνΣΠϯͷϊϋཷ·ͬͯ ͍Δʯ • ͦͦϑϩϯτΤϯυଆTypeScriptΛશ໘తʹ࠾༻͍ͯͯ͠GraphQLͱ ૬ੑ͕ྑ͍ • ੈؒʹࣄྫ͕ᷓΕ͍ͯΔΈ߹Θͤ •
ҊͷgRPC(Web͔Gateway)ͩͱΈ͔Βߏங͢Δ͜ͱʹͳΔ • ʮWebϑϩϯτΤϯυଆͷਓ͕GraphQLҎ֎Λ࠾༻͢Δಈػͳͦ͞͏ʯ
಄ΛϦηοτͯ͠GraphQLΛ͏·͘αʔόͰѻ ͏͜ͱΛߟ͑Δ • Perlͷ··͍͘ͷͦ͠͏ • ѻ͏ʹGraphQL.pm΄΅ҰͳͷͰ • खલʹapollo-serverཱͯͯREST APIͱ૬ޓม͢ΔͷͳΒ… •
Goࣄྫ͕গ͚ͩ͋͠ΔͬΆ͍ ϥΠϒϥϦ͍͔ͭ͋͘Δ • TypeScriptͰ͑Δ੩తܕͷϝϦοτGoͳΒड͚ΒΕΔ
͔͠͠GraphQLͷαʔόΛ࡞Δ͜ͱࣗମͷ ͋Δ • DBʹରͯ͠N+1ΫΤϦ • ωετͨ͠ΓෳࡶͳΫΤϦΛೖΕΒΕͨͱ͖ʹDoSΈ͍ͨʹͳΒͳ͍ ͔ • Ωϟογϡ͍͠ •
etc…etc…
͔͠͠GraphQLͷαʔόΛ࡞Δ͜ͱࣗମͷ ͋Δ • DBʹରͯ͠N+1ΫΤϦ • ωετͨ͠ΓෳࡶͳΫΤϦΛೖΕΒΕͨͱ͖ʹDoSΈ͍ͨʹͳΒͳ͍ ͔ • Ωϟογϡ͍͠ •
etc…etc… Ұճۤ࿑ͨ͠͠ ͳΜͱ͔ͳΔ͔ͳͱࢥͬͨ
ҰͭҰͭղܾ͍ͯ͘͠աఔ
GraphQLύʔαʔ/Resolver => gqlgen • εΩʔϚ͔ΒResolverΛࣗಈੜ͢ΔϥΠϒϥϦ
N+1ͷղ๏ => vektah/dataloaden • ӈͷ͍߹Θͤϓʔϧ ͷ෦Λࣗಈੜ͢Δ ϥΠϒϥϦ • Ұఆ࣌ؒͷಉ͡ςʔ ϒϧʹର͢ΔΫΤϦΛ
·ͱΊΒΕΔ
ෳࡶͳΫΤϦʹର͢Δख๏ • Query Complexity • ΫΤϦͷResolverΛ࣮ߦ͢Δલʹॏ͍ΫΤϦ͡Όͳ͍͔ௐΔ • ۩ମతʹϖʔδϯάΛڧ੍͢ΔͳͲͯ͠औಘ͢Δ࠷େ݅ΛΫΤϦ Ͱ֬ఆͤ͞Δ =>
ᮢΛ͏͚ͯ͘ • ϖʔδϯάܗࣜ => Relay Server Specification • ҾϨεϙϯεܗࣜʹσϑΝΫτελϯμʔυ͕͋ΔͷͰ͜ΕΛ͏
͜ͷลͷΈͰٙղফͯ͠ ࠓຊ൪ೖʹ͚ͯಈ͍͍ͯΔͱ͜Ζ
͜͜ͰҰ۟ ྑༀ ɹɹޱʹۤ͠ ɹɹɹɹGraphQL
·ͱΊ • GraphQLʹର͢Δ߅ײԿͩͬͨͷ͔͕গ͠Θ͔ͬͨ • ͨͿΜࠓ·Ͱͷαʔόͷ࡞ΓํΛ੍ݶ͢Δ༷ • ৽͍͠ύϥμΠϜͱ͢ΔͱɺڵຯΛ࣋ͬͯऔΓΊͨ • ৽͍ٕ͠ज़Λ࠾༻͢Δ͜ͱɺͦͷٕज़ͷະདྷʹϕοτ͢Δ͜ͱ •
ϕοτ͢Δͱ͍͏͜ͱɺ͍͟ͱͳΕOSSʹPull RequestΛग़ͨ͠Γɺϓ ϩδΣΫτʹΊΔΑ͏ͳओମతͳಈ͖͕ٻΊΒΕΔ • ͜͏ͬͯࣄྫΛग़͢ͷߩݙ͔͠Εͳ͍ͱࢥͬͯͬͯ·͢
͓·͚
ͭΒ͍ͭ: root queryͷnode • Relay Server Specificationʹྫࣔ͞Εͯ ͍Δͭ • ผʹඞਢͰͳ͍͕ɺΫϥΠΞϯτଆ
͋Δͱศར • ΫϥΠΞϯταΠυͷΩϟογϡߋ৽ͷ ͨΊʹNodeͩͬͨΒͳΜͰฦͤΔͭ • αʔόαΠυ`ID`͚ͩͰͲͷܕ͔Λఆ ͠ͳ͚ΕͳΒͳ͍
GitHubͷղ๏ idʹܕใຒΊࠐΜͰbase64Τϯίʔυ
GitHubͷղ๏ idʹܕใຒΊࠐΜͰbase64Τϯίʔυ
GitHubͷղ๏ idʹܕใຒΊࠐΜͰbase64Τϯίʔυ