設計Night2018の資料です https://connpass.com/event/104821/
ιϑτΣΞ։ൃʹ͓͚ΔʮઃܭʯͱʮύϑΥʔϚϯεʯͷ૬ޓ࡞༻Interaction Between Design and Performance on Software DevelopmentઃܭNight2018@moznion
View Slide
@moznionSoftware Engineer࠷ۙαϒςΫʹೖΓ·ͨ͠
DISCLAIMER
۩ମతͳιϑτΣΞઃܭٕ๏ɾख๏ͷ ଞͷൃදʹৡΓ·͢
ʮઃܭʯͱʮύϑΥʔϚϯεʯ
ύϑΥʔϚϯεͷఆٛ (؆ܿʹ)- ߴʹϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ- ͨ͘͞ΜϨεϙϯεΛฦ͢͜ͱ͕Ͱ͖Δ- ʮਖ਼֬ʹʯ
ͳͥύϑΥʔϚϯεΛٻ͢Δͷ͔
- ྑ͍Πϯλʔωοτମݧͷఏڙ- ΑΓଟ͍ʮػձʯͷग़- Πϯϑϥઃඋͷ࠷దԽ- ==> ͭ·ΓθχʂʂʂʂʂʂͳͥύϑΥʔϚϯεΛٻ͢Δͷ͔
- ྑ͍Πϯλʔωοτମݧͷఏڙ- ΑΓଟ͍ʮػձʯͷग़- Πϯϑϥઃඋͷ࠷దԽ- => ͭ·ΓθχʂʂʂʂʂʂͳͥύϑΥʔϚϯεΛٻ͢Δͷ͔
ͭ·Γθχʂʂʂʂʂ
ύϑΥʔϚϯε͍ͤ͢͞ઃܭʁ
- ΞϧΰϦζϜ- σʔλߏ- (ϋʔυΣΞ)ύϑΥʔϚϯε͍ͤ͢͞ઃܭ (Ұྫ)- ϑΝϯΞτ- ΩϡʔΠϯά- Ωϟογϡ ɹ- όονਨࢦ ਫฏࢦͦͷଞ
ਨࢦͷઃܭ
- దͳΞϧΰϦζϜͷద༻- దͳσʔλߏͷద༻- සग़) ୳ࡧɼιʔτͳͲ- ͳΜͰ͔ΜͰϋϯϚʔΛͬͯͩΊ ਨࢦͷઃܭ
- ΞϧΰϦζϜσʔλߏখ͍͞ύʔπ- ଞͷઃܭख๏ͱͷΈ߹Θ͕ͤൺֱత༰қ- => ͕໌֬Ͱ͋Δ͜ͱʹڌΓͦ͏- ࠜຊతͳύϑΥʔϚϯεվળΛਤΔͳΒ͜͜ʂਨࢦͷઃܭ
- ʮҰ൪͍͍ϚγϯΛཔΉʯ- ϋʔυΣΞઃܭͷਐาʹཔΔʂʂʂ- ࠓճͷͱҰؔͳ͍Ͱ͢- ͱ͍͑ϋʔυΣΞͷਐาʹΑͬͯ ιϑτΣΞઃܭͷٕ๏͕มΘΔ͜ͱ͋Γͦ͏ਨࢦͷઃܭ (൪֎)
ਫฏࢦͷઃܭ
- ϑΝϯΞτ- ෳͷϓϩηεɾϚγϯͰฒߦॲཧ- ෳͷϓϩηεɾϚγϯͰฒྻॲཧ (ڠௐॲཧ)- (Reactive...?)- ϑΝϯΠϯ͕ཁΔ (߹͕͋Δ)ਫฏࢦͷઃܭ
- ΩϡʔΠϯά- δϣϒΩϡʔͰޙճ͠େ࡞ઓ (™@nekokak)- ཁόοϑΝϨΠϠʔʹॲཧΛ٧ΊࠐΉ- ϫʔΧʔ (૬) ͕ॲཧΛ͚ෛ͏- εϩοτϦϯά͕͍͢͠ਫฏࢦͷઃܭqueue (buffer)
- ΩϡʔΠϯά- ҎԼΛຬ͢ΔڥͰ͋ΕຊʹޮՌత- ϦΞϧλΠϜੑ͕ٻΊΒΕͳ͍- Ԇ͕ڐ༰͞ΕΔਫฏࢦͷઃܭqueue (buffer)
- (ଟ͘ͷ߹) ඇಉظॲཧ͔Βಀ͛ΒΕͳ͍- ඇಉظॲཧ͕ϏδωεϩδοΫʹ ͢ΜͳΓ࣮͞ΕΔ͜ͱͦ͏ଟ͘ͳ͍- ϓϩτίϧελοΫͷ࣮Ͱ͋Δ͔ਫฏࢦͷઃܭ
- ඇಉظͰಈ͘Α͏ʹ࣮͢Δඞཁ͕ग़ͯ͘Δ- ྫ- ॱংੑʹڍಈΛࢧ͞Εͳ͍- ႈੑΛ୲อ࣮ͯ͢͠Δ- ײʹ͢Δ߹͕ଟ͍……ਫฏࢦͷઃܭ
- ύϑΥʔϚϯεͷͨΊͷ߹͕ϏδωευϝΠϯͷ ઃܭΛΊ͕ͪ- ҙਂ͘ઃܭ͢Δͱ͏·͘ಇ͘߹͋Δ (ޙड़)- (ʮӡ͕ྑ͚Εʯ͔͠Εͳ͍)- ͏͔ͬΓૉʹ࣮͢Δͱ……ᄾݺਫฏࢦͷઃܭ
- ࡶଟͳۤ͠ΈΛݺͼ͕ͪ- ϨʔείϯσΟγϣϯ- ϦτϥΠ- εςʔτͷෆ߹- ͳͲͳͲ……- Ref: ࢄΩϡʔͱ͍͏໊ͷۤ͠Έ - Software Transactional Memo http://kumagi.hatenablog.com/entry/queue_struggleਫฏࢦͷઃܭ
- εέʔϧ͢Δʢ͍͢͠ʣʂʂ- ͔͠͠τϨʔυΦϑଟ͍- ͦΕͰಋೖ͢Δ͔Ͳ͏͔ͷίετஅʢޙड़ʣਫฏࢦͷઃܭ
- FaaSʹΑΔύϥμΠϜͷมԽ- ԋࢉϦιʔεΛΦϯσϚϯυͰ҆͑͘ΔΑ͏ʹͳͬͨ- FunctionʹॲཧΛҕৡͯ͠͠·͏- Firebaseͱ͔Ͱׂͱਪ͞ΕΔख๏- ʮͱΓ͋͑ͣδϣϒΩϡʔʹೖΕ͓͍ͯͯ͋ͱͰॲཧʯ- ΊͬͪΌΓ͘͢ͳͬͨ- ୯Ұͷݪଇ (SRP) ͕ൺֱతຬͨ͞Ε͘͢ͳͬͨҹ- (ίϯϙʔωϯτͷϝϯςίετԼ͕Δ)ਫฏࢦͷઃܭ (൪֎?)
SONOTA
- όον- ͋Β͔͡ΊίϯςϯπΛΓΓੜ ͓͍ͯͯ͠ΞϓϦͦΕΛฦ٫͢Δ͚ͩͱ͔- αϚϦςʔϒϧͱ͔……- ͜Εଈ࣌ੑͱͷ݉Ͷ߹͍ͷʹͳΔͦͷଞ
- Ωϟογϡ- खͬऔΓૣ͍ͥʢةݥࢥʣ- YAPC::Kansai 2017 OSAKAͰ͠·ͨ͠- https://speakerdeck.com/moznion/pattern-and-strategy-of-web-application-caching- (↑Ͱ͍ͯ͠ͳ͍ͱͯ͠ϚςϏϡʔ͕͋Γͦ͏)ͦͷଞ
- Ωϟογϡόονຊ࣭త͔Ͳ͏͔- ଟ͘ͷ߹ຊ࣭తͰͳ͍……ʁͦͷଞ
- ຊ࣭ͱͳʹ͔……ʁ- => ϏδωευϝΠϯɾϩδοΫͷ៉ྷ͞- => θχʂʂʂʂʂʂͦͷଞ
- ຊ࣭ͱͳʹ͔……ʁ- => ઃܭͷ៉ྷ͞- => θχʂʂʂʂʂʂͦͷଞ
- ຊ࣭ͱͳʹ͔……ʁ- => ઃܭͷ៉ྷ͞ => θχʂʂʂʂʂʂͦͷଞ
- ͔͠͠- ςΫχΧϧͳ߹͕ιϑτΣΞઃܭʹٴ΅͢Өڹେ͖͍- ߹ ∈ ϋʔυΣΞɾϛυϧΣΞ- ςΫχΧϧͳղܾख๏ͷ҆қͳಋೖʹΑͬͯ ΧΦεʹ͔͍ͬͯ͘Մೳੑߴ·Δ- υϝΠϯͷ࣋ͭϐϡΞ͕ࣦ͞ΘΕΔ- ઃܭ͕ΊΒΕ͕ͪͦͷଞ
ઃܭ͕ΊΒΕΔʁ
- ઃܭ͕ΊΒΕΔ- => ڍಈ͕Θ͔Γʹ͘͘ͳΔ (ίʔυͷಡΈ͚ͩ͢͞Ͱͳ͍)- => मਖ਼ίετ͕ߴ͘ͳΔ- => ϝϯςίετ͕ߴ͘ͳΔ- => ઃܭ͕ΊΒΕ͍ͯΔ͜ͱʹؾͮ͘……ઃܭ͕ΊΒΕͯԿ͕ѱ͍ʁ
ʮίετʯ
- ৽ͨʹػೳΛ࡞Δίετ- ίʔυͷϝϯςφϯείετ- Πϯϑϥͷϝϯςφϯείετ- => ιϑτΣΞઃܭ͜ΕΒʹӨڹΛٴ΅͢- => ઃܭίετͱͷઓ͍ίετ
- ίετͷ࣠- ίϯϐϡʔςΟϯάͷʹΑͬͯϖΠ͢ΔྖҬ- ઃܭͷྑ͞ʹΑͬͯϖΠ͢ΔྖҬ- ަ͢Δ߹͋Ε૬͢Δ߹૬͢Δ߹͋Δ- όϥϯε͕ॏཁ- ྑ͍ઃܭͷ݅ͷҰͭ: ߹ҙ͕औΕ͍ͯΔ- => ίετͱ߹ҙΛऔΔඞཁ͕͋Δ- ʮσϕϩούͷੜ࢈ੑʯʹݶఆͨ͠Ͱͳ͍ίετ
υϝΠϯࣝͱύϑΥʔϚϯε
- υϝΠϯʹର͢Δ͕ࣝΓͳ͍߹- ݟҧ͍ͷ࣮ɾઃܭΛ͕ͪ͠- ෆదͳσʔλߏΛ࠾༻ͯ͠͠·ͬͨΓ……- ྑ͍ύϑΥʔϚϯεʹυϝΠϯʹର͢Δࣝɾཧղ͕ඞཁʮυϝΠϯࣝͷཧղʯͱύϑΥʔϚϯε
࣮ࡍͲ͏ઃܭ͢Εྑ͍ͷ͔……
ͷʹΑΔ
͋͘·Ͱݸਓͷܦݧͷͱͯ͠ฉ͍͍ͯͩ͘͞
- ૉʹϞσϦϯάͯ͠࡞ͬͨ΄͏͕ྑ͍- ଟ͘ͷ߹࣮༻ʹ͑͏ΔͰಈ͘- ͪΌΜͱϞσϦϯά͞Ε͍ͯΔ- ࠷ݶৗࣝతͳઃܭɾ࣮͕͞Ε͍ͯΕ……- ʮඒ͍͠ͷۭؾ߅͕খ͍͞ʯͷਫ਼ਆ- ࣮ࡍͦΜͳ߹ྑ͘ͳ͍ͷ͕ͩ……- ࠔͬͨΒͬͪ͜ʹ͓ͯ͘͠ύϑΥʔϚϯεͱઃܭࢦ
- ͔͋͠͠ΔʢϦϦʔεॳ͔……ʣΛڥʹ໓͢Δ͔- ͱ͍͏࣌ʹύϑΥʔϚϯεΛਅ໘ʹߟ͑Δ͖- ཱͪฦͬͯʮྑ͍ઃܭʯͱ- ΞδϦςΟ- ॊೈੑ- ྑ͍ઃܭ => ࠷దԽͷ༨͕͋ΔͣύϑΥʔϚϯεͱઃܭࢦ
ྫ
௨͢ΔϢʔβ͕ଟ͗͢Δέʔε௨Λ࡞ͬͯૹΔ෦Ͱ٧·Δ͔ʜʜ
ૉʹϑΝϯΞτ௨࡞Δ෦QVTIૹΔ෦ͦͷϓϩηεɾεϨουͰͬͯ͠·͏
ߴසͰૹΒΕΔͱࢮΜͰ͠·͍·͢ʂΈ͍ͨͳ߹
όοϑΝʹΩϡʔΠϯάϫʔΧʔͷͰεϩοτϦϯά͍ͭͰʹ431
࣮͜͜ͰڥքΛ͚ΔͱεοΩϦ͢Δʁ
@startumlactor Userparticipant Commentparticipant WatchingUserparticipant Queueparticipant Worker1participant WorkerNparticipant Notificationparticipant PushNotificationGatewayWorker1 -> Queue : subscribeWorkerN -> Queue : subscribeUser -> Comment : postCommentComment -> WatchingUser : fetchWatchingUserComment -> Comment : buildNotificationBodyComment -> Queue : enqueueNotificationPayloadgroup publishing as async until queue is emptyQueue -> Worker1 : publishWorker1 -> Notification : createNotification -> PushNotificationGateway : sendNotificationQueue -> WorkerN : publishWorkerN -> Notification : createNotification -> PushNotificationGateway : sendNotificationend@enduml
@startumlactor Userparticipant Commentparticipant WatchingUserparticipant Queueparticipant Worker1participant WorkerNparticipant Notificationparticipant PushNotificationGatewayWorker1 -> Queue : subscribeWorkerN -> Queue : subscribeUser -> Comment : postCommentComment -> WatchingUser : fetchWatchingUserComment -> Comment : buildNotificationBodyComment -> Queue : enqueueNotificationPayloadgroup publishing as async until queue is emptyQueue -> Worker1 : publishWorker1 -> Notification : createNotification -> PushNotificationGateway : sendNotificationQueue -> WorkerN : publishWorkerN -> Notification : createNotification -> PushNotificationGateway : sendNotificationend@enduml/PUJpDBUJPOΛ࡞Δ෦͝ͱΩϡʔΠϯάͯ͠͠·͏ϫʔΧʔ͕͍͍ײ͡ʹॲཧ
Notification͝ͱΩϡʔΠϯά͢ΔϞνϕʔγϣϯ- ଈ࣌ੑ͕ͳͯ͘Αͦ͞͏- Commentdispatchʹઐ೦Ͱ͖Δ- rate limitͱ͔Λߟ͑Δඞཁ͕ͳ͘ͳΔ- ୯ҰͷίϯϙʔωϯτΛݟͨ࣌ʹγϯϓϧ
Notification͝ͱΩϡʔΠϯά͢Δݒ೦- ෦͕૿͑Δͱෳࡶੑ͕૿͢- ϛΫϩͩͱγϯϓϧ͕ͩɼϚΫϩͩͱෳࡶʹͳͬͯͳ͍͔- Worker͕ʮ୭͔ΒૹΒΕ͖ͯͨδϣϒʯ͔͓ͬͯ͘ඞཁ͕ ͋ΔΜ͡Όͳ͍͔ʁ- => ͜ΕΩϡʔΛΘ͚Εྑ͍- => ಛఆͷΩϡʔʹಛఆͷ୯ػೳWorkerΛඥ͚Δ- ΩϡʔΛϓϩτίϧͷΑ͏ʹऔΓѻ͏
ͷʹΑΔ(ϘτϧωοΫʹΑΔ)ߟ͍͖͑ͯ·͠ΐ͏
- ૣ͗͢Δ࠷దԽࡑͰ͋Δ- ύϑΥʔϚϯεͷ߹υϝΠϯΛΊ͕ͪ- ·ͣυϝΠϯʹدΓఴͬͨઃܭ͕ྑ͍- ʮඒ͍͠ͷۭؾ߅͕গͳ͍ʯ- ͔͠͠࠷దԽͷ༨Λ͢͜ͱॏཁ- ʮ࠷దԽͷ༨͕͋Δઃܭʯ͕ୈҰஈ֊ͱͯ͠ͷྑ͍ઃܭͰͳ͍͔ύϑΥʔϚϯεͱઃܭࢦ
Q?