Slide 1

Slide 1 text

Rustͱ tonicͰ࢝ΊΔ gRPCೖ໳ Advanced guide for development gRPC service with Rust and tonic. My

Slide 2

Slide 2 text

TinyKitten Freelance frontend engineer I 💖 OSS & Cat🐈 Born in Gunma🐴 Live in Tokyo🗼

Slide 3

Slide 3 text

Tsubasa SEKIGUCHI ౎಺Λڌ఺ͱ͢Δ܈അݝલڮࢢੜ·ΕͷϑϦʔϥϯεͷ ϑϩϯτΤϯυΤϯδχΞɻ ͖ͬͨΜͱݺ͹Ε͍ͯ·͢ɻ

Slide 4

Slide 4 text

೥ͿΓʹ໊ࢗͷσβΠϯΛߋ৽͠·ͨ͠ɻ͝ڵຯ͋Ε͹͓౉͠͠·͢ɻ

Slide 5

Slide 5 text

TrainLCD ೔ຊશࠃͷమಓ࿏ઢͰ࢖͑Δ ৽ײ֮ͷφϏήʔγϣϯΞϓϦͰ͢ɻ

Slide 6

Slide 6 text

Smart StackରԠ ۙ೔഑৴༧ఆ ˞ը૾͸։ൃதͷ΋ͷͰ͢ɻ

Slide 7

Slide 7 text

TrainLCDͷݪܕதͷݪܕͷΞϓϦʹؔͯ͠ͷηογϣϯΛͨ͠ࡍͷ഑৴͕YouTubeʹ͋Γ·͢

Slide 8

Slide 8 text

ࠓճͷLTͰ࿩͞ͳ͍ൣғ ϋϯζΦϯͰ͖ΔϨϕϧͷ࣮૷ͷ࿩ ͔Μ΂Μ͍ͯͩ͘͠͞ README.mdʹॻ͍ͯ͋Δఔ౓ͷ஌ࣝ 5෼Ͱ͸͕࣌ؒ଍Γ·ͤΜ JSͷόϯυϧαΠζͰ͸ͳ͘ମॏΛݮΒ͢ํ๏ ૫ͤΔͨΊͷ͕࣌ؒͳ͍Ͱ͢ ਅ໷தʹ΍Δؾ͕ग़Δݱ৅ʹ͍ͭͯ ͜ͷεϥΠυ͸େମ࢓ࣄ͕ऴΘͬͯՋʹͳͬͨ໷தʹ࡞ͬͯ·͢

Slide 9

Slide 9 text

Introduction جૅ஌ࣝ

Slide 10

Slide 10 text

gRPCͱ͸ʁ GoogleࣾͷߟҊͨ͠RPCϓϩτίϧ RPC͸Remote Procedure Call(ԕִखଓ͖ݺͼग़͠ ͷུͰ͢ gRPC͸ࣗࣾϚΠΫϩαʔϏεؒͰͷ಺੡γεςϜʮStubbyʯ͕લ਎ IDL͔Β༷ʑͳݴޠͷίʔυ͕ੜ੒Ͱ͖Δ ΋ͪΖΜJavaScript΋ՄೳͰ͢ gRPC-webͰWebϒϥ΢β͔ΒgRPCαʔόʔΛୟ͚Δ 8FCϒϥ΢βͰͷ࢖༻Ͱ͸੍ݶ͕͋Δ αʔόʔͱͷʮ௚઀ʯ௨৴͸Ͱ͖ͳ͍ʢجຊతʹ&OWPZ౳ͷϓϩΩγͷ༻ҙ͕ඞཁʣ Bi-directional streaming(C/SؒͰ೚ҙͷλΠϛϯάͰ௨৴͕Ͱ͖Δ)ʹରԠ͍ͯ͠ͳ͍

Slide 11

Slide 11 text

ࠓճͷϓϩμΫγϣϯͳ୊ࡐ TrainLCD ʮ೔ຊશࠃͷమಓ࿏ઢͰ࢖͑Δ৽ײ֮φϏήʔγϣϯΞϓϦʯ TrainLCDͱ͍͏ΞϓϦΛझຯͰ࡞͍ͬͯ·͢ɻ ͜ͷΞϓϦ͸ओཁ౎ࢢͷτϨΠϯϏδϣϯΛ࠶ݱͨ͠ΞϓϦͰɺ GPSΛ࢖ͬͨφϏήʔγϣϯΞϓϦͱͯ͠΋࢖͑·͢ɻ ศརͳػೳͱͯ͠Ӻ౸ண௨஌΍εϚʔτ΢ΥονରԠɺ iOS/iPadOSͷLive Activitiesʹ΋ରԠ͍ͯ͠·͢ɻ

Slide 12

Slide 12 text

ࠓճͷϓϩμΫγϣϯͳ୊ࡐ TrainLCDΞϓϦͷAPI࣮૷ʮStationAPIʯ TrainLCDΞϓϦͷAPIαʔόʔͷStationAPI͕͋Γɺ
 ͜ͷStationAPIΛ୊ࡐͱͯ͠஌ݟΛڞ༗͠·͢ɻ
 ͳ͓ɺStationAPI͸਺ϲ݄લʹNestJSΛ࢖ͬͨGraphQLαʔόʔͱͯ͠Քಇ͍ͤͯͯ͞ɺ
 NestJSͱApollo Server(GraphQL)ͷελοΫΛRust+tonic(gRPC)ʹҠߦ͠·ͨ͠ɻ

Slide 13

Slide 13 text

ࠓճ঺հ͢ΔελοΫ

Slide 14

Slide 14 text

Rustͱ͸ ݴΘͣͱ஌Εͨϓϩάϥϛϯάݴޠ CݴޠɺC++ʹ୅ΘΔγεςϜϓϩάϥϛϯάݴޠΛ໨ࢦ͍ͯ͠Δ GCͳΜͯ΋ͷ͸ͳ͍ GCͳ͠ͰͷϝϞϦ҆શੑΛอূ͍ͯ͠Δ ($ͷΑ͏ͳػߏ͕ඞཁͳ৔໘Ͱ͸εϚʔτϙΠϯλΛ࢖༻Մೳ AtomicͳArcɺͦ͏Ͱ͸ͳ͍Rc͕͋Δ WebAssemblyʹͩͬͯ࢖͑·͢ ֶशίετߴΊ आ༻ɺϥΠϑλΠϜͱࠓ·Ͱͳ͔ͬͨ֓೦͕͋Δ͕ɺ ͦΕΒ͕ϝϞϦ҆શΛୡ੒͍ͤͯ͞Δ

Slide 15

Slide 15 text

tonicͱ͸ RustͷgRPC࣮૷ 3VTUͰ࢖͑ΔϋΠύϑΥʔϚϯεͰOSSɺ൚༻తͳgRPCϑϨʔϜϫʔΫ ϋΠύϑΥʔϚϯεʹϑΥʔΧε ଞʹ΋૬ޓӡ༻ੑ͕͋ΓॊೈͳϥΠϒϥϦͱᨳ͍ͬͯΔ ࢖͍ํʹΑͬͯ͸֎෦ϓϩΩγෆཁ grpc-webͷαʔόʔͱͯ͠࢖͍͍ͨ৔߹͸ɺtonic-web crate͕͋Γ·͢ tonic-web crateΛ࢖͏͜ͱͰɺϑϨʔϜϫʔΫଆͰHTTP/1.1Λ஻ΕΔΑ͏ʹͳΓ·͢ ͭ·ΓɺEnvoy౳ͷ֎෦ϓϩΩγ͕ෆཁʹͳΓ·͢

Slide 16

Slide 16 text

Motivation ͳͥ΍Δͷ͔

Slide 17

Slide 17 text

StationAPIϑϧεΫϥονͷϞνϕʔγϣϯ(1/3) NestJSΛ࢖͍ͬͯ·ͨ͠ NestJSͰGraphQLϞδϡʔϧΛ࢖ͬͯGraphQLͷAPIΛ࣮૷͍ͯ͠·ͨ͠ɻ NestJSࣗମ͸ѱ͘͸ͳ͔ͬͨͰ͢ɻΉ͠Ζਖ਼ࣾһ࣌୅ʹ࢖͍ͬͯͨ Angularͱߏ଄͕ࣅ͍ͯͯϊελϧδʔʹਁΕ·ͨ͠ શવؔ܎ͳ͍ ɻ N+1໰୊ʹͿͪ౰ͨΔ ΋ͪΖΜɺNestJSͰղܾෆՄೳͳ໰୊Ͱ͸ͳ͍ͷͰ͕͢ɻ ۙࠒTrainLCDΞϓϦͷϢʔβʔ΋૿͖͑ͯͯɺͲ͏ͤൈຊతʹॻ͖׵͑ΔͳΒ NestJSʹ᩾ር͢ΔΑΓ΋͏ͪΐͬͱݎ࿚Ͱߴ଎ͳ"1*Λ࡞Γ͔ͨͬͨͷͰ͢ɻ

Slide 18

Slide 18 text

͜͜ͰRustʹനӋͷ໼ཱ͕ͭ աڈʹͪΐͬͱ͚ͩRustͷษڧΛ͍ͯͯ͠ɺݴޠͷઃܭ͕RustͷॳֶϓϩάϥϚʹݫ͍͕͠ɺ ҆৺ͯ͠ಈ͔ͤΔ্ʹNode.jsΑΓߴ଎ɾ௿ϝϞϦϑοτϓϦϯτͳAPIΛ࡞ΕΔͷͰɺ ࠓճͷϑϧεΫϥον͸RustͰߦ͏લఏͱͳΓ·ͨ͠ɻ Ͳ͏ͤͳΒgRPC΋ࢼͯ͠ΈΑ͏ gRPCࣗମ͸ҎલΑΓ஌͍ͬͯͯ࠾༻͢Δ͔ܰ͘໎͍·͕ͨ͠ɺैདྷͷGraphQL APIͷ՝୊ͱͯ͠ ʮΞϓϦͷૢ࡞ճͰඞཁͳσʔλ͕ଟͯ͘ΫΤϦ͕ංେԽɺϨεϙϯεσʔλ͕͑͛ͭͳ͍αΠζʹͳΔʯ ͱ͍͏ͷ΋͋Γͦ΋ͦ΋ΞϓϦͷઃܭࣗମ͕ؒҧ͍ͬͯΔؾ΋͠ͳ͘͸ͳ͍Ͱ͕͢ɺ εϚϗ޲͚ΞϓϦͰͷ௨৴༰ྔ͕ଟ͍ͷ͸େ͖ͳ՝୊Ͱͨ͠ɻ StationAPIϑϧεΫϥονͷϞνϕʔγϣϯ(2/3)

Slide 19

Slide 19 text

gRPCͷϖΠϩʔυ͸όΠφϦ όΠφϦͰ΍ΓऔΓ͢ΔͷͰɺઌ΄Ͳઆ໌ͨ͠ʮϨεϙϯεσʔλͷංେԽʯʹ͸ޮՌతͦ͏Ͱ͢ΑͶɻ ChromeͷDevToolsͰ͸όΠφϦͷͨΊ֬ೝ͕͠ΜͲ͔ͬͨΓ͠·͢ɻ Protocol Bu ff ersͰλΠϓηʔϑ ͪ͜Β͸REST APIͱͷൺֱͰ͕͢ɺ gRPC APIͱ௨৴͢Δ࣌ʹඞͣProtocol Bu ff ersͷεΩʔϚఆٛΛ࢖༻͢ΔͷͰ ௨৴͢Δલ͔ΒϦΫΤετͱϨεϙϯεͷܕ͕Θ͔Βͳ͍ɺͱ͍͏͜ͱ͸ͳ͘ͳΔ͸ͣͰ͢ɻ ཁ͢ΔʹREST APIͰ͍͏Swagger͕࠷ॳ͔Β࢖͑Δͱ͍ͬͨΠϝʔδͰ͢ɻ StationAPIϑϧεΫϥονͷϞνϕʔγϣϯ(3/3)

Slide 20

Slide 20 text

Implement & Run By Example StationAPIͷ஌ݟΛݩʹ࣮૷ͯ͠࢖ͬͯΈΔ

Slide 21

Slide 21 text

Protocol Bu ff ersͰεΩʔϚఆٛΛߦ͏ RustͰ࣮૷ AWSʹσϓϩΠ PostmanͰୟ͍ͯΈΔ ΞϓϦʹͭͳ͗͜Ή ͬ͟ͱ΍ͬͨ͜ͱ

Slide 22

Slide 22 text

RustΛ࢖ͬͨ։ൃͷ஌ݟσʔλϕʔεฤ ORM͸ԿΛ࢖ͬͨʁ ਖ਼֬ʹ͸ORMͰ͸ͳ͍Ͱ͕͢ɺsqlxΛ࢖༻͠·ͨ͠ɻ Ϣʔεέʔεతʹ͸SQL͚࣮ͩߦͰ͖Ε͹े෼ͰɺORMͩͱΦʔόʔεϖοΫɻ query!ͷΑ͏ͳϚΫϩΛ࢖͏ͱίϯύΠϧ࣌ʹΫΤϦΛνΣοΫͰ͖·͢ɻ ϚΫϩҎ֎͸ଞݴޠͷORMͱ͔ʹରͯ͠໌Β͔ʹҧ͏ͱ͜Ζ͸ͳ͍ͱࢥ͍·͢ɻ ΄͔ʹ΋ɺRustʹ͸dieselͱ͍͏ORM͕͋Γ·͕͢ɺ ͜Ε͕σϑΝΫτελϯμʔυʁ

Slide 23

Slide 23 text

gRPC APIΛσϓϩΠ ελοΫʹ͍ͭͯ StationAPI͸AWSʹ৐͔ͬͬͯ·͢ɻ࢖͍ͬͯΔαʔϏε͸ - Elastic Container Service(ECS)
 - Elastic Container Registry(ECR)
 - Elastic Load Balancing(ELB)
 
 ΄͔ʹ΋GCPͷج൫΋࢖͍ͬͯ·͢
 - Text-to-Speech AI Firebase
 - Firestore/Storage/Messaging/Authentication/Functions

Slide 24

Slide 24 text

·ͱΊ Rust͸͍͍ͧ Rust͸҆શͰߴ଎ͳγεςϜϓϩάϥϛϯάݴޠͰ͢ ࠷ॳͷֶशίετ͸ߴ͍Ͱ͕͢ɺҰ౓Ͱ΋৮ͬͯΈΔՁ஋͸ զʑWebۀքͷਓؒͩͱͯ͠΋͋Γ·͢ AWS΋͍͍ͧ આ໌΋໺฻Ͱ͢Ͷ TrainLCDΞϓϦΛ͝᩾ርʹ ൱ఆతͳઌೖ؍Λ͍࣋ͬͯͨਓͰ΋ɺ࢖ͬͯΈΕ͹ ʮੜ׆ʹ͔ܽͤͳ͍ʯ໘ന͍ΞϓϦͱධՁͯ͠΋Β͍͑ͯ·͢

Slide 25

Slide 25 text

͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ Thank you for listening! My 2024.10.08 Tsubasa SEKIGUCHI