Slide 1

Slide 1 text

ࣄۀͷεέʔϧΞ΢τΛࢧ͑Δ PHPͰ࡞Δ෼ࢄΞʔΩςΫνϟ Yuuki Takezawa / ytake

Slide 2

Slide 2 text

Pro f i le • ஛ᖒ ༗و / ytake • ελʔϑΣεςΟόϧגࣜձࣾ • PHP, Hack, Go, Scala • Apache Hadoop, Apache Spark, Apache Kafka 
 • twitter https://twitter.com/ex_takezawa • facebook https://www.facebook.com/yuuki.takezawa • github https://github.com/ytake

Slide 3

Slide 3 text

ελʔϑΣεςΟόϧגࣜձࣾ

Slide 4

Slide 4 text

ͦΜͳελʔϑΣεςΟόϧͰ͸ ΤϯδχΞืूதʂʂʂ

Slide 5

Slide 5 text

Caution • ࠓճͷ಺༰͸શͯͷΞϓϦέʔγϣϯͰ 
 ద༻Ͱ͖Δ΋ͷͰ͸͋Γ·ͤΜ • ࣮ࡍʹຊਓ͕࠾༻͍ͯ͠Δ΋ͷ 
 ϕʔεͷ಺༰Ͱ͢

Slide 6

Slide 6 text

Agenda • ΞϓϦέʔγϣϯͷ੒௕ͱ 
 λʔχϯάϙΠϯτ 
 • ղܾ͢ΔͨΊͷ஌ࣝ • ෼ࢄτϥϯβΫγϣϯରࡦ

Slide 7

Slide 7 text

Ϗδωεͷ੒௕ͱ૊৫

Slide 8

Slide 8 text

খ͞ͳνʔϜ • σʔλϕʔεઃܭ + ORM etc 
 ϑϨʔϜϫʔΫͰߏங͞ΕΔ 
 ΞϓϦέʔγϣϯ 
 • গਓ਺ͷ։ൃऀͰߏ੒͞ΕΔ։ൃ૊৫ 


Slide 9

Slide 9 text

ෳ਺ͷνʔϜ • ૿͑ΔΞϓϦέʔγϣϯػೳ 
 • ։ൃνʔϜͷ૿һ 
 εΩϧ͸༷ʑ

Slide 10

Slide 10 text

ΞϓϦέʔγϣϯͱσʔλϕʔε • ORMͰN+1͕૿͑Δέʔε 
 ൃߦͨ͠SQL͸ 
 ΞϓϦέʔγϣϯʹ߹͍ͬͯΔ͔ʁ • ϝϞϦɺCPUͳͲͷ૿ڧͰ৐Γ੾Δ 
 ໰୊͕ޙճ͠ʹͳΔ͜ͱ΋

Slide 11

Slide 11 text

΍ͬͯ͠·͍͕ͪͳରԠ • σʔλऔಘ؆ུԽͷͨΊͷ 
 σʔλϕʔεઃܭ(;͑Δඇਖ਼نԽ) 
 • ͱΓ͋͑ͣϦετͰશ෦औಘ 
 ͦΕ͔Β1ϨίʔυͣͭৄࡉΛऔಘ͠Α͏

Slide 12

Slide 12 text

ΞϓϦέʔγϣϯͱσʔλϕʔε • SELECT * FROM articles; 
 SELECT * FROM users WHERE user_id = ?; 
 • ͜Ε͕΋͠10000݅औಘͰ 
 ൃߦ͞Ε͍ͯͨΒʁ 
 • ORM͕ѱ͍ͷͰ͸ͳ͘ 
 ద੾ʹར༻Ͱ͖͍ͯͳ͍έʔε

Slide 13

Slide 13 text

େ͖͘νʔϜͱࣄۀͷ੒௕ • ૿͑ଓ͚ΔΞϓϦέʔγϣϯػೳ 
 • ։ൃνʔϜͷڊେԽ 
 ෳ਺ͷνʔϜߏ੒ͱ 
 ෳ਺ͷεςʔΫϗϧμ

Slide 14

Slide 14 text

ෆ҆ఆͳΞϓϦέʔγϣϯ΁ • Ϩίʔυ૿Ճɾ࣮૷ίʔυ૿ՃʹΑΔ 
 ͞ΒͳΔύϑΥʔϚϯε௿Լ • ͍͡ΊΒΕଓ͚Δσʔλϕʔε • ͋ͪͪ͜Ͱى͜Γ࢝ΊΔো֐

Slide 15

Slide 15 text

ࠔ೉ͳཁ݅ͷ࣮ݱ • ϦΫΤετ͝ͱʹϨεϙϯεΛ૊Έཱͯ 
 ΞϓϦέʔγϣϯͷύϑΥʔϚϯεѱԽ 
 • ਖ਼نԽͨ͠͸͍͍΋ͷͷɺཁ݅ʹ߹Θͤ ͨσʔλऔಘίετ૿ 


Slide 16

Slide 16 text

΍ͬͯ͠·͍͕ͪͳରԠ • ݪҼ͸Θ͔Γ·ͤΜ͕஗͘ͳ͖ͬͯͨͷͰ Ωϟογϡ͠·͢ 
 -> ෳࡶԽ͢ΔΩϟογϡαʔόʔ • ݪҼ͸Θ͔Γ·ͤΜ͕஗͘ͳ͖ͬͯͨͷͰ Ωϟογϡ͠·͢ 
 -> ΩϟογϡαʔόʹՃ͑ͯCDN΋௥Ճ

Slide 17

Slide 17 text

΋͏खஈ͕ͳ͍ɾɾɾʂ

Slide 18

Slide 18 text

ڊେͳΞϓϦέʔγϣϯ΁

Slide 19

Slide 19 text

σʔλॲཧͷෳࡶԽ Ϣʔβʔ৘ใมߋ Ϣʔβʔ৘ใ࡟আ Ϣʔβʔ৘ใ͕ݟ͔ͭΒͳ͍ͨΊ 
 σʔλॲཧ͝ͱʹ"1*ΞΫηε ͋ͦ͜ͱͦ͜Ͱ৘ใ͕ҧ͏ʂ 
 Ͳͷσʔλ͕ຊ෺ʁ શͯͷΞϓϦέʔγϣϯ͔Β 
 Ωϟογϡͳ͠ͰΞΫηε 
 ৗʹߴෛՙঢ়ଶʹ

Slide 20

Slide 20 text

ࢭΊΒΕͳ͍ ϏδωεͷՃ଎

Slide 21

Slide 21 text

ฐ֐ • ϦϦʔε༏ઌͷͨΊɺ 
 ܧ͗଍͠ͷΞϓϦέʔγϣϯ 
 • εςʔΫϗϧμ૿Ճʹ൐͏ 
 ΞϓϦέʔγϣϯͷෳࡶԽ • খதن໛ͷΞϓϦέʔγϣϯ࣌୅ͷ 
 ઃܭͱ࣮૷༝དྷͷෆ۩߹͕૿Ճ

Slide 22

Slide 22 text

σʔλઃܭ༝དྷͷ໰୊ • େྔσʔλͷϑϧεΩϟϯ 
 • INDEXෆ଍ͷͨΊͷύϑΥʔϚϯε௿Լ • γϯϓϧͳߏ੒ނͷػೳ௥Ճ࣌ͷ 
 ΫΤϦෳࡶԽ

Slide 23

Slide 23 text

࣮૷ίʔυ༝དྷͷฐ֐ • ػೳ௥ՃͷͨΊͷௐࠪʹ2ϲ݄ 
 • ͞·͟·ͳཁҼͷੵΈॏͶʹΑΓ 
 བྷΈ߹ͬͨίʔυͰϞνϕʔγϣϯμ΢ϯ • ͕͔͔࣌ؒͬͯ͠·͏͕ނɺ 
 ϏδωενʔϜʹ·ͣҰݴ 
 ʮ͕͔͔࣌ؒΔͷͰͰ͖·ͤΜʯ

Slide 24

Slide 24 text

ͦͷ݁Ռ • Ϗδωεͷ੒௕ػձଛࣦ • γϡϦϯΫ࢝͠ΊΔࣄۀ • ଞࣾʹෛ͚ͯ͠·͏ࣄۀ • څ༩্͕͕Βͳ͍ɾɾ

Slide 25

Slide 25 text

͜ΕͰ͸ࣄۀ͕εέʔϧ͠ͳ͍ʂ

Slide 26

Slide 26 text

ࣄۀ͸੒௕͢Δ΋ͷ • ΞϓϦέʔγϣϯ͸ϦϦʔε͔ͯ͠Β੒௕ • ૝ఆ֎ͷ੒௕Λ਱͛Δ 
 WebΞϓϦέʔγϣϯ • ͞·͟·ͳϏδωεͷՄೳੑΛߟྀͨ͠ 
 σʔλઃܭ

Slide 27

Slide 27 text

੒௕Λࢧ͑Δʹ͸ʁ • ఆظతͳσʔλϕʔεϦϑΝΫλϦϯάɺ ΞϓϦέʔγϣϯͷϦϑΝΫλϦϯά 
 ͕࣮ࢪͰ͖Δ͔ • ͋Γͱ͋ΒΏΔՄೳੑΛ૝ఆͨ͠σʔλ ઃܭ͸ෆՄೳ 27

Slide 28

Slide 28 text

ΞϓϦέʔγϣϯͰى͜Δ໰୊ • ਖ਼نԽ͞Εͨςʔϒϧͱ 
 ඇਖ਼نԽςʔϒϧͷઓ͍ • ෳࡶԽ͢Δॻ͖ࠐΈॲཧͱଟൃ͢ΔN+1 • σʔλϞσϧͱυϝΠϯϞσϧ͕ҟͳΔ

Slide 29

Slide 29 text

Α͋͘ΔN+1 • ঎඼Λऔಘ͠ ஍ҬɾΩονϯ৘ใΛऔಘ 
 • ΠΠωɺΫνίϛ਺΋औಘ͠ͳ͚Ε͹...

Slide 30

Slide 30 text

public function run(): \Generato r { foreach ($repository->findAll() as $row) { yield new ReadProductTransfer ( $row , $this->kitchenRepository->find($row->getId()) , $this->areaRepository->find($row->getId() ) ) ; } }

Slide 31

Slide 31 text

͜Μͳςʔϒϧઃܭͨ͠هԱ͸͋Γ·ͤΜ͔ʁ • UIΛߏ੒͢Δཁૉ͕औಘ͠΍͍͢ 
 ςʔϒϧઃܭ • JOIN͢Δͱ஗͘ͳΔʁ 
 ͳΒ͹௒ϫΠυΧϥϜઃܭͩ

Slide 32

Slide 32 text

͜Μͳςʔϒϧ͋Γ·ͤΜ͔ʁ • ͳʹ͔ͷεςʔλεΛฦ͢ʹ͸ 
 ͋ͷΧϥϜͱ͜ͷΧϥϜͱ͋ΕΛɾɾɾɻ • ϏδωεϩδοΫ͕ςʔϒϧʹ͋Δ • ΧϥϜ໊ͱ༻్͕શ͘ผ

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

ॻ͖ࠐΈଟ਺ͷΞϓϦέʔγϣϯ • ॻ͖ࠐΈʹڧ͘ɺ 
 εέʔϧ͕༰қͳσʔλϕʔε΁ 
 Cassandra, DynamoDB etc

Slide 40

Slide 40 text

ಡΈࠐΈଟ਺ͷΞϓϦέʔγϣϯ • RDBMSͷΈͰ΋े෼ 
 • LIKEݕࡧͳͲ͸Elasticsearch, Solr΁

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

ڥք෇͚ΒΕͨίϯςΩετ QSPEVDU/BNF 
 LJUDIFO/BNF QSJDF TBMFT1FSJPE 


Slide 46

Slide 46 text

ڥք෇͚ΒΕͨίϯςΩετ ঎඼͸ 
 ঎඼໊ 
 ݸ਺ ഑ૹઌͰ͢

Slide 47

Slide 47 text

ڥք෇͚ΒΕͨίϯςΩετ QSPEVDU/BNF 
 LJUDIFO/BNF QSJDF TBMFT1FSJPE RVBOUJUZ TJQQJOH"EESFTT 


Slide 48

Slide 48 text

ڥք෇͚ΒΕͨίϯςΩετ ঎඼͸ 
 ঎඼໊ 
 ஋ஈͰ͢

Slide 49

Slide 49 text

ڥք෇͚ΒΕͨίϯςΩετ QSPEVDU/BNF 
 LJUDIFO/BNF QSJDF TBMFT1FSJPE RVBOUJUZ TJQQJOH"EESFTT 


Slide 50

Slide 50 text

ڥք෇͚ΒΕͨίϯςΩετ • ঎඼ͱ͍͏ݴ༿Ͱ΋಺༰͕ҟͳΔ • ΞϓϦέʔγϣϯ಺Ͱ΋ଟʑ • ڞ௨ԽͰ͖Δ΋ͷͰ͸ͳ͍

Slide 51

Slide 51 text

ڥք෇͚ΒΕͨίϯςΩετ • ྫ͑͹ɺ঎඼Λࢦ͢ݴ༿ͱ 
 DB্ͷproductsςʔϒϧ͸Ұக͠ͳ͍ έʔε͕ଟ͍ 
 • ͲͪΒ͔ʹ߹ΘͤΒΕΔ΋ͷͰ͸ͳ͍ͱ 
 ೝࣝ͢Δ͜ͱ

Slide 52

Slide 52 text

ॻ͖ࠐΈͱಡΈࠐΈΛ ෼཭ͯ͠Έͯ͸Ͳ͏͔

Slide 53

Slide 53 text

CQRS

Slide 54

Slide 54 text

CQRS • ॻ͖ࠐΈϞσϧͱಡΈࠐΈϞσϧΛִ཭ • υϝΠϯϞσϧͷ෼཭͚ͩͰͳ͘ 
 σʔλετΞ͢Β΋෺ཧతʹผ෺ʹ෼཭Մೳ 
 ؔ৺ࣄͷ෼཭Λపఈ 
 • DDDʹ͓͚ΔಡΈࠐΈͱॻ͖ࠐΈͷࠩ෼Λղܾ͢Δ ύλʔϯ

Slide 55

Slide 55 text

CQRS

Slide 56

Slide 56 text

CQRS ͳΜΒ͔ͷม׵ॲཧΛ௨ͯ͡ 
 3FBEͷσʔλΛߋ৽

Slide 57

Slide 57 text

CQRS • CommandͱReadʹڥքઢ͕͋Δ • CommandͱRead͸ 
 ಉ͡ϦϙδτϦɺϢʔεέʔεͱ͠ͳ͍ • ಉ͡ςʔϒϧ͸ࢀর͠ͳ͍

Slide 58

Slide 58 text

σʔλϕʔε΋෼཭Ͱ͖Ε͹ʁ

Slide 59

Slide 59 text

େ͖͘ͳͬͨαʔϏεͰղܾ͞ΕΔ໰୊ • ෳࡶԽ͍ͯͨ͠ಡΈࠐΈϞσϧͷ 
 ύϑΥʔϚϯεΛվળ • ಡΈࠐΈϞσϧʹؔ͢Δ 
 εέʔϥϏϦςΟ޲্

Slide 60

Slide 60 text

஫ҙ఺ • CQRS͸ಛఆͷػೳʹͷΈద༻Մೳ 
 ΞϓϦέʔγϣϯશͯʹద༻͢Δ΋ͷͰ͸ ͳ͍ • ॻ͖ࠐΈϞσϧͱಡΈࠐΈϞσϧͷࠩ෼͕Α ͘Θ͔Βͳ͍ 
 -> ཁ݅ͷ෼ੳΛ·ͣ͠·͠ΐ͏

Slide 61

Slide 61 text

CQRSʹΑͬͯղܾ͞ΕΔ໰୊ • ॻ͖ࠐΈϞσϧ͸CUDΛ୲౰͠ɺ 
 υϝΠϯϞσϧͷ࣮૷Λߦ͏ • ಡΈࠐΈϞσϧͷ୯७Խ 
 DTOͷΈ΁

Slide 62

Slide 62 text

CQRSʹΑͬͯղܾ͞ΕΔ໰୊ • ಡΈࠐΈϞσϧ͸ɺཁ݅ʹ߹Θͤͨ 
 ͞·͟·ͳσʔλϕʔεΛར༻͠ 
 ಡΈࠐΈϞσϧͷύϑΥʔϚϯεΛվળ • ॻ͖ࠐΈϞσϧ΋ಉ༷ʹ 
 ཁ݅ʹ߹ΘͤͨσʔλϕʔεΛར༻

Slide 63

Slide 63 text

ྫ • ϥϯΩϯάॲཧ 
 ͋Δظؒ·ͰͷσʔλΛ࢖ͬͨ 
 ϥϯΩϯάΛੜ੒ • ੥ٻσʔλͷੜ੒ 
 
 ͳͲ

Slide 64

Slide 64 text

ϥϯΩϯά࡞੒໰୊ • ϦΫΤετຖʹϥϯΩϯά࡞੒ 
 -> εέʔϧ͠ͳ͍ 
 • ྫ͑͹1ԯલޙͷશσʔλʹରͯ͠ 
 ౎౓ΫΤϦΛ౤͛ͯऔಘ͢Δ

Slide 65

Slide 65 text

঎඼ͷϥϯΩϯάྫ • ྫ͑͹ 
 ঎඼ͦͷ΋ͷΛѻ͏Ϟσϧͱ 
 ϥϯΩϯάΛߏ੒͢Δ঎඼ͷϞσϧΛ 
 ڞ௨Խͯ͠͠·͏

Slide 66

Slide 66 text

঎඼ͷϥϯΩϯάྫ • ྫ͑͹ 
 ঎඼ͦͷ΋ͷΛѻ͏Ϟσϧͱ 
 ϥϯΩϯάΛߏ੒͢Δ঎඼ͷϞσϧΛ 
 ڞ௨Խͯ͠͠·͏ 
 -> ౰વμϝ

Slide 67

Slide 67 text

ϥϯΩϯά࡞੒໰୊ղܾ • લ೔·ͰͷσʔλΛ࢖ͬͯ 
 ϥϯΩϯάΛ࡞Δཁ݅ͷ৔߹ 
 ʢཁ݅ʹΑͬͯมΘΓ·͢ʣ • σʔλͷߏ੒ཁૉ͸ෆมͰ 
 ౎౓ੜ੒͢Δඞཁ͸ͳ͍ 
 ࣄલʹσʔλΛੜ੒͠ɺϦʔυΛ୲౰͢Δσʔλ ϕʔεʹอ࣋

Slide 68

Slide 68 text

ϥϯΩϯά࡞੒໰୊ղܾ • ϥϯΩϯάʹ͍ͭͯͷ஌͕ࣝͳ͘ͱ΋ 
 ಘΒΕΔ͜ͱ͕Ͱ͖Δ • ElasticsearchͷΤΠϦΞεͳͲΛ 
 ར༻͢Δ͜ͱͰ༰қʹରԠՄೳ

Slide 69

Slide 69 text

ϥϯΩϯά࡞੒໰୊ղܾ • ϥϯΩϯάੜ੒ʹෆ۩߹͕͋ͬͨ৔߹ɺ 
 ࠶౓ੜ੒͢Ε͹ྑ͍ • ো֐͕͋ͬͯ΋࠶࣮ߦ͢Ε͹Α͍

Slide 70

Slide 70 text

CQRS ར఺

Slide 71

Slide 71 text

CQRS ར఺ • ଱ো֐ੑͷ޲্ • εέʔϥϏϦςΟ • ޮ཰ͷྑ͍σʔλϕʔεͷબ୒ • పఈͨؔ͠৺ͷ෼཭

Slide 72

Slide 72 text

CQRS ܽ఺

Slide 73

Slide 73 text

CQRS ܽ఺ • ҰͭҰͭͷػೳ͸γϯϓϧ 
 ߏ੒͢Δཁૉ͕૿͑ΔͨΊશମͰݟΔͱ ෳࡶԽ 
 • ϨϓϦέʔγϣϯͷλΠϜϥά

Slide 74

Slide 74 text

ෳࡶԽ • CUDΞϓϦέʔγϣϯ 
 • RΞϓϦέʔγϣϯ • ಡΈࠐΈϞσϧߋ৽ΞϓϦέʔγϣϯ

Slide 75

Slide 75 text

ෳࡶԽ • ѻ͏σʔλϕʔε͕૿͑Ε͹ɺ 
 ͦΕͧΕͷσʔλϕʔεʹ߹Θͤͨ 
 ؅ཧɺӡ༻ํ๏͕ඞཁ • ։ൃ࣌ʹෳ਺ͷσʔλϕʔεͷ஌͕ࣝ 
 ඞਢ

Slide 76

Slide 76 text

ϨϓϦέʔγϣϯͷλΠϜϥά • γϯϓϧͳϥϯΩϯάͳͲ͸໰୊ͳ͠ 
 • ϦΞϧλΠϜੑ͕ཁٻ͞ΕΔॲཧ 
 ྫ) ঎඼͕ొ࿥͞ΕͨΒଈ 
 ݕࡧΫΤϦͰώοτͰ͖Δ༷ʹͯ͠ʂ

Slide 77

Slide 77 text

ϨϓϦέʔγϣϯͷλΠϜϥά • ͍͍ͶϘλϯΛԡͨ͠ΒΠϯΫϦϝϯτ/ σΫϦϝϯτͤͯ͞ɺ͍͍ͶॱͰιʔτ • ϝοηʔδ͕౤ߘ͞ΕͨΒɺ 
 ϑΥϩϫʔશһʹϦΞϧλΠϜͰ௨஌

Slide 78

Slide 78 text

CQRS͚ͩͰ͸ղܾ͕Ͱ͖ͳ͍ • DBͷτϦΨʔͳͲΛ༻͍ͯมߋΛݕ஌ 
 ҟͳΔσʔλϕʔεΛબ୒͢Δͱ 
 ରԠෆՄೳ • ϦʔυϞσϧߋ৽༻ϓϩηεΛ 
 ༻ҙ͠ͳ͚Ε͹ͳΒͳ͍ 
 ͕ɺมߋͷݕ஌͕͏·͘Ͱ͖ͳ͍

Slide 79

Slide 79 text

ྫ֎ • Debezium • DynamoDB streams • LinkedIn Databus 
 
 ͳͲ͸ॻ͖ࠐΈΛݕ஌ͯ͠௨஌Մೳ

Slide 80

Slide 80 text

CQRS͚ͩͰ͸ղܾ͕Ͱ͖ͳ͍ • ҟͳΔσʔλϕʔε΁ͷίϛοτ 
 • 2ϑΣʔζίϛοτରԠ͸೉͍ͨ͠Ί 
 ආ͚ͳ͚Ε͹ͳΒͳ͍

Slide 81

Slide 81 text

ϑϨʔϜϫʔΫͰղܾͰ͖Δ͡ΌΜʂ • ྫ͑͹Laravel 
 Queue͸ɺPHPͷΦϒδΣΫτΛ 
 γϦΞϥΠζ͠QueueʹಥͬࠐΜͩ෺ • पลγεςϜ͕PHPͩͱ͸ݶΒͳ͍

Slide 82

Slide 82 text

Event Sourcing

Slide 83

Slide 83 text

Event Sourcing • ΠϕϯτΛه࿥ͯ͠࠶ݱ͢Δύλʔϯ • ΠϕϯτΛΠϕϯτετΞʹอଘ͠ਅͷιʔεʹ • ه࿥͞ΕͨΠϕϯτ͔ΒΦϒδΣΫτΛ෮ݩ • Πϕϯτ͸ෆม

Slide 84

Slide 84 text

Event Sourcing • ಡΈࠐΈ͕ར༻͢Δσʔλϕʔε΁ͷ 
 ൓өʹඞਢ • ৴པͰ͖Δਅͷσʔλιʔεʹ 
 ΠϕϯτετΞʹσʔλ͕͋Ε͹ྑ͍

Slide 85

Slide 85 text

Message Brokerબఆ • PubSubͰشൃੑͷͳ͍΋ͷΛબ୒͢Δ • ϝοηʔδอ؅͕ՄೳͰɺ࠶ݱ͢Δ͜ͱ ͕Մೳͳ΋ͷΛ࠾༻͢Δͷ͕๬·͍͠ • εέʔϥϒϧͰ͋Δ͜ͱ

Slide 86

Slide 86 text

͓͢͢Ί͸ʁ • Message Broker͸εέʔϥϏϦςΟॏࢹ • ௚ۙͷΠϕϯτΛ͙͢ʹऔಘͰ͖Δ΋ͷ • ۤ࿑ͨ͘͠ͳ͚Ε͹Apache Kafka 
 (AWS MSK / Con f l uent ͳͲ)

Slide 87

Slide 87 text

Event Sourcing CQRS

Slide 88

Slide 88 text

CQRS

Slide 89

Slide 89 text

CQRS σʔλߋ৽͕ൃੜʂ 
 ৽͍͠σʔλૹΓ·͢Ͷ

Slide 90

Slide 90 text

ղܾͰ͖Δ໰୊

Slide 91

Slide 91 text

ෳࡶ͔ͭϋΠύϑΥʔϚϯεͳ 
 ݕࡧ

Slide 92

Slide 92 text

N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ εφοϓγϣοτతʹσʔλΛ 
 ॻ͖ࠐΈ 
 MBTUJOTFSU*%͕Ͳ͏ͯ͠΋࢖͍͍ͨ৔߹ͳͲ

Slide 93

Slide 93 text

N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ %#ॻ͖ࠐΈ׬ྃޙɺ ಛఆͷΠϕϯτΛൃߦ

Slide 94

Slide 94 text

N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ ಡΈࠐΈϞσϧߋ৽ϓϩηε͕ ΠϕϯτΛফඅ

Slide 95

Slide 95 text

N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ &MBTUJDTFBDI΁ॻ͖ࠐΈ 
 ಛఆͷϨίʔυͷΈॻ͖׵͑Δ 
 ྫ͑͹ϥΠΫ਺΍ɺίϝϯτ਺ͳͲ

Slide 96

Slide 96 text

N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ ಡΈࠐΈ͸γϯϓϧʹ 
 ΠϯσοΫεʹ໰͍߹ΘͤΔͷΈ 
 ෳࡶͳܭࢉॲཧ͸ߦΘͳ͍

Slide 97

Slide 97 text

ϝϦοτ • ॴҦεϚʔτUIύλʔϯΛ 
 ଞʹӨڹΛ༩͑Δ͜ͱͳ࣮͘ݱ • ॻ͖ࠐΈͰඞཁͱ͞ΕΔਖ਼نԽΛ่͢͜ͱͳ͘ 
 ରԠՄೳ • ಡΈࠐΈΛεέʔϧͤ͞΍͍͢

Slide 98

Slide 98 text

ϝϦοτ • ಡΈࠐΈϞσϧͷߋ৽ॲཧ΋ࢸͬͯ؆୯ 
 • ৔߹ʹΑͬͯ͸ϏδωεϩδοΫΛ࣮૷ ͢Δ͜ͱ΋͋ΓɺෳࡶʹͳΒͳ͍Α͏ʹ ஫ҙ͢Δ

Slide 99

Slide 99 text

஫ҙ • Ϩίʔυʹߋ৽ɺ 
 ࡟আ͕ൃੜ͢Δ৔߹ 
 μʔςΟϦʔυʹ஫ҙ

Slide 100

Slide 100 text

෼ࢄτϥϯβΫγϣϯ

Slide 101

Slide 101 text

෼ࢄτϥϯβΫγϣϯ • ಡΈࠐΈϞσϧߋ৽ϓϩηε͕ 
 ෳ਺ͷσʔλϕʔεʹ 
 ॻ͖ࠐ·ͳ͚Ε͹͍͚ͳ͍έʔε • 2ϑΣʔζίϛοτ͸ίετ͕ߴ͍

Slide 102

Slide 102 text

෼ࢄτϥϯβΫγϣϯ͸೉͘͠ɺෳࡶ • ෺ཧతʹҟͳΔσʔλϕʔεͰ 
 ॲཧ͕ࣦഊͨ͠৔߹ 
 • औΓফ͢ॲཧΛ૸Βͤͳ͚Ε͹ͳΒͳ͍ • NoSQL΍KafkaͳͲʹ͸ͳ͍

Slide 103

Slide 103 text

෼ࢄτϥϯβΫγϣϯΛ࢖Θͳ͍ • ҰͭͷϓϩηεͰ 
 ෳ਺σʔλϕʔε΁ॻ͖ࠐΉͷΛආ͚Δ • Ͳ͏ͯ͠΋ආ͚ΒΕͳ͍৔߹͸ 
 ϚΠΫϩαʔϏεΞʔΩςΫνϟͷ 
 τϥβΫγϣϯରࡦͷҰͭɺSagaΛར༻

Slide 104

Slide 104 text

ίϨΦάϥϑΟͷαʔΨ ঎඼ड஫ΠϕϯτΛൃߦ

Slide 105

Slide 105 text

ίϨΦάϥϑΟͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼ड஫ΠϕϯτΛফඅ 1&/%*/(ঢ়ଶͱ͢Δ

Slide 106

Slide 106 text

ίϨΦάϥϑΟͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼༻ҙΠϕϯτΛൃߦ

Slide 107

Slide 107 text

ίϨΦάϥϑΟͷαʔΨ ঎඼༻ҙΠϕϯτΛফඅ ΫϨδοτܾࡁΛ࣮ߦ

Slide 108

Slide 108 text

ίϨΦάϥϑΟͷαʔΨ ձܭαʔϏε͕ 
 ܾࡁ׬ྃΠϕϯτΛൃߦ

Slide 109

Slide 109 text

ίϨΦάϥϑΟͷαʔΨ ΩονϯαʔϏε͕ 
 ܾࡁ׬ྃΠϕϯτΛফඅ 
 ࠷ऴతͳΠϕϯτΛऔಘ͢Δ·Ͱ "8"*5*/(ঢ়ଶͱ͢Δ 


Slide 110

Slide 110 text

ίϨΦάϥϑΟͷαʔΨ ঎඼ड஫αʔϏε͕ 
 ܾࡁ׬ྃΠϕϯτΛফඅ 


Slide 111

Slide 111 text

ίϨΦάϥϑΟͷαʔΨ ঎඼ड஫αʔϏε͕ 
 ड஫Λਖ਼ৗऴྃͱݟ၏͠௨஌ 


Slide 112

Slide 112 text

ίϨΦάϥϑΟͷαʔΨ ड஫ਖ਼ৗऴྃΛফඅ͠ɺ Φʔμʔ௨ΓͷྉཧΛ։࢝

Slide 113

Slide 113 text

ίϨΦάϥϑΟͷαʔΨ ϝϦοτ • ର৅͕গͳ͘ɺγϯϓϧͳॲཧͷϑϩʔ ʹ࠷ద 
 • ॲཧͷ੹຿͕෼ࢄ͍ͯ͠ΔͨΊ 
 ୯Ұো֐఺ͳ͠

Slide 114

Slide 114 text

ίϨΦάϥϑΟͷαʔΨ σϝϦοτ • ෼ࢄ͍ͯ͠Δ͕ނʹΘ͔Γʹ͍͘ • ॥؀ґଘ • ݁߹ςετͷ೉қ౓͕ߴ͍ • ؔ܎͢ΔαʔϏεͷΠϕϯτ͸શͯαϒεΫ ϥΠϒ͢Δඞཁ͕͋Δ

Slide 115

Slide 115 text

ΦʔέετϨʔγϣϯͷαʔΨ ঎඼ड஫ΠϕϯτΛൃߦ

Slide 116

Slide 116 text

ΦʔέετϨʔγϣϯͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼ड஫ΠϕϯτΛফඅ 1&/%*/(ঢ়ଶͱ͢Δ

Slide 117

Slide 117 text

ΦʔέετϨʔγϣϯͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼༻ҙΠϕϯτΛൃߦ

Slide 118

Slide 118 text

ΦʔέετϨʔγϣϯͷαʔΨ ΦʔέετϨλʔͱͯ͠ 
 ঎඼༻ҙΠϕϯτΛফඅ

Slide 119

Slide 119 text

ΦʔέετϨʔγϣϯͷαʔΨ ձܭαʔϏεʹ ΫϨδοτܾࡁґཔΠϕϯτΛ ൃߦ

Slide 120

Slide 120 text

ΦʔέετϨʔγϣϯͷαʔΨ ΫϨδοτܾࡁґཔΠϕϯτΛ 
 ফඅ 
 ܾࡁΛߦ͏

Slide 121

Slide 121 text

ΦʔέετϨʔγϣϯͷαʔΨ ΫϨδοτܾࡁ׬ྃΠϕϯτΛ 
 ൃߦ

Slide 122

Slide 122 text

ΦʔέετϨʔγϣϯͷαʔΨ ΫϨδοτܾࡁ׬ྃΠϕϯτফඅ ΩονϯαʔϏεʹܾࡁ׬ྃΠϕ ϯτΛൃߦ

Slide 123

Slide 123 text

ΦʔέετϨʔγϣϯͷαʔΨ ϝϦοτ • ॥؀ґଘͳ͠ • ؔ܎͢ΔαʔϏεͷΠϕϯτΛαϒεΫ ϥΠϒ͢Δඞཁ͕ͳ͍ • ίϨΦάϥϑΟΑΓ΋εςʔλεΛ࣋ͨ ͳ͍ͨΊɺϩδοΫ͕୯७ʹ

Slide 124

Slide 124 text

ΦʔέετϨʔγϣϯͷαʔΨ ϝϦοτ • ΦʔέετϨʔλʹϏδωεϩδοΫ͕ 
 ूத͠΍͘͢ͳΔ 
 ίʔσΟωʔτ͚ͩΛߦ͏Α͏ʹ 
 ϏδωεϩδοΫΛഉআ͢Δඞཁ͋Γ • ϫʔΫϑϩʔܗʹͳΔͨΊɺ 
 ো֐఺ʹͳΔՄೳੑ͋Γ

Slide 125

Slide 125 text

αʔΨͷ஫ҙ఺ • ߋ৽σʔλͷ૕ࣦ • μʔςΟϦʔυ • ൓෮ෆೳಡΈऔΓ

Slide 126

Slide 126 text

αʔΨͷ஫ҙ఺ • ෼ࢄॲཧ͸Ԟ͕ਂ͘೉қ౓͕ߴ͍ • PHPͰ࣮ݱͤ͞Δͷ͸͓͢͢Ί͠·ͤΜ • ಘҙͳݴޠɺ࢓૊Έʹ೚ͤΑ͏

Slide 127

Slide 127 text

ES+CQRSͷ 
 ΤοηϯεΛऔΓೖΕΔ

Slide 128

Slide 128 text

ES+CQRSͷൃల • DDD޲͚ͷղܾύλʔϯͰ͸͋Δ͕ɺ 
 ۙ೥Ͱ͸ΤοηϯεΛऔΓೖΕͨ 
 LambdaɺKappaΞʔΩςΫνϟ͕͋Δ 
 (େن໛σʔλॲཧ޲͚ not Web App)

Slide 129

Slide 129 text

KappaΞʔΩςΫνϟ

Slide 130

Slide 130 text

KappaΞʔΩςΫνϟ

Slide 131

Slide 131 text

·ͱΊ

Slide 132

Slide 132 text

·ͱΊ • Ϗδωεʹؔ৺Λ࣋ͭ͜ͱ͕ୈҰ • ن໛ʹ߹Θͤͨσʔλઃܭ 
 ఆظతͳϦϑΝΫλϦϯά 
 ཁ݅ͷ෼ੳͰϏδωεΛࢧ͑Δ • దࡐదॴΛݟۃΊΔٕज़

Slide 133

Slide 133 text

ࣄۀΛࢧ͍͑ͯ͜͏