Slide 1

Slide 1 text

ιϑτ΢ΣΞ։ൃʹ͓͚Δ ʮઃܭʯͱʮύϑΥʔϚϯεʯͷ૬ޓ࡞༻ Interaction Between Design and Performance on
 Software Development ઃܭNight2018 @moznion

Slide 2

Slide 2 text

@moznion Software Engineer ࠷ۙαϒςΫʹೖΓ·ͨ͠

Slide 3

Slide 3 text

DISCLAIMER

Slide 4

Slide 4 text

۩ମతͳιϑτ΢ΣΞઃܭٕ๏ɾख๏ͷ
 ࿩୊͸ଞͷൃදʹৡΓ·͢

Slide 5

Slide 5 text

ʮઃܭʯͱʮύϑΥʔϚϯεʯ

Slide 6

Slide 6 text

ύϑΥʔϚϯεͷఆٛ (؆ܿʹ) - ߴ଎ʹϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ͨ͘͞ΜϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ʮਖ਼֬ʹʯ

Slide 7

Slide 7 text

ύϑΥʔϚϯεͷఆٛ (؆ܿʹ) - ߴ଎ʹϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ͨ͘͞ΜϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ʮਖ਼֬ʹʯ

Slide 8

Slide 8 text

ύϑΥʔϚϯεͷఆٛ (؆ܿʹ) - ߴ଎ʹϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ͨ͘͞ΜϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ʮਖ਼֬ʹʯ

Slide 9

Slide 9 text

ύϑΥʔϚϯεͷఆٛ (؆ܿʹ) - ߴ଎ʹϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ͨ͘͞ΜϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ - ʮਖ਼֬ʹʯ

Slide 10

Slide 10 text

ͳͥύϑΥʔϚϯεΛ௥ٻ͢Δͷ͔

Slide 11

Slide 11 text

- ྑ͍Πϯλʔωοτମݧͷఏڙ - ΑΓଟ͍ʮػձʯͷ૑ग़ - Πϯϑϥઃඋͷ࠷దԽ - ==> ͭ·Γθχ΍ʂʂʂʂʂʂ ͳͥύϑΥʔϚϯεΛ௥ٻ͢Δͷ͔

Slide 12

Slide 12 text

- ྑ͍Πϯλʔωοτମݧͷఏڙ - ΑΓଟ͍ʮػձʯͷ૑ग़ - Πϯϑϥઃඋͷ࠷దԽ - => ͭ·Γθχ΍ʂʂʂʂʂʂ ͳͥύϑΥʔϚϯεΛ௥ٻ͢Δͷ͔

Slide 13

Slide 13 text

ͭ·Γθχ΍ʂʂʂʂʂ

Slide 14

Slide 14 text

ύϑΥʔϚϯεͤ͞΍͍͢ઃܭʁ

Slide 15

Slide 15 text

- ΞϧΰϦζϜ - σʔλߏ଄ - (ϋʔυ΢ΣΞ) ύϑΥʔϚϯεͤ͞΍͍͢ઃܭ (Ұྫ) - ϑΝϯΞ΢τ - ΩϡʔΠϯά - Ωϟογϡ ɹ- όον ਨ௚ࢦ޲ ਫฏࢦ޲ ͦͷଞ

Slide 16

Slide 16 text

ਨ௚ࢦ޲ͷઃܭ

Slide 17

Slide 17 text

- ద੾ͳΞϧΰϦζϜͷద༻ - ద੾ͳσʔλߏ଄ͷద༻ - සग़) ୳ࡧɼιʔτͳͲ - ͳΜͰ΋͔ΜͰ΋ϋϯϚʔΛ࢖ͬͯ͸ͩΊ ਨ௚ࢦ޲ͷઃܭ

Slide 18

Slide 18 text

- ΞϧΰϦζϜ΍σʔλߏ଄͸খ͍͞ύʔπ - ଞͷઃܭख๏ͱͷ૊Έ߹Θ͕ͤൺֱత༰қ - => ੹຿͕໌֬Ͱ͋Δ͜ͱʹڌΓͦ͏ - ࠜຊతͳύϑΥʔϚϯεվળΛਤΔͳΒ͜͜ʂ ਨ௚ࢦ޲ͷઃܭ

Slide 19

Slide 19 text

- ʮҰ൪͍͍ϚγϯΛཔΉʯ - ϋʔυ΢ΣΞઃܭͷਐาʹཔΔʂʂʂ - ࠓճͷ࿩୊ͱ͸Ұ੾ؔ܎ͳ͍Ͱ͢ - ͱ͸͍͑ϋʔυ΢ΣΞͷਐาʹΑͬͯ
 ιϑτ΢ΣΞઃܭͷٕ๏͕มΘΔ͜ͱ͸͋Γͦ͏ ਨ௚ࢦ޲ͷઃܭ (൪֎)

Slide 20

Slide 20 text

ਫฏࢦ޲ͷઃܭ

Slide 21

Slide 21 text

- ϑΝϯΞ΢τ - ෳ਺ͷϓϩηεɾϚγϯͰฒߦॲཧ - ෳ਺ͷϓϩηεɾϚγϯͰฒྻॲཧ (ڠௐॲཧ) - (Reactive...?) - ϑΝϯΠϯ͕ཁΔ (৔߹͕͋Δ) ਫฏࢦ޲ͷઃܭ

Slide 22

Slide 22 text

- ΩϡʔΠϯά - δϣϒΩϡʔͰޙճ͠େ࡞ઓ (™@nekokak) - ཁ͸όοϑΝϨΠϠʔʹॲཧΛ٧ΊࠐΉ - ϫʔΧʔ (૬౰) ͕ॲཧΛ੥͚ෛ͏ - εϩοτϦϯά͕͠΍͍͢ ਫฏࢦ޲ͷઃܭ queue (buffer)

Slide 23

Slide 23 text

- ΩϡʔΠϯά - ҎԼΛຬ଍͢Δ؀ڥͰ͋Ε͹ຊ౰ʹޮՌత - ϦΞϧλΠϜੑ͕ٻΊΒΕͳ͍ - ஗Ԇ͕ڐ༰͞ΕΔ ਫฏࢦ޲ͷઃܭ queue (buffer)

Slide 24

Slide 24 text

- (ଟ͘ͷ৔߹) ඇಉظॲཧ͔Βಀ͛ΒΕͳ͍ - ඇಉظॲཧ͕ϏδωεϩδοΫʹ
 ͢ΜͳΓ࣮૷͞ΕΔ͜ͱ͸ͦ͏ଟ͘͸ͳ͍ - ϓϩτίϧελοΫͷ࣮૷౳Ͱ͸͋Δ͔΋ ਫฏࢦ޲ͷઃܭ

Slide 25

Slide 25 text

- ඇಉظͰ΋ಈ͘Α͏ʹ࣮૷͢Δඞཁ͕ग़ͯ͘Δ - ྫ - ॱংੑʹڍಈΛࢧ഑͞Εͳ͍ - ႈ౳ੑΛ୲อ࣮ͯ͠૷͢Δ - ௚ײʹ൓͢Δ৔߹͕ଟ͍…… ਫฏࢦ޲ͷઃܭ

Slide 26

Slide 26 text

- ύϑΥʔϚϯεͷͨΊͷ౎߹͕ϏδωευϝΠϯͷ
 ઃܭΛ࿪Ί͕ͪ - ஫ҙਂ͘ઃܭ͢Δͱ͏·͘ಇ͘৔߹΋͋Δ (ޙड़) - (ʮӡ͕ྑ͚Ε͹ʯ͔΋͠Εͳ͍) - ͏͔ͬΓૉ๿ʹ࣮૷͢Δͱ……ᄾݺ ਫฏࢦ޲ͷઃܭ

Slide 27

Slide 27 text

- ࡶଟͳۤ͠ΈΛݺͼ͕ͪ - ϨʔείϯσΟγϣϯ - ϦτϥΠ - εςʔτͷෆ੔߹ - ͳͲͳͲ…… - Ref: ෼ࢄΩϡʔͱ͍͏໊ͷۤ͠Έ - Software Transactional Memo
 http://kumagi.hatenablog.com/entry/queue_struggle ਫฏࢦ޲ͷઃܭ

Slide 28

Slide 28 text

- εέʔϧ͢Δʢ͠΍͍͢ʣʂʂ - ͔͠͠τϨʔυΦϑ͸ଟ͍ - ͦΕͰ΋ಋೖ͢Δ͔Ͳ͏͔ͷίετ൑அʢޙड़ʣ ਫฏࢦ޲ͷઃܭ

Slide 29

Slide 29 text

- FaaSʹΑΔύϥμΠϜͷมԽ - ԋࢉϦιʔεΛΦϯσϚϯυͰ҆͘࢖͑ΔΑ͏ʹͳͬͨ - FunctionʹॲཧΛҕৡͯ͠͠·͏ - Firebaseͱ͔Ͱׂͱਪ঑͞ΕΔख๏ - ʮͱΓ͋͑ͣδϣϒΩϡʔʹೖΕ͓͍ͯͯ͋ͱͰॲཧʯ - ΊͬͪΌ΍Γ΍͘͢ͳͬͨ - ୯Ұ੹೚ͷݪଇ (SRP) ͕ൺֱతຬͨ͞Ε΍͘͢ͳͬͨҹ৅ - (ίϯϙʔωϯτͷϝϯςίετ΋Լ͕Δ) ਫฏࢦ޲ͷઃܭ (൪֎?)

Slide 30

Slide 30 text

SONOTA

Slide 31

Slide 31 text

- όον - ͋Β͔͡ΊίϯςϯπΛ΋Γ΋Γੜ੒
 ͓͍ͯͯ͠ΞϓϦ͸ͦΕΛฦ٫͢Δ͚ͩͱ͔ - αϚϦςʔϒϧͱ͔…… - ͜Ε΋ଈ࣌ੑͱͷ݉Ͷ߹͍ͷ࿩୊ʹͳΔ ͦͷଞ

Slide 32

Slide 32 text

- Ωϟογϡ - खͬऔΓૣ͍ͥʢةݥࢥ૝ʣ - YAPC::Kansai 2017 OSAKAͰ࿩͠·ͨ͠ - https://speakerdeck.com/moznion/pattern-and-strategy-of- web-application-caching - (↑Ͱ࿩͍ͯ͠ͳ͍࿩୊ͱͯ͠͸ϚςϏϡʔ͕͋Γͦ͏) ͦͷଞ

Slide 33

Slide 33 text

- Ωϟογϡ΍όον͸ຊ࣭త͔Ͳ͏͔ - ଟ͘ͷ৔߹͸ຊ࣭తͰ͸ͳ͍……ʁ ͦͷଞ

Slide 34

Slide 34 text

- ຊ࣭ͱ͸ͳʹ͔……ʁ - => ϏδωευϝΠϯɾϩδοΫͷ៉ྷ͞ - => θχ΍ʂʂʂʂʂʂ ͦͷଞ

Slide 35

Slide 35 text

- ຊ࣭ͱ͸ͳʹ͔……ʁ - => ઃܭͷ៉ྷ͞ - => θχ΍ʂʂʂʂʂʂ ͦͷଞ

Slide 36

Slide 36 text

- ຊ࣭ͱ͸ͳʹ͔……ʁ - => ઃܭͷ៉ྷ͞
 => θχ΍ʂʂʂʂʂʂ ͦͷଞ

Slide 37

Slide 37 text

ͭ·Γθχ΍ʂʂʂʂʂ

Slide 38

Slide 38 text

- ͔͠͠ - ςΫχΧϧͳ౎߹͕ιϑτ΢ΣΞઃܭʹٴ΅͢Өڹ͸େ͖͍ - ౎߹ ∈ ϋʔυ΢ΣΞɾϛυϧ΢ΣΞ - ςΫχΧϧͳղܾख๏ͷ҆қͳಋೖʹΑͬͯ
 ΧΦεʹ޲͔͍ͬͯ͘Մೳੑ͸ߴ·Δ - υϝΠϯͷ࣋ͭϐϡΞ͕ࣦ͞ΘΕΔ - ઃܭ͕࿪ΊΒΕ͕ͪ ͦͷଞ

Slide 39

Slide 39 text

ઃܭ͕࿪ΊΒΕΔʁ

Slide 40

Slide 40 text

- ઃܭ͕࿪ΊΒΕΔ - => ڍಈ͕Θ͔Γʹ͘͘ͳΔ (ίʔυͷಡΈ΍͚ͩ͢͞Ͱ͸ͳ͍) - => मਖ਼ίετ͕ߴ͘ͳΔ - => ϝϯςίετ͕ߴ͘ͳΔ - => ઃܭ͕࿪ΊΒΕ͍ͯΔ͜ͱʹؾͮ͘…… ઃܭ͕࿪ΊΒΕͯԿ͕ѱ͍ʁ

Slide 41

Slide 41 text

- ઃܭ͕࿪ΊΒΕΔ - => ڍಈ͕Θ͔Γʹ͘͘ͳΔ (ίʔυͷಡΈ΍͚ͩ͢͞Ͱ͸ͳ͍) - => मਖ਼ίετ͕ߴ͘ͳΔ - => ϝϯςίετ͕ߴ͘ͳΔ - => ઃܭ͕࿪ΊΒΕ͍ͯΔ͜ͱʹؾͮ͘…… ઃܭ͕࿪ΊΒΕͯԿ͕ѱ͍ʁ

Slide 42

Slide 42 text

ʮίετʯ

Slide 43

Slide 43 text

- ৽ͨʹػೳΛ࡞Δίετ - ίʔυͷϝϯςφϯείετ - Πϯϑϥͷϝϯςφϯείετ - => ιϑτ΢ΣΞઃܭ͸͜ΕΒʹӨڹΛٴ΅͢ - => ઃܭ͸ίετͱͷઓ͍ ίετ

Slide 44

Slide 44 text

ͭ·Γθχ΍ʂʂʂʂʂ

Slide 45

Slide 45 text

- ίετͷ࣠ - ίϯϐϡʔςΟϯάͷ଎౓ʹΑͬͯϖΠ͢ΔྖҬ - ઃܭͷྑ͞ʹΑͬͯϖΠ͢ΔྖҬ - ௚ަ͢Δ৔߹΋͋Ε͹૬৐͢Δ৔߹΋૬൓͢Δ৔߹΋͋Δ - όϥϯε͕ॏཁ - ྑ͍ઃܭͷ৚݅ͷҰͭ: ߹ҙ͕औΕ͍ͯΔ - => ίετͱ΋߹ҙΛऔΔඞཁ͕͋Δ - ʮσϕϩούͷੜ࢈ੑʯʹݶఆͨ͠࿩Ͱ͸ͳ͍ ίετ

Slide 46

Slide 46 text

υϝΠϯ஌ࣝͱύϑΥʔϚϯε

Slide 47

Slide 47 text

- υϝΠϯʹର͢Δ஌͕ࣝ଍Γͳ͍৔߹ - ݟ౰ҧ͍ͷ࣮૷ɾઃܭΛ͕ͪ͠ - ෆద੾ͳσʔλߏ଄Λ࠾༻ͯ͠͠·ͬͨΓ…… - ྑ͍ύϑΥʔϚϯεʹ͸υϝΠϯʹର͢Δ஌ࣝɾཧղ͕ඞཁ ʮυϝΠϯ஌ࣝͷཧղʯͱύϑΥʔϚϯε

Slide 48

Slide 48 text

࣮ࡍͲ͏ઃܭ͢Ε͹ྑ͍ͷ͔……

Slide 49

Slide 49 text

΋ͷʹΑΔ

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

͋͘·Ͱݸਓͷܦݧͷ࿩ͱͯ͠ฉ͍͍ͯͩ͘͞

Slide 52

Slide 52 text

- ૉ௚ʹϞσϦϯάͯ͠࡞ͬͨ΄͏͕ྑ͍ - ଟ͘ͷ৔߹࣮༻ʹ଱͑͏Δ଎౓Ͱಈ͘ - ͪΌΜͱϞσϦϯά͞Ε͍ͯΔ - ࠷௿ݶৗࣝతͳઃܭɾ࣮૷͕͞Ε͍ͯΕ͹…… - ʮඒ͍͠΋ͷ͸ۭؾ఍߅͕খ͍͞ʯͷਫ਼ਆ - ࣮ࡍͦΜͳ౎߹ྑ͘͸ͳ͍ͷ͕ͩ…… - ࠔͬͨΒͬͪ͜ʹ౗͓ͯ͘͠ ύϑΥʔϚϯεͱઃܭࢦ਑

Slide 53

Slide 53 text

- ͔͋͠͠Δ೔ʢϦϦʔεॳ೔͔΋……ʣΛڥʹ໓๢͢Δ͔΋ - ͱ͍͏࣌ʹύϑΥʔϚϯεΛਅ໘໨ʹߟ͑Δ΂͖ - ཱͪฦͬͯʮྑ͍ઃܭʯͱ͸ - ΞδϦςΟ - ॊೈੑ - ྑ͍ઃܭ => ࠷దԽͷ༨஍͕͋Δ͸ͣ ύϑΥʔϚϯεͱઃܭࢦ਑

Slide 54

Slide 54 text

Slide 55

Slide 55 text

No content

Slide 56

Slide 56 text

௨஌͢ΔϢʔβ͕ଟ͗͢Δέʔε ௨஌Λ࡞ͬͯૹΔ෦෼Ͱ٧·Δ͔΋ʜʜ

Slide 57

Slide 57 text

No content

Slide 58

Slide 58 text

ૉ๿ʹϑΝϯΞ΢τ ௨஌࡞Δ෦෼΋QVTIૹΔ෦෼΋ͦͷ ϓϩηεɾεϨουͰ΍ͬͯ͠·͏

Slide 59

Slide 59 text

No content

Slide 60

Slide 60 text

ߴස౓ͰૹΒΕΔͱ ࢮΜͰ͠·͍·͢ʂ Έ͍ͨͳ৔߹

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

όοϑΝʹΩϡʔΠϯά ϫʔΧʔͷ਺ͰεϩοτϦϯά ͍ͭͰʹ431

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

࣮͸͜͜ͰڥքΛ෼͚ΔͱεοΩϦ͢Δʁ

Slide 65

Slide 65 text

@startuml actor User participant Comment participant WatchingUser participant Queue participant Worker1 participant WorkerN participant Notification participant PushNotificationGateway Worker1 -> Queue : subscribe WorkerN -> Queue : subscribe User -> Comment : postComment Comment -> WatchingUser : fetchWatchingUser Comment -> Comment : buildNotificationBody Comment -> Queue : enqueueNotificationPayload group publishing as async until queue is empty Queue -> Worker1 : publish Worker1 -> Notification : create Notification -> PushNotificationGateway : sendNotification Queue -> WorkerN : publish WorkerN -> Notification : create Notification -> PushNotificationGateway : sendNotification end @enduml

Slide 66

Slide 66 text

@startuml actor User participant Comment participant WatchingUser participant Queue participant Worker1 participant WorkerN participant Notification participant PushNotificationGateway Worker1 -> Queue : subscribe WorkerN -> Queue : subscribe User -> Comment : postComment Comment -> WatchingUser : fetchWatchingUser Comment -> Comment : buildNotificationBody Comment -> Queue : enqueueNotificationPayload group publishing as async until queue is empty Queue -> Worker1 : publish Worker1 -> Notification : create Notification -> PushNotificationGateway : sendNotification Queue -> WorkerN : publish WorkerN -> Notification : create Notification -> PushNotificationGateway : sendNotification end @enduml /PUJpDBUJPOΛ࡞Δ෦෼͝ͱ ΩϡʔΠϯάͯ͠͠·͏ ϫʔΧʔ͕͍͍ײ͡ʹॲཧ

Slide 67

Slide 67 text

Notification͝ͱΩϡʔΠϯά͢ΔϞνϕʔγϣϯ - ଈ࣌ੑ͕ͳͯ͘΋Αͦ͞͏ - Comment͸dispatchʹઐ೦Ͱ͖Δ - rate limitͱ͔Λߟ͑Δඞཁ͕ͳ͘ͳΔ - ୯ҰͷίϯϙʔωϯτΛݟͨ࣌ʹγϯϓϧ

Slide 68

Slide 68 text

Notification͝ͱΩϡʔΠϯά͢Δݒ೦ - ෦඼͕૿͑Δͱෳࡶੑ͕૿͢ - ϛΫϩͩͱγϯϓϧ͕ͩɼϚΫϩͩͱෳࡶʹͳͬͯͳ͍͔ - Worker͕ʮ୭͔ΒૹΒΕ͖ͯͨδϣϒʯ͔஌͓ͬͯ͘ඞཁ͕
 ͋ΔΜ͡Όͳ͍͔ʁ - => ͜Ε͸ΩϡʔΛΘ͚Ε͹ྑ͍ - => ಛఆͷΩϡʔʹ͸ಛఆͷ୯ػೳWorkerΛඥ෇͚Δ - ΩϡʔΛϓϩτίϧͷΑ͏ʹऔΓѻ͏

Slide 69

Slide 69 text

΋ͷʹΑΔ (ϘτϧωοΫʹΑΔ) ߟ͍͖͑ͯ·͠ΐ͏

Slide 70

Slide 70 text

- ૣ͗͢Δ࠷దԽ͸ࡑͰ͋Δ - ύϑΥʔϚϯεͷ౎߹͸υϝΠϯΛ࿪Ί͕ͪ - ·ͣ͸υϝΠϯʹدΓఴͬͨઃܭ͕ྑ͍ - ʮඒ͍͠΋ͷ͸ۭؾ఍߅͕গͳ͍ʯ - ͔͠͠࠷దԽͷ༨஍Λ࢒͢͜ͱ͸ॏཁ - ʮ࠷దԽͷ༨஍͕͋Δઃܭʯ͕ୈҰஈ֊ͱͯ͠ͷྑ͍ઃܭͰ͸ͳ͍͔ ύϑΥʔϚϯεͱઃܭࢦ਑

Slide 71

Slide 71 text

Q?