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
Rustとtonicで始める gRPC再入門
Search
Tsubasa SEKIGUCHI
September 10, 2023
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rustとtonicで始める gRPC再入門
gunmaweb #50
Tsubasa SEKIGUCHI
September 10, 2023
More Decks by Tsubasa SEKIGUCHI
See All by Tsubasa SEKIGUCHI
エンジニアでも捗る デザイナー的思考入門(bitA Edit 新ver)
tinykitten
0
280
React Native × GraphQLで TanStack Queryを 選んだ理由
tinykitten
0
68
第3木曜LT会 #28
tinykitten
0
160
スモールスタートでいこう 自作テレメトリシステム概論
tinykitten
0
66
TrainLCD v10リリース記念 TrainLCDを支える技術
tinykitten
1
590
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
0
290
初めてのハッカソンを「紙芝居」で終わらせた話
tinykitten
0
77
これならできる!個人開発のすゝめ
tinykitten
0
590
今日から使える AI駆動開発のすゝめ
tinykitten
1
130
Other Decks in Programming
See All in Programming
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
990
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
5
1.8k
S3 を使うアプリケーションをローカル完結で動かすことに全力を注いでみた / Running S3 Apps Offline
contour_gara
0
520
今さら聞けない .NET CLI
htkym
0
200
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
100
仕様駆動開発の消費期限
watany
20
8.6k
FDEが実現するAI駆動経営の現在地
gonta
2
290
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
520
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
300
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
680
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
790
freeeにおけるEvalsの実践例の紹介
freee
PRO
0
120
Featured
See All Featured
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.8k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Everyday Curiosity
cassininazir
0
280
The Curious Case for Waylosing
cassininazir
1
460
Context Engineering - Making Every Token Count
addyosmani
9
1.1k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
370
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.2k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
650
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
How GitHub (no longer) Works
holman
316
150k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
63
45k
Transcript
Rustͱ tonicͰ࢝ΊΔ gRPC࠶ೖ Advanced guide for development gRPC service with
Rust and tonic. Gunma.web #50 ςʔϚϑϦʔ 2023.09.10 @ Takasaki Met., Empire of Gunma Tsubasa SEKIGUCHI
TinyKitten Freelance frontend engineer I 💖 OSS & Cat🐈 Born
in Gunma🐴 Live in Tokyo🗼
Tsubasa SEKIGUCHI Λڌͱ͢Δ܈അݝલڮࢢੜ·ΕͷϑϦʔϥϯεͷ ϑϩϯτΤϯυΤϯδχΞɻ ͖ͬͨΜͱݺΕ͍ͯ·͢ɻ
ͿΓʹ໊ͷσβΠϯΛߋ৽͠·ͨ͠ɻ
NFCνοϓ͕͋Γ·͢ ࠓൃදͰ༻͍ͯ͠ΔMacBook Airͷఱ൘ʹషΒΕͨεςοΧʔͷཪଆʹ NFCνοϓΛຒΊࠐΜͰ͍·͢ɻ ձࢀՃͷํNFCରԠεϚϗͰੋඇ͓ࢼ͍ͩ͘͠͞ɻ ໊࣮ࡳʹ/'$λάΛજ·͍ͤͯ·͢ɻ
TrainLCD ຊશࠃͷమಓ࿏ઢͰ͑Δ ৽ײ֮ͷφϏήʔγϣϯΞϓϦͰ͢ɻ
ిޫܝࣔ൘෩ςʔϚ ۙ৴༧ఆ ˞ը૾։ൃதͷͷͰ͢ɻ
J1BE04ɺJ04൛͕͠ΕͬͱφϏήʔγϣϯΧςΰϦͰҐҎʹϥϯΫΠϯͯ͠·ͨ͠
TrainLCDͷݪܕதͷݪܕͷΞϓϦʹؔͯ͠ͷηογϣϯΛͨ͠ࡍͷ৴͕YouTubeʹ͋Γ·͢
˞͜ͷ23ίʔυಈతʹ63-ΛมߋͰ͖ΔͨΊɺࠓޙϦϯΫ͕ػೳ͠ͳ͘ͳΔՄೳੑ͕͋Γ·͢
ࠓճͷLTͰ͢ൣғ લճ(Gunma.web #49) ͷଓ͖ લճݟ͍ͯͳ͍ํΘ͔ΔΑ͏ʹਐΊ·͢ ۩ମతʹRustΛ͍͍ͬͨͩͨ۩ମతͳ࣮ͱ͔ɻ
લճͷηογϣϯSpeaker Deckʹ্͕ͬͯ·͢ɻ
ࠓճͷLTͰ͢ൣғ લճ(Gunma.web #49) ͷଓ͖ લճݟ͍ͯͳ͍ํΘ͔ΔΑ͏ʹਐΊ·͢ ۩ମతʹRustΛ͍͍ͬͨͩͨ۩ମతͳ࣮ͱ͔ɻ
લճͷηογϣϯSpeaker Deckʹ্͕ͬͯ·͢ɻ ˞͜ͷ23ίʔυಈతʹ63-ΛมߋͰ͖ΔͨΊɺࠓޙϦϯΫ͕ػೳ͠ͳ͘ͳΔՄೳੑ͕͋Γ·͢
ࠓճͷLTͰ͞ͳ͍ൣғ ϋϯζΦϯͰ͖ΔϨϕϧͷ࣮ͷ ͔ΜΜ͍ͯͩ͘͠͞ README.mdʹॻ͍ͯ͋Δఔͷࣝ 10Ͱ͕࣌ؒΓ·ͤΜ
JSͷόϯυϧαΠζͰͳ͘ମॏΛݮΒ͢ํ๏ ૫ͤΔͨΊͷ͕࣌ؒͳ͍Ͱ͢ ਅதʹΔؾ͕ग़Δݱʹ͍ͭͯ ͜ͷεϥΠυେମࣄ͕ऴΘͬͯՋʹͳͬͨதʹ࡞ͬͯ·͢
Introduction جૅࣝ
લճͷ͓͞Β͍ GoogleࣾͷߟҊͨ͠RPCϓϩτίϧ RPCRemote Procedure Call(ԕִखଓ͖ݺͼग़͠ ͷུͰ͢ gRPCࣗࣾϚΠΫϩαʔϏεؒͰͷγεςϜʮStubbyʯ͕લ
IDL͔Β༷ʑͳݴޠͷίʔυ͕ੜͰ͖Δ ͪΖΜJavaScriptՄೳͰ͢ gRPC-webͰWebϒϥβ͔ΒgRPCαʔόʔΛୟ͚Δ 8FCϒϥβͰͷ༻Ͱ੍ݶ͕͋Δ αʔόʔͱͷʮʯ௨৴Ͱ͖ͳ͍ʢجຊతʹ&OWPZͷϓϩΩγͷ༻ҙ͕ඞཁʣ Bi-directional streaming(C/SؒͰҙͷλΠϛϯάͰ௨৴͕Ͱ͖Δ)ʹରԠ͍ͯ͠ͳ͍
ࠓճͷϓϩμΫγϣϯͳࡐ TrainLCDΞϓϦͷAPI࣮ʮStationAPIʯ TrainLCDͱ͍͏ΞϓϦΛझຯͰ࡞͍ͬͯ·͢ɻ ͜ͷΞϓϦͷAPIαʔόʔͷStationAPI͕͋Γɺ ͜ͷStationAPIΛࡐͱͯ͠ݟΛڞ༗͠·͢ɻ ͳ͓ɺStationAPIϲ݄લʹNestJSΛͬͨGraphQLαʔόʔͱͯ͠Քಇ͍ͤͯͯ͞ɺ NestJSͱApollo Server(GraphQL)ͷελοΫΛ
Rust+tonic(gRPC)ʹҠߦྃͨ͠ͱ͜ΖͰ͢ɻ ˞͜ͷ23ίʔυಈతʹ63-ΛมߋͰ͖ΔͨΊɺࠓޙϦϯΫ͕ػೳ͠ͳ͘ͳΔՄೳੑ͕͋Γ·͢
ࠓճհ͢ΔελοΫ
Rustͱ ݴΘͣͱΕͨϓϩάϥϛϯάݴޠ CݴޠɺC++ʹΘΔγεςϜϓϩάϥϛϯάݴޠΛࢦ͍ͯ͠Δ GCͳΜͯͷͳ͍ GCͳ͠ͰͷϝϞϦ҆શੑΛอূ͍ͯ͠Δ
($ͷΑ͏ͳػߏ͕ඞཁͳ໘ͰεϚʔτϙΠϯλΛ༻Մೳ AtomicͳArcɺͦ͏Ͱͳ͍Rc͕͋Δ WebAssemblyʹͩͬͯ͑·͢ ֶशίετߴΊ आ༻ɺϥΠϑλΠϜͱࠓ·Ͱͳ͔ͬͨ֓೦͕͋Δ͕ɺ ͦΕΒ͕ϝϞϦ҆શΛୡ͍ͤͯ͞Δ
tonicͱ RustͷgRPC࣮ 3VTUͰ͑ΔϋΠύϑΥʔϚϯεͰOSSɺ൚༻తͳgRPCϑϨʔϜϫʔΫ ϋΠύϑΥʔϚϯεʹϑΥʔΧε ଞʹ૬ޓӡ༻ੑ͕͋ΓॊೈͳϥΠϒϥϦͱᨳ͍ͬͯΔ -
͍ํʹΑͬͯ֎෦ϓϩΩγෆཁ grpc-webͷαʔόʔͱ͍͍ͯͨ͠߹ɺtonic-web crate͕͋Γ·͢ tonic-web crateΛ͏͜ͱͰɺϑϨʔϜϫʔΫଆͰHTTP/1.1ΛΕΔΑ͏ʹͳΓ·͢ ͭ·ΓɺEnvoyͷ֎෦ϓϩΩγ͕ෆཁʹͳΓ·͢
Motivation ͳͥΔͷ͔
StationAPIϑϧεΫϥονͷϞνϕʔγϣϯ(1/3) NestJSΛ͍ͬͯ·ͨ͠ NestJSͰGraphQLϞδϡʔϧΛͬͯGraphQLͷAPIΛ࣮͍ͯ͠·ͨ͠ɻ NestJSࣗମѱ͘ͳ͔ͬͨͰ͢ɻΉ͠Ζਖ਼ࣾһ࣌ʹ͍ͬͯͨ Angularͱߏ͕ࣅ͍ͯͯɺϊελϧδʔʹਁΕ·ͨ͠ શવؔͳ͍
ɻ N+1ʹͿͪͨΔ ͪΖΜɺNestJSͰղܾෆՄೳͳͰͳ͍ͷͰ͕͢ɻ ۙࠒTrainLCDΞϓϦͷϢʔβʔ૿͖͑ͯͯɺͲ͏ͤൈຊతʹॻ͖͑ΔͳΒ NestJSʹር͢ΔΑΓ͏ͪΐͬͱݎ࿚Ͱߴͳ"1*Λ࡞Γ͔ͨͬͨͷͰ͢ɻ
͜͜ͰRustʹനӋͷཱ͕ͭ աڈʹͪΐͬͱ͚ͩRustͷษڧΛ͍ͯͯ͠ɺݴޠͷઃܭ͕RustͷॳֶϓϩάϥϚʹݫ͍͕͠ɺ ҆৺ͯ͠ಈ͔ͤΔ্ʹNode.jsΑΓߴɾϝϞϦϑοτϓϦϯτͳAPIΛ࡞ΕΔͷͰɺ ࠓճͷϑϧεΫϥονRustͰߦ͏લఏͱͳΓ·ͨ͠ɻ Ͳ͏ͤͳΒgRPCࢼͯ͠ΈΑ͏
gRPCࣗମҎલΑΓ͍ͬͯͯ࠾༻͢Δ͔ܰ͘໎͍·͕ͨ͠ɺैདྷͷGraphQL APIͷ՝ͱͯ͠ ʮΞϓϦͷૢ࡞ճͰඞཁͳσʔλ͕ଟͯ͘ΫΤϦ͕ංେԽɺϨεϙϯεσʔλ͕͑͛ͭͳ͍αΠζʹͳΔʯ ͱ͍͏ͷ͋ΓͦͦΞϓϦͷઃܭࣗମ͕ؒҧ͍ͬͯΔؾ͠ͳ͘ͳ͍Ͱ͕͢ɺ εϚϗ͚ΞϓϦͰͷ௨৴༰ྔ͕ଟ͍ͷେ͖ͳ՝Ͱͨ͠ɻ StationAPIϑϧεΫϥονͷϞνϕʔγϣϯ(2/3)
gRPCͷϖΠϩʔυόΠφϦ όΠφϦͰΓऔΓ͢ΔͷͰɺઌ΄Ͳઆ໌ͨ͠ʮϨεϙϯεσʔλͷංେԽʯʹޮՌతͦ͏Ͱ͢ΑͶɻ ChromeͷDevToolsͰόΠφϦͷͨΊ֬ೝ͕͠ΜͲ͔ͬͨΓ͠·͢ɻ Protocol Bu ff
ersͰλΠϓηʔϑ ͪ͜ΒREST APIͱͷൺֱͰ͕͢ɺ gRPC APIͱ௨৴͢Δ࣌ʹඞͣProtocol Bu ff ersͷεΩʔϚఆٛΛ༻͢ΔͷͰ ௨৴͢Δલ͔ΒϦΫΤετͱϨεϙϯεͷܕ͕Θ͔Βͳ͍ɺͱ͍͏͜ͱͳ͘ͳΔͣͰ͢ɻ ཁ͢ΔʹREST APIͰ͍͏Swagger͕࠷ॳ͔Β͑Δͱ͍ͬͨΠϝʔδͰ͢ɻ StationAPIϑϧεΫϥονͷϞνϕʔγϣϯ(3/3)
Implement & Run By Example StationAPIͷݟΛݩʹ࣮ͯͬͯ͠ΈΔ
Protocol Bu ff ersͰεΩʔϚఆٛΛߦ͏ RustͰ࣮ GCPʹσϓϩΠ
PostmanͰୟ͍ͯΈΔ ΞϓϦʹͭͳ͗͜Ή લճઆ໌ͨ͠Օॴͱ͕͘ͳΔ෦ඈ͠·͢ ͬ͟ͱͬͨ͜ͱ
Protocol Bu ff ersͰεΩʔϚఆٛΛߦ͏ RustͰ࣮ GCPʹσϓϩΠ
PostmanͰୟ͍ͯΈΔ ΞϓϦʹͭͳ͗͜Ή લճઆ໌ͨ͠Օॴͱ͕͘ͳΔ෦ඈ͠·͢ ͬ͟ͱͬͨ͜ͱ
RustΛͬͨ։ൃͷݟσʔλϕʔεฤ ORMԿΛͬͨʁ ਖ਼֬ʹORMͰͳ͍Ͱ͕͢ɺsqlxΛ༻͠·ͨ͠ɻ ϢʔεέʔεతʹSQL͚࣮ͩߦͰ͖ΕेͰɺORMͩͱΦʔόʔεϖοΫɻ query!ͷΑ͏ͳϚΫϩΛ͏ͱίϯύΠϧ࣌ʹΫΤϦΛνΣοΫͰ͖·͢ɻ
ϚΫϩҎ֎ଞݴޠͷORMͱ͔ʹରͯ͠໌Β͔ʹҧ͏ͱ͜Ζͳ͍ͱࢥ͍·͢ɻ ΄͔ʹɺRustʹdieselͱ͍͏ORM͕͋Γ·͢ɻ ͜Ε͕σϑΝΫτελϯμʔυʁ
RustΛͬͨ։ൃͷݟύϑΥʔϚϯεฤ ύϑΥʔϚϯεΛߴΊΔͨΊͷʁ ͍͢͝ॳาతͰ͕͢ɺͳΔ͘ͷΫϩʔϯΛߦΘͳ͍ͱ͔ɺ mokaͱ͍͏crateͰӬଓԽͳ͠ͷ ΠϯϝϞϦΩϟογϡΛ࣮͍ͯͨ͠Γ͠·͢ɻ
༨ஊͰ͕͢ɺmokaͰͷऔಘ࣌ʹclone()͕࣮ߦ͞ΕΔͷͰ NPLBͰσʔλΛૠೖ͢Δ࣌Arc(ΞτϛοΫࢀরΧϯτ)Ͱ ϥοϓ͠ͳ͍ͱߴՁͳdeep copy͕ൃੜ͢ΔՄೳੑ͕͋Γ·͢ େ͖ͳσʔλΛૠೖɾऔಘ͢Δ߹େมͳ͜ͱʹͳΓ·͢ɻ ૠೖ͢ΔࡍඞͣArcͰϥοϓ͠·͠ΐ͏ɻ
gRPC APIΛσϓϩΠ ελοΫʹ͍ͭͯ StationAPIGCPʹશ෦͔ͬͬͯ·͢ɻ͍ͬͯΔαʔϏε - Cloud
Build - Cloud Run - Cloud SQL - Text-to-Speech AI(5SBJO-$%ΞϓϦͷҡ࣋අͷͰҰ൪ߴֹ) Firebase - Firestore/Storage/Messaging/Authentication/Functions/Remote Con fi g Կʹ͍ͬͯΔ͔͜ͷεϥΠυͷൣғ֎ͳͷͰݸผͰฉ͍͍ͯͩ͘͞ ईͷؔͰ΄ͱΜͲհͰ͖ͳ͍Ͱ͢🥺
Cloud Buildͷ͍ಓ ͦͦCloud Buildͱʁ ໊લͷ௨ΓCI/CDͷCDΛ୲͏αʔϏεɻ GitHubͷPush(PubSubϝοηʔδɺWebhookΠϕϯτՄೳ)Λ
τϦΨʔʹͯ͠ࢦఆͨ͠ίϚϯυΛΒͤͯ͘Ε·͢ɻ Docker fi le͔Βͦͷ··σϓϩΠՄೳͰɺ ΄͔ʹઐ༻ͷߏϑΝΠϧ(cloudbuild.yaml) ΠϯϥΠϯͰͷߏ͕ՄೳͰ͢ɻ
Cloud BuildͷݟRustͷϏϧυ͍ RustͷϏϧυ͍ جຊతʹRustͷϏϧυ͍Ͱ͢ɻ ͜Εओ؍Ͱͳ͘ɺΉ͠ΖRustaceanͳΒ ޱΛἧ͑ͯʮRustͷϏϧυ͍ʯͱݴ͏Ͱ͠ΐ͏ɻ
RustͷϏϧυ͕͍ࠜຊతͳݪҼஔ͍ͱ͍ͯɺ Cloud BuildͷϏϧυ݁ߏ͕͔͔࣌ؒͬͯ͠·͍·͢ɻ
Cloud BuildͷݟRustͷϏϧυΛߴԽ͢Δ KanikoΛ׆༻ͯ͠Ϗϧυ࣌ؒΛݮ͢Δ جຊతʹRustͷϏϧυ͍͜ͱΛઆ໌͠·ͨ͠ ͦ͜ͰɺKanikoΛCloud BuildʹͬͯΈ·͠ΐ͏
KanikoDocker DaemonΛΘͣʹ k8sΫϥελ্ͰϏϧυΛߦ͏͜ͱ͕Ͱ͖·͢ Cloud BuildͱΈ߹ΘͤΔͱͳΜ͔ΜͰΩϟογϡ͞Εͯ 2ճ͔ΒϏϧυ͕രʹͳΓ·͢ StationAPIͰϏϧυ͕࣌ؒ20͔Β10ͱʹͳΓ·ͨ͠
Cloud Runͷ͍ಓ ͦͦCloud Runͱʁ ϑϧϚωʔδυͷαʔόʔϨεϓϥοτϑΥʔϜ ϏϧυࡁΈͷDockerίϯςφΛσϓϩΠग़དྷΔ
·ͨઃఆΛ͑ͯม͑ͳ͚Ε ίʔυ͕࣮ߦ͞Ε͍ͯΔͱ͖ͷྉ͕ۚൃੜ͢Δ ࣗಈεέʔϧߴͰτϥϑΟοΫʹ߹Θͤͯ θϩ͔ΒҙͷنͰࣗಈతʹεέʔϦϯάՄೳ ߋʹΠϯελϯε͋ͨΓ࠷େ ݅ͷಉ࣌ϦΫΤετΛ ॲཧͰ͖ΔͨΊͱͯ༨༟͕͋Γ·͢ ϑϧϚωʔδυͷͨΊΠϯϑϥͷཧෆཁͰɺ σϓϩΠͨ͠ޙCloud Runʹؙ͛Ͱ͖·͢
·ͱΊ Rust͍͍ͧ Rust҆શͰߴͳγεςϜϓϩάϥϛϯάݴޠͰ͢ ࠷ॳͷֶशίετߴ͍Ͱ͕͢ɺҰͰ৮ͬͯΈΔՁ զʑWebۀքͷਓؒͩͱͯ͋͠Γ·͢
GCP͍͍ͧ AWSΑΓγϯϓϧͳཧUIΛ͍ͯͯ͠ຊ࣭తʹඞཁͳ࡞ۀʹྗͰ͖·͢ɻ AWSͱཧUI͚ͩͰ༏ྼΛ͚ͭΔ͜ͱͰ͖ͳ͍ͱࢥ͍·͕͢ɺ ݸਓతʹGCPਪ͠Ͱ͢ TrainLCDΞϓϦΛ͝ርʹ ൱ఆతͳઌೖ؍Λ͍࣋ͬͯͨਓͰɺͬͯΈΕ ʮੜ׆ʹ͔ܽͤͳ͍ʯ໘ന͍ΞϓϦͱධՁͯ͠Β͍͑ͯ·͢
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ Thank you for listening! Gunma.web #50 ςʔϚϑϦʔ 2023.09.10 @
Takasaki Met., Empire of Gunma Tsubasa SEKIGUCHI