Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
KOBA789ʢখྛलʣ ΠϯϑϥετϥΫνϟʔ෦ RubyͷձࣾͰ RustΛॻ͘ͱ͍͏͜ͱ Cookpad Inc. Feb 10th, 2018
Slide 2
Slide 2 text
ࣗݾհ 2 ɾ2017৽ଔ ɾΠϯϑϥετϥΫνϟʔ෦ σʔλج൫άϧʔϓ KOBA789ʢখྛलʣ
Slide 3
Slide 3 text
RubyͷձࣾͰ RustΛॻ͘ͱ͍͏͜ͱ
Slide 4
Slide 4 text
4 Ruby
Slide 5
Slide 5 text
5 Go Java Ruby
Slide 6
Slide 6 text
6 Go Java Hako (DockerσϓϩΠج൫) Ruby
Slide 7
Slide 7 text
7 Go Java Hako (DockerσϓϩΠج൫) Ruby
Slide 8
Slide 8 text
8 Go Java Ruby Rust Hello !
Slide 9
Slide 9 text
9 Ruby͚ͩͷձࣾ Ͱͳ͍
Slide 10
Slide 10 text
10 Push௨৴ج൫
Slide 11
Slide 11 text
ɾΠϕϯτൃੜ͝ͱʹૹ৴ ɾʮͭ͘ΕΆ͕ಧ͍ͨʯ ɾ৴গͳ͍ ɾಛఆͷʹҰ੪৴ ɾٳϢʔβʔͷૌٻ ɾ৴ଟ͍ ɾඦສ௨ن ɾݟੵΓ͕େ ϓογϡ௨ 11 ৴ Ұ੪৴
Slide 12
Slide 12 text
12 App S3 ج൫ SNS 1. ड৴ઃఆΛΫΤϦ 2. ARNΛΫΤϦ 3. S3ʹॻ͖ࠐΈ 4. S3͔ΒಡΈग़͢ 5. SNSૹ৴ ᶃ ᶄ ᶅ ᶇ ᶆ MySQL
Slide 13
Slide 13 text
13 ड৴ઃఆΛΫΤϦ ARNΛΫΤϦ SNSૹ৴ S3ʹॻ͖ࠐΉ S3͔ΒಡΈग़͢
Slide 14
Slide 14 text
14 ड৴ઃఆΛΫΤϦ ARNΛΫΤϦ SNSʹૹ৴
Slide 15
Slide 15 text
15 ड৴ઃఆΛΫΤϦ ARNΛΫΤϦ SNSʹૹ৴ { چج൫ { App
Slide 16
Slide 16 text
16 World's Largest Rails Monolith
Slide 17
Slide 17 text
S3 ج൫ SNS 17 App New! MySQL
Slide 18
Slide 18 text
S3 ج൫ SNS New! DBڞ༗ 18 ίϐϖϩδοΫ App MySQL
Slide 19
Slide 19 text
19 ཧͷPush௨৴ج൫
Slide 20
Slide 20 text
20 ड৴ઃఆΛΫΤϦ ARNΛΫΤϦ SNSʹૹ৴ { } چج൫ ৽ج൫
Slide 21
Slide 21 text
21 ϢʔβʔIDࢦఆ ARNࢦఆ λʔήοτ
Slide 22
Slide 22 text
22 ड৴ઃఆͰϑΟϧλ
Slide 23
Slide 23 text
23 S3 ج൫ SNS MySQL େྔ৴ ৴ HTTP API
Slide 24
Slide 24 text
24 S3 ج൫ SNS MySQL େྔ৴ ৴ HTTP API ϢʔβʔIDͱϝοηʔδ͑͞ ์ΓࠐΊ৴Ͱ͖Δ
Slide 25
Slide 25 text
ɾΠϕϯτൃੜ͝ͱʹૹ৴ ɾʮͭ͘ΕΆ͕ಧ͍ͨʯ ɾ৴গͳ͍ ɾಛఆͷʹҰ੪৴ ɾٳϢʔβʔͷૌٻ ɾ৴ଟ͍ ɾඦສ௨ن ɾݟੵΓ͕େ ϓογϡ௨ 25 ৴ Ұ੪৴
Slide 26
Slide 26 text
ɾΠϕϯτൃੜ͝ͱʹૹ৴ ɾʮͭ͘ΕΆ͕ಧ͍ͨʯ ɾ৴গͳ͍ ɾಛఆͷʹҰ੪ૹ৴ ɾٳϢʔβʔͷૌٻ ɾ৴ଟ͍ ɾඦສ௨ن ɾݟੵΓ͕େ ϓογϡ௨ 26 ৴ ΞϓϦϚʔέςΟϯά
Slide 27
Slide 27 text
ɾΠϕϯτൃੜ͝ͱʹૹ৴ ɾʮͭ͘ΕΆ͕ಧ͍ͨʯ ɾ৴গͳ͍ ɾಛఆͷʹҰ੪ૹ৴ ɾٳϢʔβʔͷૌٻ ɾ৴ଟ͍ ɾඦສ௨ن ɾݟੵΓ͕େ ϓογϡ௨ 27 ৴ ΞϓϦϚʔέςΟϯά ߴͳdry-run ඦສ௨ΛͰ
Slide 28
Slide 28 text
28 RubyͰ࡞Δͷେม
Slide 29
Slide 29 text
Ruby or else 29 ɾɾ҆શੑɾฒߦੑʹϑΥʔΧε ɾίϯύΠϥ͕σʔλڝ߹Λݕࠪ ɾτϨΠτʹΑΔδΣωϦΫε Rust
Slide 30
Slide 30 text
30 Rust is not magic
Slide 31
Slide 31 text
31 ड৴ઃఆΛΫΤϦ ARNΛΫΤϦ SNSʹૹ৴
Slide 32
Slide 32 text
32 ड৴ઃఆΛΫΤϦ ARNΛΫΤϦ SNSʹૹ৴ 6ms 6ms }✕ 100ສ = 3࣌ؒ
Slide 33
Slide 33 text
33 Inspired by facebook/dataloader https://github.com/facebook/dataloader
Slide 34
Slide 34 text
34 ΫΤϦΛ·ͱΊΔ
Slide 35
Slide 35 text
35 ... WHERE user_id = 1; ... WHERE user_id = 2; ... WHERE user_id = 3; ... WHERE user_id IN (1, 2, 3);
Slide 36
Slide 36 text
ΫΤϦΛ·ͱΊΔ 36 WHERE user_id = ? →6ms (only 1 id) WHERE user_id IN (?, ?, ... ?) →11ms (1000 ids) ϕϯνϚʔΫͷ݁Ռɺઍ͘Β͍͕Α͍ ࠷దͳόοναΠζ
Slide 37
Slide 37 text
ΫΤϦΛ·ͱΊΔ 37 ɾΩϡʔʹuser_idΛೖΕΔ ɾΩϡʔʹཷ·͍ͬͯΔuser_idΛҰؾʹऔΓग़͢ ɾIN (...) ͷதʹల։ͯ͠DBΫΤϦ ΞϧΰϦζϜ
Slide 38
Slide 38 text
38 KOBA789/batch-recv-rs https://github.com/KOBA789/batch-recv-rs
Slide 39
Slide 39 text
KOBA789/batch-recv-rs 39 MFU UY SY DSPTTCFBN@DIBOOFMVOCPVOE MFUDIVOL7FD@SY CBUDI@SFDW VOXSBQ DPMMFDU ͍ํ
Slide 40
Slide 40 text
εϨουؒͷϝοηʔδύογϯάʹ͑Δ Multi-producer multi-consumerͳFIFOΩϡʔ SenderͱReceiver͔ΒͳΔ MFU UY SY DSPTTCFBN@DIBOOFMVOCPVOE KOBA789/batch-recv-rs 40 crossbeam_channel
Slide 41
Slide 41 text
KOBA789/batch-recv-rs 41 fn recv(&self) -> Result Ωϡʔͷத͔Β࠷ॳͷཁૉΛऔΓग़͢ϝιου ཁૉ͕ͳ͚ΕεϨουΛϒϩοΫ͢Δʢॏཁʣ crossbeam_channel::Receiver
Slide 42
Slide 42 text
KOBA789/batch-recv-rs 42 fn try_iter(&self) -> TryIter ΩϡʔͷதΛΠςϨʔλͱͯ͠ಘΔϝιου impl<'a, T> Iterator for TryIter<'a, T> ͪΖΜIteratorτϨΠτΛ࣮͍ͯ͠Δ crossbeam_channel::Receiver
Slide 43
Slide 43 text
KOBA789/batch-recv-rs 43 fn take(self, n: usize) -> Take ΠςϨʔλ͔Βઌ಄nݸͷཁૉ͚ͩͷΠςϨʔλΛ࡞Δϝιου std::iter::Iterator
Slide 44
Slide 44 text
KOBA789/batch-recv-rs 44 MFUGJSTUTFMGSFDW MFUSFTUTFMGUSZ@JUFS UBLF O MFUJUFSWFD JOUP@JUFS DIBJO SFTU 0L JUFS Έ߹ΘͤΔ
Slide 45
Slide 45 text
45 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 46
Slide 46 text
batch_recv(3) 46 1 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 47
Slide 47 text
47 1 working... Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 48
Slide 48 text
48 1 working... 2 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 49
Slide 49 text
49 1 working... 2 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 50
Slide 50 text
50 1 working... 2 5 4 3 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 51
Slide 51 text
51 1 working... 2 4 3 5 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 52
Slide 52 text
52 2 4 3 5 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 53
Slide 53 text
batch_recv(3) 53 2 4 3 5 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 54
Slide 54 text
54 2 4 3 5 Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 55
Slide 55 text
55 2 4 3 5 working... } batched Ωϡʔ ϝΠϯ εϨου
Slide 56
Slide 56 text
56 Q. ΫΤϦ݁Ռ Ͳ͏ͬͯฦ͢?
Slide 57
Slide 57 text
ΫΤϦ݁ՌͲ͏ͬͯฦ͢? 57 futures::sync::oneshot Ұ͚͔ͩ͠ૹΕͳ͍ΩϡʔͷΑ͏ͳͷ SenderɹɹͱReceiverɹɹ͔ΒͳΔ ೖ ग़ ʹΛೖΕΔͱ ͔Βग़ͯ͘Δ ೖ ग़
Slide 58
Slide 58 text
58 ೖ 1 ग़ Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 59
Slide 59 text
59 ೖ 1 ग़ Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 60
Slide 60 text
60 ೖ 1 ग़ A Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 61
Slide 61 text
61 ೖ 1 ग़ A A Ωϡʔ ϝΠϯ εϨου ΫΤϦ εϨου
Slide 62
Slide 62 text
62 Q.ΫΤϦ͕ ͨ͘͞Μ͋ͬͨΒ?
Slide 63
Slide 63 text
63 ೖ 2 ग़ ೖ 1 ೖ 3 ग़ ग़
Slide 64
Slide 64 text
64 ೖ 2 ग़ ೖ 1 ೖ 3 ग़ ग़ όοναΠζͷ εϨου͕ඞཁ ͜ΕͰࠔΔ
Slide 65
Slide 65 text
65 Tokio + futures-rs https://tokio.rs/
Slide 66
Slide 66 text
Tokio + futures-rs 66 ɾΠϕϯτϧʔϓͷ࣮ ɾ1ݸҎ্ͷFutureΛ࣮ߦ ɾϊϯϒϩοΩϯά I/O API ɾFutureτϨΠτ ɾJSͷPromiseͱ ಉ༷ͷ֓೦ ɾFutureͷίϯϏωʔλ ɾɹɹɹɹ͜Εͷػೳ Tokio futures-rs ೖ ग़
Slide 67
Slide 67 text
Tokio + futures-rs 67 futures::sync::oneshot Ұ͚͔ͩ͠ૹΕͳ͍ΩϡʔͷΑ͏ͳͷ ɹɹΠϕϯτϧʔϓͰࢹͰ͖Δ ग़
Slide 68
Slide 68 text
68 ΠϕϯτϧʔϓΛ͑ 1εϨουͰͨ͘͞Μͷ "ग़"Λͪ߹ΘͤͰ͖Δ
Slide 69
Slide 69 text
69 ೖ 2 ग़ ೖ 1 ೖ 3 ग़ ग़
Slide 70
Slide 70 text
Tokio + futures-rs 70 ɾΩϡʔͷ͜͏ͷεϨου͔ΒΛฦͯ͠Β͏͜ͱ͕Ͱ͖Δ ɾϒϩοΩϯάͳॲཧΛFutureʹม͍ͯ͠ΔͱΈͳͤΔ oneshot::Senderɹ ΛΩϡʔೖΕΔύλʔϯ ೖ
Slide 71
Slide 71 text
71 KOBA789/batch-loader-rs https://github.com/KOBA789/batch-loader-rs
Slide 72
Slide 72 text
KOBA789/batch-loader-rs 72 ɾKeyͷΠςϨʔλ͔ΒValueͷྻΛฦ͢ϝιουΛ ࣮Ͱ͖ΕSQLҎ֎ʹద༻Մೳ ɾࠓճͷྫͰKey=ϢʔβʔID, Value=ςʔϒϧͷߦ Key-ValueతͳҙͷΫΤϦΛόονԽ
Slide 73
Slide 73 text
࠷ޙʹ 73 ɾͱʹ͔͘ϚϧνεϨου͕҆શ ɾϚϧνεϨουͱΠϕϯτۦಈͷ͍͍ͱ͜औΓ͕Ͱ͖Δ ɾ҆৺ͯ͠ߴԽʹऔΓΊΔ ɾ൚༻ϥΠϒϥϦΛ࡞Γ͍͢ܕγεςϜ Rustͷ͍͍ͱ͜Ζ
Slide 74
Slide 74 text
74 ͜͏ͯ͠ ϓογϡ௨৴ج൫ RustͰॻ͖͞Ε·ͨ͠
Slide 75
Slide 75 text
75 Ruby͚ͩ͡Όͳ͍ దͳݴޠͰ Ϋʔϧʹ՝ղܾ
Slide 76
Slide 76 text
76 RustΛॻ͘Πϯλʔϯγοϓ https://internship.cookpad.com/2018/spring/