Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
1k
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
0
100
今日から使える AI駆動開発のすゝめ
tinykitten
PRO
1
82
Reactで始める リグレッションテスト概論
tinykitten
PRO
0
46
エンジニアでも捗る デザイナー的思考入門
tinykitten
PRO
1
1.4k
Gunma.web #55
tinykitten
PRO
0
260
React Nativeではじめる ハイパフォーマンス スマホアプリ開発(GENIEE Edit)
tinykitten
PRO
0
140
AWS/GCPで始める 生成AI入門
tinykitten
PRO
0
170
Rustとtonicで始める gRPC入門(GENIEE Edit)
tinykitten
PRO
0
58
スモールスタートで始める フィードバック管理システム開発入門
tinykitten
PRO
0
310
Other Decks in Programming
See All in Programming
30分でDoctrineの仕組みと使い方を完全にマスターする / phpconkagawa 2025 Doctrine
ttskch
4
850
複数人でのCLI/Infrastructure as Codeの暮らしを良くする
shmokmt
5
2.3k
AIコーディングエージェント(NotebookLM)
kondai24
0
190
ZOZOにおけるAI活用の現在 ~モバイルアプリ開発でのAI活用状況と事例~
zozotech
PRO
8
5.6k
S3 VectorsとStrands Agentsを利用したAgentic RAGシステムの構築
tosuri13
6
310
愛される翻訳の秘訣
kishikawakatsumi
3
320
手が足りない!兼業データエンジニアに必要だったアーキテクチャと立ち回り
zinkosuke
0
670
AIエージェントを活かすPM術 AI駆動開発の現場から
gyuta
0
410
connect-python: convenient protobuf RPC for Python
anuraaga
0
410
認証・認可の基本を学ぼう前編
kouyuume
0
200
Socio-Technical Evolution: Growing an Architecture and Its Organization for Fast Flow
cer
PRO
0
330
251126 TestState APIってなんだっけ?Step Functionsテストどう変わる?
east_takumi
0
320
Featured
See All Featured
Typedesign – Prime Four
hannesfritz
42
2.9k
Making Projects Easy
brettharned
120
6.5k
For a Future-Friendly Web
brad_frost
180
10k
Writing Fast Ruby
sferik
630
62k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Optimising Largest Contentful Paint
csswizardry
37
3.5k
BBQ
matthewcrist
89
9.9k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
Six Lessons from altMBA
skipperchong
29
4.1k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
51k
[RailsConf 2023] Rails as a piece of cake
palkan
58
6.2k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
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