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入門(GENIEE Edit)
Search
Tsubasa SEKIGUCHI
October 05, 2024
Programming
0
23
Rustとtonicで始める gRPC入門(GENIEE Edit)
base:
https://speakerdeck.com/tinykitten/rusttotonicdeshi-meru-grpczai-ru-men
Tsubasa SEKIGUCHI
October 05, 2024
Tweet
Share
More Decks by Tsubasa SEKIGUCHI
See All by Tsubasa SEKIGUCHI
Gunma.web #55
tinykitten
0
130
React Nativeではじめる ハイパフォーマンス スマホアプリ開発(GENIEE Edit)
tinykitten
0
96
AWS/GCPで始める 生成AI入門
tinykitten
0
120
スモールスタートで始める フィードバック管理システム開発入門
tinykitten
0
270
Rustとtonicで始める gRPC再入門
tinykitten
0
820
gRPCで始める ハイパフォーマンス タイプセーフウェブ開発
tinykitten
0
250
ノンデザイナーが 多少マシな見た目の資料を作る方法
tinykitten
0
170
はじめての GitHub Actionsアクション開発
tinykitten
0
130
UI/UXをないがしろにしない「きもちのいい」Webサービスの作り方
tinykitten
0
130
Other Decks in Programming
See All in Programming
なぜselectはselectではないのか
taiyow
2
290
PHPでお金を扱う時、終わりのない 謎の1円調査の旅にでなくて済む方法
nakka
3
980
AtCoder Heuristic First-step Vol.1 講義スライド(山登り法・焼きなまし法編)
takumi152
3
960
ステートソーシング型イベント駆動の視点で捉えるCQRS+ES
shinnosuke0522
1
310
Coding Experience Cpp vs Csharp - meetup app osaka@9
harukasao
0
110
自分のために作ったアプリが、グローバルに使われるまで / Indie App Development Lunch LT
pixyzehn
1
120
技術好きなエンジニアが "リーダーへの進化" によって得たものと失ったもの
pospome
5
1.3k
Scala 3 で GLSL のための c-like-for を実装してみた
exoego
1
180
Node.js, Deno, Bun 最新動向とその所感について
yosuke_furukawa
PRO
6
3k
Go1.24 go vetとtestsアナライザ
kuro_kurorrr
2
380
보일러플레이트 코드가 진짜 나쁜 건가요?
gaeun5744
0
370
PHPer's Guide to Daemon Crafting Taming and Summoning
uzulla
2
960
Featured
See All Featured
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
45
9.5k
Git: the NoSQL Database
bkeepers
PRO
429
65k
It's Worth the Effort
3n
184
28k
Agile that works and the tools we love
rasmusluckow
328
21k
Visualization
eitanlees
146
15k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
The Language of Interfaces
destraynor
156
24k
Done Done
chrislema
183
16k
A designer walks into a library…
pauljervisheath
205
24k
Navigating Team Friction
lara
183
15k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Transcript
Rustͱ tonicͰ࢝ΊΔ gRPCೖ Advanced guide for development gRPC service with
Rust and tonic. My
TinyKitten Freelance frontend engineer I 💖 OSS & Cat🐈 Born
in Gunma🐴 Live in Tokyo🗼
Tsubasa SEKIGUCHI Λڌͱ͢Δ܈അݝલڮࢢੜ·ΕͷϑϦʔϥϯεͷ ϑϩϯτΤϯυΤϯδχΞɻ ͖ͬͨΜͱݺΕ͍ͯ·͢ɻ
ͿΓʹ໊ͷσβΠϯΛߋ৽͠·ͨ͠ɻ͝ڵຯ͋Ε͓͠͠·͢ɻ
TrainLCD ຊશࠃͷమಓ࿏ઢͰ͑Δ ৽ײ֮ͷφϏήʔγϣϯΞϓϦͰ͢ɻ
Smart StackରԠ ۙ৴༧ఆ ˞ը૾։ൃதͷͷͰ͢ɻ
TrainLCDͷݪܕதͷݪܕͷΞϓϦʹؔͯ͠ͷηογϣϯΛͨ͠ࡍͷ৴͕YouTubeʹ͋Γ·͢
ࠓճͷLTͰ͞ͳ͍ൣғ ϋϯζΦϯͰ͖ΔϨϕϧͷ࣮ͷ ͔ΜΜ͍ͯͩ͘͠͞ README.mdʹॻ͍ͯ͋Δఔͷࣝ 5Ͱ͕࣌ؒΓ·ͤΜ JSͷόϯυϧαΠζͰͳ͘ମॏΛݮΒ͢ํ๏ ૫ͤΔͨΊͷ͕࣌ؒͳ͍Ͱ͢ ਅதʹΔؾ͕ग़Δݱʹ͍ͭͯ ͜ͷεϥΠυେମࣄ͕ऴΘͬͯՋʹͳͬͨதʹ࡞ͬͯ·͢
Introduction جૅࣝ
gRPCͱʁ GoogleࣾͷߟҊͨ͠RPCϓϩτίϧ RPCRemote Procedure Call(ԕִखଓ͖ݺͼग़͠ ͷུͰ͢ gRPCࣗࣾϚΠΫϩαʔϏεؒͰͷγεςϜʮStubbyʯ͕લ IDL͔Β༷ʑͳݴޠͷίʔυ͕ੜͰ͖Δ ͪΖΜJavaScriptՄೳͰ͢
gRPC-webͰWebϒϥβ͔ΒgRPCαʔόʔΛୟ͚Δ 8FCϒϥβͰͷ༻Ͱ੍ݶ͕͋Δ αʔόʔͱͷʮʯ௨৴Ͱ͖ͳ͍ʢجຊతʹ&OWPZͷϓϩΩγͷ༻ҙ͕ඞཁʣ Bi-directional streaming(C/SؒͰҙͷλΠϛϯάͰ௨৴͕Ͱ͖Δ)ʹରԠ͍ͯ͠ͳ͍
ࠓճͷϓϩμΫγϣϯͳࡐ TrainLCD ʮຊશࠃͷమಓ࿏ઢͰ͑Δ৽ײ֮φϏήʔγϣϯΞϓϦʯ TrainLCDͱ͍͏ΞϓϦΛझຯͰ࡞͍ͬͯ·͢ɻ ͜ͷΞϓϦओཁࢢͷτϨΠϯϏδϣϯΛ࠶ݱͨ͠ΞϓϦͰɺ GPSΛͬͨφϏήʔγϣϯΞϓϦͱͯ͑͠·͢ɻ ศརͳػೳͱͯ͠Ӻ౸ண௨εϚʔτΥονରԠɺ iOS/iPadOSͷLive ActivitiesʹରԠ͍ͯ͠·͢ɻ
ࠓճͷϓϩμΫγϣϯͳࡐ TrainLCDΞϓϦͷAPI࣮ʮStationAPIʯ TrainLCDΞϓϦͷAPIαʔόʔͷStationAPI͕͋Γɺ ͜ͷStationAPIΛࡐͱͯ͠ݟΛڞ༗͠·͢ɻ ͳ͓ɺStationAPIϲ݄લʹNestJSΛͬͨGraphQLαʔόʔͱͯ͠Քಇ͍ͤͯͯ͞ɺ NestJSͱApollo Server(GraphQL)ͷελοΫΛRust+tonic(gRPC)ʹҠߦ͠·ͨ͠ɻ
ࠓճհ͢ΔελοΫ
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Ͱ࣮ AWSʹσϓϩΠ
PostmanͰୟ͍ͯΈΔ ΞϓϦʹͭͳ͗͜Ή ͬ͟ͱͬͨ͜ͱ
RustΛͬͨ։ൃͷݟσʔλϕʔεฤ ORMԿΛͬͨʁ ਖ਼֬ʹORMͰͳ͍Ͱ͕͢ɺsqlxΛ༻͠·ͨ͠ɻ ϢʔεέʔεతʹSQL͚࣮ͩߦͰ͖ΕेͰɺORMͩͱΦʔόʔεϖοΫɻ query!ͷΑ͏ͳϚΫϩΛ͏ͱίϯύΠϧ࣌ʹΫΤϦΛνΣοΫͰ͖·͢ɻ ϚΫϩҎ֎ଞݴޠͷORMͱ͔ʹରͯ͠໌Β͔ʹҧ͏ͱ͜Ζͳ͍ͱࢥ͍·͢ɻ ΄͔ʹɺRustʹdieselͱ͍͏ORM͕͋Γ·͕͢ɺ ͜Ε͕σϑΝΫτελϯμʔυʁ
gRPC APIΛσϓϩΠ ελοΫʹ͍ͭͯ StationAPIAWSʹ͔ͬͬͯ·͢ɻ͍ͬͯΔαʔϏε - Elastic Container Service(ECS) - Elastic
Container Registry(ECR) - Elastic Load Balancing(ELB) ΄͔ʹGCPͷج൫͍ͬͯ·͢ - Text-to-Speech AI Firebase - Firestore/Storage/Messaging/Authentication/Functions
·ͱΊ Rust͍͍ͧ Rust҆શͰߴͳγεςϜϓϩάϥϛϯάݴޠͰ͢ ࠷ॳͷֶशίετߴ͍Ͱ͕͢ɺҰͰ৮ͬͯΈΔՁ զʑWebۀքͷਓؒͩͱͯ͋͠Γ·͢ AWS͍͍ͧ આ໌Ͱ͢Ͷ TrainLCDΞϓϦΛ͝ርʹ ൱ఆతͳઌೖ؍Λ͍࣋ͬͯͨਓͰɺͬͯΈΕ ʮੜ׆ʹ͔ܽͤͳ͍ʯ໘ന͍ΞϓϦͱධՁͯ͠Β͍͑ͯ·͢
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ Thank you for listening! My 2024.10.08 Tsubasa SEKIGUCHI