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/