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
920
Rustとtonicで始める gRPC再入門
gunmaweb #50
Tsubasa SEKIGUCHI
PRO
September 10, 2023
Tweet
Share
More Decks by Tsubasa SEKIGUCHI
See All by Tsubasa SEKIGUCHI
エンジニアでも捗る デザイナー的思考入門
tinykitten
PRO
1
1.1k
Gunma.web #55
tinykitten
PRO
0
210
React Nativeではじめる ハイパフォーマンス スマホアプリ開発(GENIEE Edit)
tinykitten
PRO
0
110
AWS/GCPで始める 生成AI入門
tinykitten
PRO
0
150
Rustとtonicで始める gRPC入門(GENIEE Edit)
tinykitten
PRO
0
43
スモールスタートで始める フィードバック管理システム開発入門
tinykitten
PRO
0
290
gRPCで始める ハイパフォーマンス タイプセーフウェブ開発
tinykitten
PRO
0
270
ノンデザイナーが 多少マシな見た目の資料を作る方法
tinykitten
PRO
0
200
はじめての GitHub Actionsアクション開発
tinykitten
PRO
0
150
Other Decks in Programming
See All in Programming
A2A プロトコルを試してみる
azukiazusa1
2
1.4k
Hack Claude Code with Claude Code
choplin
4
2k
Porting a visionOS App to Android XR
akkeylab
0
460
Deep Dive into ~/.claude/projects
hiragram
14
2.5k
設計やレビューに悩んでいるPHPerに贈る、クリーンなオブジェクト設計の指針たち
panda_program
6
2.1k
20250704_教育事業におけるアジャイルなデータ基盤構築
hanon52_
5
780
AIと”コードの評価関数”を共有する / Share the "code evaluation function" with AI
euglena1215
1
160
なぜ適用するか、移行して理解するClean Architecture 〜構造を超えて設計を継承する〜 / Why Apply, Migrate and Understand Clean Architecture - Inherit Design Beyond Structure
seike460
PRO
3
760
PHP 8.4の新機能「プロパティフック」から学ぶオブジェクト指向設計とリスコフの置換原則
kentaroutakeda
2
880
「Cursor/Devin全社導入の理想と現実」のその後
saitoryc
0
820
脱Riverpod?fqueryで考える、TanStack Queryライクなアーキテクチャの可能性
ostk0069
0
120
効率的な開発手段として VRTを活用する
ishkawa
0
140
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
2.7k
How to train your dragon (web standard)
notwaldorf
95
6.1k
We Have a Design System, Now What?
morganepeng
53
7.7k
A better future with KSS
kneath
238
17k
Speed Design
sergeychernyshev
32
1k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
130
19k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
820
Why You Should Never Use an ORM
jnunemaker
PRO
58
9.4k
Building Adaptive Systems
keathley
43
2.7k
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Code Review Best Practice
trishagee
69
18k
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