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
PRO
October 05, 2024
Programming
69
0
Share
Rustとtonicで始める gRPC入門(GENIEE Edit)
base:
https://speakerdeck.com/tinykitten/rusttotonicdeshi-meru-grpczai-ru-men
Tsubasa SEKIGUCHI
PRO
October 05, 2024
More Decks by Tsubasa SEKIGUCHI
See All by Tsubasa SEKIGUCHI
スモールスタートでいこう 自作テレメトリシステム概論
tinykitten
PRO
0
41
TrainLCD v10リリース記念 TrainLCDを支える技術
tinykitten
PRO
1
480
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
PRO
0
240
初めてのハッカソンを「紙芝居」で終わらせた話
tinykitten
PRO
0
48
これならできる!個人開発のすゝめ
tinykitten
PRO
0
450
今日から使える AI駆動開発のすゝめ
tinykitten
PRO
1
96
Reactで始める リグレッションテスト概論
tinykitten
PRO
0
65
エンジニアでも捗る デザイナー的思考入門
tinykitten
PRO
2
1.5k
Gunma.web #55
tinykitten
PRO
0
300
Other Decks in Programming
See All in Programming
PHPで TLSのプロトコルを実装してみるをもう一度しゃべりたい
higaki_program
0
170
ネイティブアプリとWebフロントエンドのAPI通信ラッパーにおける共通化の勘所
suguruooki
0
240
飯MCP
yusukebe
0
480
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
300
20260315 AWSなんもわからん🥲
chiilog
2
190
AI Assistants for YourAngular Solutions @Angular Graz, March 2026
manfredsteyer
PRO
0
150
PCOVから学ぶコードカバレッジ #phpcon_odawara
o0h
PRO
0
160
「接続」—パフォーマンスチューニングの最後の一手 〜点と点を結ぶ、その一瞬のために〜
kentaroutakeda
5
2.4k
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
180
Kubernetes上でAgentを動かすための最新動向と押さえるべき概念まとめ
sotamaki0421
2
390
20260320登壇資料
pharct
0
160
条件判定に名前、つけてますか? #phperkaigi #c
77web
2
950
Featured
See All Featured
Testing 201, or: Great Expectations
jmmastey
46
8.1k
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
330
Why Mistakes Are the Best Teachers: Turning Failure into a Pathway for Growth
auna
0
110
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
310
The browser strikes back
jonoalderson
0
890
A designer walks into a library…
pauljervisheath
211
24k
Paper Plane (Part 1)
katiecoart
PRO
0
6.4k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.1k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
140
Making the Leap to Tech Lead
cromwellryan
135
9.8k
Thoughts on Productivity
jonyablonski
76
5.1k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
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