Cookpad TechConf 2018 ( https://techconf.cookpad.com/2018/ ) で発表した資料です。
KOBA789ʢখྛलʣΠϯϑϥετϥΫνϟʔ෦RubyͷձࣾͰ RustΛॻ͘ͱ͍͏͜ͱCookpad Inc.Feb 10th, 2018
View Slide
ࣗݾհ2ɾ2017৽ଔɾΠϯϑϥετϥΫνϟʔ෦ σʔλج൫άϧʔϓKOBA789ʢখྛलʣ
RubyͷձࣾͰ RustΛॻ͘ͱ͍͏͜ͱ
4Ruby
5Go JavaRuby
6Go JavaHako(DockerσϓϩΠج൫)Ruby
7Go JavaHako(DockerσϓϩΠج൫)Ruby
8Go JavaRuby RustHello !
9Ruby͚ͩͷձࣾ Ͱͳ͍
10Push௨৴ج൫
ɾΠϕϯτൃੜ͝ͱʹૹ৴ɾʮͭ͘ΕΆ͕ಧ͍ͨʯɾ৴গͳ͍ɾಛఆͷʹҰ੪৴ɾٳϢʔβʔͷૌٻɾ৴ଟ͍ɾඦສ௨نɾݟੵΓ͕େϓογϡ௨11৴ Ұ੪৴
12AppS3ج൫SNS1. ड৴ઃఆΛΫΤϦ2. ARNΛΫΤϦ3. S3ʹॻ͖ࠐΈ4. S3͔ΒಡΈग़͢5. SNSૹ৴ᶃᶄᶅᶇᶆMySQL
13ड৴ઃఆΛΫΤϦARNΛΫΤϦSNSૹ৴S3ʹॻ͖ࠐΉS3͔ΒಡΈग़͢
14ड৴ઃఆΛΫΤϦARNΛΫΤϦSNSʹૹ৴
15ड৴ઃఆΛΫΤϦARNΛΫΤϦSNSʹૹ৴{چج൫{App
16World's Largest Rails Monolith
S3ج൫SNS17AppNew!MySQL
S3ج൫SNSNew!DBڞ༗18ίϐϖϩδοΫAppMySQL
19ཧͷPush௨৴ج൫
20ड৴ઃఆΛΫΤϦARNΛΫΤϦSNSʹૹ৴{}چج൫৽ج൫
21ϢʔβʔIDࢦఆARNࢦఆλʔήοτ
22ड৴ઃఆͰϑΟϧλ
23S3ج൫SNSMySQLେྔ৴৴ HTTP API
24S3ج൫SNSMySQLେྔ৴৴ HTTP APIϢʔβʔIDͱϝοηʔδ͑͞ ์ΓࠐΊ৴Ͱ͖Δ
ɾΠϕϯτൃੜ͝ͱʹૹ৴ɾʮͭ͘ΕΆ͕ಧ͍ͨʯɾ৴গͳ͍ɾಛఆͷʹҰ੪৴ɾٳϢʔβʔͷૌٻɾ৴ଟ͍ɾඦສ௨نɾݟੵΓ͕େϓογϡ௨25৴ Ұ੪৴
ɾΠϕϯτൃੜ͝ͱʹૹ৴ɾʮͭ͘ΕΆ͕ಧ͍ͨʯɾ৴গͳ͍ɾಛఆͷʹҰ੪ૹ৴ɾٳϢʔβʔͷૌٻɾ৴ଟ͍ɾඦສ௨نɾݟੵΓ͕େϓογϡ௨26৴ ΞϓϦϚʔέςΟϯά
ɾΠϕϯτൃੜ͝ͱʹૹ৴ɾʮͭ͘ΕΆ͕ಧ͍ͨʯɾ৴গͳ͍ɾಛఆͷʹҰ੪ૹ৴ɾٳϢʔβʔͷૌٻɾ৴ଟ͍ɾඦສ௨نɾݟੵΓ͕େϓογϡ௨27৴ ΞϓϦϚʔέςΟϯάߴͳdry-runඦສ௨ΛͰ
28RubyͰ࡞Δͷେม
Ruby or else29ɾɾ҆શੑɾฒߦੑʹϑΥʔΧεɾίϯύΠϥ͕σʔλڝ߹ΛݕࠪɾτϨΠτʹΑΔδΣωϦΫεRust
30Rust is not magic
31ड৴ઃఆΛΫΤϦARNΛΫΤϦSNSʹૹ৴
32ड৴ઃఆΛΫΤϦARNΛΫΤϦSNSʹૹ৴6ms6ms}✕ 100ສ= 3࣌ؒ
33Inspired by facebook/dataloaderhttps://github.com/facebook/dataloader
34ΫΤϦΛ·ͱΊΔ
35... WHERE user_id = 1;... WHERE user_id = 2;... WHERE user_id = 3;... WHERE user_id IN (1, 2, 3);
ΫΤϦΛ·ͱΊΔ36WHERE user_id = ? →6ms (only 1 id)WHERE user_id IN (?, ?, ... ?) →11ms (1000 ids)ϕϯνϚʔΫͷ݁Ռɺઍ͘Β͍͕Α͍࠷దͳόοναΠζ
ΫΤϦΛ·ͱΊΔ37ɾΩϡʔʹuser_idΛೖΕΔɾΩϡʔʹཷ·͍ͬͯΔuser_idΛҰؾʹऔΓग़͢ɾIN (...) ͷதʹల։ͯ͠DBΫΤϦΞϧΰϦζϜ
38KOBA789/batch-recv-rshttps://github.com/KOBA789/batch-recv-rs
KOBA789/batch-recv-rs39MFU UY SY[email protected] [email protected][email protected] VOXSBQ DPMMFDU ͍ํ
εϨουؒͷϝοηʔδύογϯάʹ͑Δ Multi-producer multi-consumerͳFIFOΩϡʔSenderͱReceiver͔ΒͳΔMFU UY SY[email protected] KOBA789/batch-recv-rs40crossbeam_channel
KOBA789/batch-recv-rs41fn recv(&self) -> ResultΩϡʔͷத͔Β࠷ॳͷཁૉΛऔΓग़͢ϝιουཁૉ͕ͳ͚ΕεϨουΛϒϩοΫ͢Δʢॏཁʣcrossbeam_channel::Receiver
KOBA789/batch-recv-rs42fn try_iter(&self) -> TryIterΩϡʔͷதΛΠςϨʔλͱͯ͠ಘΔϝιουimpl<'a, T> Iterator for TryIter<'a, T>ͪΖΜIteratorτϨΠτΛ࣮͍ͯ͠Δcrossbeam_channel::Receiver
KOBA789/batch-recv-rs43fn take(self, n: usize) -> TakeΠςϨʔλ͔Βઌ಄nݸͷཁૉ͚ͩͷΠςϨʔλΛ࡞Δϝιουstd::iter::Iterator
KOBA789/batch-recv-rs44MFUGJSTUTFMGSFDW [email protected] UBLF OMFUJUFSWFD [email protected] DIBJO SFTU0L JUFSΈ߹ΘͤΔ
45ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
batch_recv(3)461ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
471working...ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
481working...2ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
491working...2ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
501working...2543ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
511working...24 35ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
5224 35ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
batch_recv(3)5324 35ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
5424 35ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
5524 35working...}batchedΩϡʔϝΠϯ εϨου
56Q. ΫΤϦ݁Ռ Ͳ͏ͬͯฦ͢?
ΫΤϦ݁ՌͲ͏ͬͯฦ͢?57futures::sync::oneshotҰ͚͔ͩ͠ૹΕͳ͍ΩϡʔͷΑ͏ͳͷSenderɹɹͱReceiverɹɹ͔ΒͳΔೖ ग़ʹΛೖΕΔͱ ͔Βग़ͯ͘Δೖ ग़
58ೖ 1ग़ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
59ೖ 1ग़ΩϡʔϝΠϯ εϨουΫΤϦ εϨου
60ೖ 1ग़AΩϡʔϝΠϯ εϨουΫΤϦ εϨου
61ೖ 1ग़ AAΩϡʔϝΠϯ εϨουΫΤϦ εϨου
62Q.ΫΤϦ͕ ͨ͘͞Μ͋ͬͨΒ?
63ೖ 2ग़ೖ 1ೖ 3ग़ग़
64ೖ 2ग़ೖ 1ೖ 3ग़ग़όοναΠζͷ εϨου͕ඞཁ͜ΕͰࠔΔ
65Tokio + futures-rshttps://tokio.rs/
Tokio + futures-rs66ɾΠϕϯτϧʔϓͷ࣮ɾ1ݸҎ্ͷFutureΛ࣮ߦɾϊϯϒϩοΩϯά I/O APIɾFutureτϨΠτɾJSͷPromiseͱ ಉ༷ͷ֓೦ɾFutureͷίϯϏωʔλɾɹɹɹɹ͜ΕͷػೳTokio futures-rsೖ ग़
Tokio + futures-rs67futures::sync::oneshotҰ͚͔ͩ͠ૹΕͳ͍ΩϡʔͷΑ͏ͳͷɹɹΠϕϯτϧʔϓͰࢹͰ͖Δग़
68ΠϕϯτϧʔϓΛ͑ 1εϨουͰͨ͘͞Μͷ "ग़"Λͪ߹ΘͤͰ͖Δ
69ೖ 2ग़ೖ 1ೖ 3ग़ग़
Tokio + futures-rs70ɾΩϡʔͷ͜͏ͷεϨου͔ΒΛฦͯ͠Β͏͜ͱ͕Ͱ͖ΔɾϒϩοΩϯάͳॲཧΛFutureʹม͍ͯ͠ΔͱΈͳͤΔoneshot::Senderɹ ΛΩϡʔೖΕΔύλʔϯೖ
71KOBA789/batch-loader-rshttps://github.com/KOBA789/batch-loader-rs
KOBA789/batch-loader-rs72ɾKeyͷΠςϨʔλ͔ΒValueͷྻΛฦ͢ϝιουΛ ࣮Ͱ͖ΕSQLҎ֎ʹద༻ՄೳɾࠓճͷྫͰKey=ϢʔβʔID, Value=ςʔϒϧͷߦKey-ValueతͳҙͷΫΤϦΛόονԽ
࠷ޙʹ73ɾͱʹ͔͘ϚϧνεϨου͕҆શɾϚϧνεϨουͱΠϕϯτۦಈͷ͍͍ͱ͜औΓ͕Ͱ͖Δɾ҆৺ͯ͠ߴԽʹऔΓΊΔɾ൚༻ϥΠϒϥϦΛ࡞Γ͍͢ܕγεςϜRustͷ͍͍ͱ͜Ζ
74͜͏ͯ͠ ϓογϡ௨৴ج൫ RustͰॻ͖͞Ε·ͨ͠
75Ruby͚ͩ͡Όͳ͍దͳݴޠͰ Ϋʔϧʹ՝ղܾ
76RustΛॻ͘Πϯλʔϯγοϓhttps://internship.cookpad.com/2018/spring/