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
PRO
September 10, 2023
Programming
0
620
Rustとtonicで始める gRPC再入門
gunmaweb #50
Tsubasa SEKIGUCHI
PRO
September 10, 2023
Tweet
Share
More Decks by Tsubasa SEKIGUCHI
See All by Tsubasa SEKIGUCHI
React Nativeではじめる ハイパフォーマンス スマホアプリ開発(GENIEE Edit)
tinykitten
PRO
0
81
AWS/GCPで始める 生成AI入門
tinykitten
PRO
0
88
Rustとtonicで始める gRPC入門(GENIEE Edit)
tinykitten
PRO
0
4
スモールスタートで始める フィードバック管理システム開発入門
tinykitten
PRO
0
240
gRPCで始める ハイパフォーマンス タイプセーフウェブ開発
tinykitten
PRO
0
210
ノンデザイナーが 多少マシな見た目の資料を作る方法
tinykitten
PRO
0
160
はじめての GitHub Actionsアクション開発
tinykitten
PRO
0
120
UI/UXをないがしろにしない「きもちのいい」Webサービスの作り方
tinykitten
PRO
0
120
React Nativeではじめる ハイパフォーマンス スマホアプリ開発
tinykitten
PRO
0
91
Other Decks in Programming
See All in Programming
cmp.Or に感動した
otakakot
3
230
Micro Frontends Unmasked Opportunities, Challenges, Alternatives
manfredsteyer
PRO
0
110
Macとオーディオ再生 2024/11/02
yusukeito
0
380
Hotwire or React? ~アフタートーク・本編に含めなかった話~ / Hotwire or React? after talk
harunatsujita
1
120
ローコードSaaSのUXを向上させるためのTypeScript
taro28
1
630
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
5
330
ActiveSupport::Notifications supporting instrumentation of Rails apps with OpenTelemetry
ymtdzzz
1
250
watsonx.ai Dojo #4 生成AIを使ったアプリ開発、応用編
oniak3ibm
PRO
1
180
as(型アサーション)を書く前にできること
marokanatani
10
2.7k
Ethereum_.pdf
nekomatu
0
470
Flutterを言い訳にしない!アプリの使い心地改善テクニック5選🔥
kno3a87
1
210
Remix on Hono on Cloudflare Workers
yusukebe
1
300
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
409
22k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
A Modern Web Designer's Workflow
chriscoyier
693
190k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
8
900
Practical Orchestrator
shlominoach
186
10k
Facilitating Awesome Meetings
lara
50
6.1k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
29
2.3k
Visualization
eitanlees
145
15k
Code Review Best Practice
trishagee
64
17k
GitHub's CSS Performance
jonrohan
1030
460k
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