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
September 10, 2023
Programming
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rustとtonicで始める gRPC再入門
gunmaweb #50
Tsubasa SEKIGUCHI
September 10, 2023
More Decks by Tsubasa SEKIGUCHI
See All by Tsubasa SEKIGUCHI
エンジニアでも捗る デザイナー的思考入門(bitA Edit 新ver)
tinykitten
0
39
React Native × GraphQLで TanStack Queryを 選んだ理由
tinykitten
0
58
第3木曜LT会 #28
tinykitten
0
150
スモールスタートでいこう 自作テレメトリシステム概論
tinykitten
0
57
TrainLCD v10リリース記念 TrainLCDを支える技術
tinykitten
1
570
公共交通オープンデータ × モバイルUX 複雑な運行情報を 『直感』に変換する技術
tinykitten
0
270
初めてのハッカソンを「紙芝居」で終わらせた話
tinykitten
0
68
これならできる!個人開発のすゝめ
tinykitten
0
570
今日から使える AI駆動開発のすゝめ
tinykitten
1
130
Other Decks in Programming
See All in Programming
Google Apps Script で Ruby を動かす
kawahara
0
110
AWS CDK を「作」ってみた 〜フルスクラッチで見えた CDK の裏側〜 / aws-cdk-from-scratch
gotok365
3
2.6k
吝嗇家のためのAI活用 / AI development for miser - ChatGPT + Issue Driven Development
tooppoo
0
200
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
2.6k
信頼性について考えてみる(SRE NEXT 2026 miniLT)
hayama17
0
220
SREの積み重ねがAI駆動開発のガードレールになった ― 7つの実践/SRE Guardrails The 7
tomoyakitaura
8
5.7k
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
430
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
180
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
430
Embedded SREと共に達成した会員管理システムのAWS移行 - SRE NEXT 2026 ランチスポンサーセッション
niftycorp
PRO
1
3.2k
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.7k
ルールを書いて終わらせないハーネスエンジニアリング
yug1224
4
1.8k
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.4k
KATA
mclloyd
PRO
35
15k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
390
How STYLIGHT went responsive
nonsquared
100
6.2k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
Producing Creativity
orderedlist
PRO
348
40k
Marketing to machines
jonoalderson
1
5.6k
Agile that works and the tools we love
rasmusluckow
331
22k
My Coaching Mixtape
mlcsv
0
180
Music & Morning Musume
bryan
47
7.3k
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