Slide 1

Slide 1 text

Event Sourcing CQRS For PHP Application yuuki takezawa phpcon fuk 2018

Slide 2

Slide 2 text

͸ͳ͢͜ͱ • Event • CQRS • Event Sourcing + CQRS • Event Sourcing / Message Broker • ࣮ྫ

Slide 3

Slide 3 text

͸ͳ͞ͳ͍͜ͱ • DDD • Lambda Architecture • Kappa Architecture • Apache Sparkʹ͍ͭͯ

Slide 4

Slide 4 text

DDDͱҰॹʹड़΂ΒΕΔ͜ͱ͕ଟ͍Ͱ͕͢ɺ େن໛ͳσʔλॲཧͰ΋׆༻Ͱ͖Δύλʔϯ

Slide 5

Slide 5 text

όονॲཧ͕ଟ͍ΞϓϦέʔγϣϯ΍ɺ ෳ਺ͷσʔλϕʔεؒͰ σʔλಉظΛ͢ΔΞϓϦέʔγϣϯʹ΋

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

Event / Application Side

Slide 8

Slide 8 text

Event? • Observerύλʔϯ • ʙͨ࣌͠ʹɺʙ͢Δ Λදݱ͢Δ • PHPͷ༷ʑͳΞϓϦέʔγϣϯͰར༻͞Ε͍ͯΔ • \SplObserver, SplSubject

Slide 9

Slide 9 text

Event / PHP • Symfony Event Dispatcher • Illuminate Events (Laravel) • Zend Event Manager • RxPHP • ReactPHP

Slide 10

Slide 10 text

Event / PHP • γεςϜ౎߹ͰऔΓೖΕΔέʔε΋ଟ͍ • Request͕དྷͨΒɺRouteΛىಈͤ͞Δ • ʙͷॲཧ͕׬ྃͨ͠Βɺϩάʹॻ͖ग़͢

Slide 11

Slide 11 text

public function __invoke( FulltextRequest $request ): RedirectResponse { // ొ࿥ॲཧޙʹevent try { $entity = new Entity(1, ‘testing’); $this->dispatcher->dispatch( new SinkConnect($this->usecase->run($entity)) ); } catch(\RuntimeException $e) { // Կ͔errorॲཧ } return $this->redirector->route('fulltext.index'); }

Slide 12

Slide 12 text

Domain Event

Slide 13

Slide 13 text

Event • υϝΠϯϞσϧ಺Ͱൃੜ͢Δग़དྷࣄ / υϝΠϯΠϕϯτ • ʙͨ࣌͠ʹɺʙ͢Δ Λදݱ͢Δ • υϝΠϯϞσϧΛލΔ΋ͷʹ஫໨͢Δ • ۀ຿తͳ؍఺͔ΒΠϕϯτͱͯ͠ѻ͏͔
 ܦաΛແࢹ͢΂͖͔Ͳ͏͔ͳͲ

Slide 14

Slide 14 text

Domain Event + Observer in PHP

Slide 15

Slide 15 text

ҰͭͷPHPΞϓϦέʔγϣϯͷ৔߹ • υϝΠϯϞσϧ಺ͷग़དྷࣄΛ
 ObserverΛ࢖࣮ͬͯ૷͢Δ • ΞϓϦέʔγϣϯͷΫϥε͕ංେԽͨ࣌͠
 খ͞ͳΫϥεʹ෼ׂ͢Δ৔߹΍ɺ
 ϦϑΝΫλϦϯάʹར༻͢Δ͜ͱ΋
 • ୯ҰͷΞϓϦέʔγϣϯ಺Ͱ࣮૷͢Δ৔߹ʹ༗༻
 (1ϓϩηεΏ͑)

Slide 16

Slide 16 text

ߟྀ͢Δ͜ͱ • ϚΠΫϩαʔϏεͰ࿈ܞ͢Δ৔߹͸Ͳ͏͢΂͖͔ • ʙͨ࣌͠ʹɺʙ͢Δ
 ଞͷΞϓϦέʔγϣϯɾݴޠͰ࣮ߦ͞ΕΔ͔
 ੾Γग़͢ඞཁ͕͋Δ͔Ͳ͏͔

Slide 17

Slide 17 text

ߟྀ͢Δ͜ͱ • ෳ਺ͷΞϓϦέʔγϣϯͱ࿈ܞͨ͠৔߹ͷো֐෮چ
 ϩάΛग़ྗ͍ͯ͠Δ͚ͩͰࡁΉ͔Ͳ͏͔ • ݁ՌΛσʔλϕʔεʹอଘ͠ɺ
 ΞϓϦέʔγϣϯͷσʔλͱͯ͠׆༻
 ݁ՌʹࢸΔ·Ͱͷաఔ͸ඞཁ͔Ͳ͏͔ • ཤྺσʔλอଘ͚ͩͰࡁΉ͔Ͳ͏͔

Slide 18

Slide 18 text

ݎ͘ɺͦͯ͠ো֐ʹ΋ڧ͍ ΞϓϦέʔγϣϯʹ͠ͳ͚Ε͹ͳΒͳ͍

Slide 19

Slide 19 text

Event Sourcing

Slide 20

Slide 20 text

Event Sourcing • ΠϕϯτΛه࿥ͯ͠࠶ݱ͢Δύλʔϯ • ΠϕϯτΛΠϕϯτετΞʹอଘ • ه࿥͞ΕͨΠϕϯτ͔ΒΦϒδΣΫτΛ෮ݩͰ͖Δ • ΠϕϯτʴϩάʴΦϒδΣΫτɺΠϕϯτ͸ෆม • ൃੜͨ͠ࣄ࣮Λ఻͑Δ

Slide 21

Slide 21 text

Event SourcingΛಋೖ͢΂͖Ͱ͸ͳ͍৔߹ • ΠϕϯτΛه࿥ͯ͠࠶ݱ͢Δඞཁ͕ͳ͍৔߹ • ه࿥͞ΕͨΠϕϯτ͔Β
 ΦϒδΣΫτΛ෮ݩ͢Δ͜ͱ͕ͳ͍৔߹ • খن໛ͳΞϓϦέʔγϣϯɺ
 γϯϓϧͳCRUD͔͠ͳ͍ΞϓϦέʔγϣϯ • ࢀরΑΓ΋ॻ͖ࠐΈ͕ϝΠϯͷΞϓϦέʔγϣϯ

Slide 22

Slide 22 text

Event Sourcing • PHPͰͲ͏΍࣮ͬͯ૷͢Δ͔ʁ • RDBMSͱ૊Έ߹ΘͤͯશͯͷΠϕϯτ৘ใΛอ؅ʁ • େن໛ͳσʔλʹ͸ରԠͰ͖Δ͔ʁ • ר͖໭͠ͷॲཧ͸Ͳ͏͢Δ͔ʁ

Slide 23

Slide 23 text

Asynchronous / Synchronous Event

Slide 24

Slide 24 text

ಉظΠϕϯτ • Πϕϯτ͸ಉظॲཧͰ͋Δ΂͖͔Ͳ͏͔
 Πϕϯτൃੜ࣌ʹଈ࠲ʹଞΞϓϦέʔγϣϯʹ൓ө͢Δ ඞཁ͕͋Δ͔ • ΠϕϯτൃߦɺΠϕϯτཤྺอ࣋ɺ
 αϒεΫϥΠόʹΑΔσʔλӬଓԽΛߦ͏

Slide 25

Slide 25 text

ඇಉظΠϕϯτ • Πϕϯτ͸ඇಉظʹͰ͖Δ͔Ͳ͏͔
 Πϕϯτ͕ൃੜͨ͜͠ͱΛ୲อ͠ɺ
 ଞΞϓϦέʔγϣϯ΁ͷ൓ө͸஗Ԇͤͯ͞΋Α͍͔ • ΠϕϯτൃߦɺΠϕϯτཤྺอ࣋·Ͱ
 σʔλӬଓԽ͸஗ԆͰ࣮ߦ͞ΕΔ
 (χΞϦΞϧλΠϜఔ౓)

Slide 26

Slide 26 text

CQRS

Slide 27

Slide 27 text

ΞϓϦέʔγϣϯͷ੒௕Ͱൃੜ͢Δ໰୊ • σʔλϞσϧͱύϑΥʔϚϯε • αʔϏε੒௕ͱڞʹ૿͑ΔෳࡶͳΫΤϦͱ૿͑Δ༰ྔ • σʔλͷਖ਼͠͞(ਖ਼نԽ)͔ޮ཰Խ͔(ඇਖ਼نԽ) • RDBMSͷෆಘҙ෼໺ + NoSQLʹΑΔΧόʔ
 ಉظํ๏ͷෳࡶԽ

Slide 28

Slide 28 text

σʔλϕʔεઃܭͷ೰Έ • ਖ਼نԽͱநग़͍ͨ͠σʔλͷΪϟοϓ • நग़͍ͨ͠σʔλʹ߹ΘͤͨઃܭΛ͢Δ͜ͱʹΑΔ
 ੍໿͕͔͚ΒΕͳ͍δϨϯϚ • ࣮૷ίʔυͰ୲อ͢ΔͨΊʹෳࡶԽ • ಛఆͷσʔλϕʔεʹରͯ͠ͷCRUDʹґଘͨ͠ߟ͑

Slide 29

Slide 29 text

ਖ਼نԽ͸͢΂͖ʂ

Slide 30

Slide 30 text

ϏδωεཁٻʹରԠ͢ΔͨΊʹ
 σʔλϕʔεͰશͯରԠ͢Δͷ͸ਖ਼͍͔͠ ਖ਼نԽɺඇਖ਼نԽ͸
 ಉ࣠͡Ͱߟ͑Δ΂͖Ͱ͸ͳ͍

Slide 31

Slide 31 text

Ϗδωεཁٻ γεςϜ౎߹(ϑϨʔϜϫʔΫͳͲ) Ϋϥεઃܭ γϯϓϧ͞ ύϑΥʔϚϯε

Slide 32

Slide 32 text

CQRS "A few myths about CQRS". Ouarzy's Blog. 
 http://www.ouarzy.com/2016/10/02/a-few-myths-about-cqrs/ ࢀর

Slide 33

Slide 33 text

CQRSͱ͸Կ͔ • ॻ͖ࠐΈ(෭࡞༻͋Γ)ͱ
 ಡΈࠐΈ(෭࡞༻ͳ͠)Λ෼཭͢Δ • ෭࡞༻͋Γ͸σʔλͳͲʹԿΒ͔ͷมߋΛ༩͑Δ΋ͷ
 • ॻ͖ࠐΈ => Command
 • ಡΈࠐΈ => Query

Slide 34

Slide 34 text

CQRS • ͋ΒΏΔϝιου͸ɺΞΫγϣϯΛ࣮ߦ͢ΔίϚϯυ ͔ɺݺͼग़͠ݩʹσʔλΛฦ͢ΫΤϦ͔ͷ͍ͣΕ͔Ͱ ͋ͬͯɺ྆ํΛߦͬͯ͸ͳΒͳ͍ɻ͜Ε͸ɺ࣭໰Λ͢Δ ͜ͱͰճ౴ΛมԽͤͯ͞͸ͳΒͳ͍ͱ͍͏͜ͱͩɻ
 
 "Greg YoungྲྀCQRS - Mark Nijhof". Digital Romanticism. 
 http://d.hatena.ne.jp/digitalsoul/20100712/1278886009 ࢀর 


Slide 35

Slide 35 text

Command • ੔߹ੑ
 ੍໿Λ͔͚ͯਖ਼͘͠ɺݎ͘ • ॻ͖ࠐΈɺߋ৽ɺ࡟আॲཧ͸
 ಡΈࠐΈʹൺ΂ͯޮ཰ੑ΍଎౓ɺ
 εέʔϥϏϦςΟΛҙࣝ͢Δ͜ͱ͸͋·Γͳ͍

Slide 36

Slide 36 text

Query • ੔߹ੑΑΓ΋ݕࡧޮ཰ • ΄ͱΜͲͷΞϓϦέʔγϣϯʹ͓͍ͯɺ
 ॻ͖ࠐΈΑΓ΋ݕࡧͷൺॏ͕େ͖͍͜ͱ͕΄ͱΜͲ • εέʔϧ͕༰қͰ͋Δ͜ͱɺ
 ߴ଎ͳύϑΥʔϚϯεͰ͋Δ͜ͱ

Slide 37

Slide 37 text

PHPΞϓϦέʔγϣϯ޲͚
 Command, Query෼཭࣌ͷσʔλϕʔε

Slide 38

Slide 38 text

Command

Slide 39

Slide 39 text

Query

Slide 40

Slide 40 text

Query

Slide 41

Slide 41 text

Query

Slide 42

Slide 42 text

Query

Slide 43

Slide 43 text

Query

Slide 44

Slide 44 text

Query

Slide 45

Slide 45 text

CQRS Application Application

Slide 46

Slide 46 text

ཧ۶͸Θ͔Δ͚Ͳɺ Ͳ͏࣮૷͢Ε͹͍͍ͷ͔ʁ ಉظ͸Ͳ͏͢Δͷʁ

Slide 47

Slide 47 text

Event Sourcing + CQRS

Slide 48

Slide 48 text

Event Sourcing / Command Event Application Command RDBMS

Slide 49

Slide 49 text

Event Sourcing / Command Event Application Command RDBMS ΞϓϦέʔγϣϯ͔Β ॻ͖ࠐΈࢦࣔ(class)

Slide 50

Slide 50 text

Event Sourcing / Command Event Application Command RDBMS ΞϓϦέʔγϣϯ͔Β ॻ͖ࠐΈࢦࣔ(class) σʔλϕʔεʹinsert

Slide 51

Slide 51 text

Event Sourcing / Command Event Application Command RDBMS ΞϓϦέʔγϣϯ͔Β ॻ͖ࠐΈࢦࣔ(class) σʔλϕʔεʹinsert ਖ਼ৗʹॻ͖ࠐ·Εͨ ࣄ࣮Λฦ٫

Slide 52

Slide 52 text

Event Sourcing / Command Event Application Command RDBMS ΞϓϦέʔγϣϯ͔Β ॻ͖ࠐΈࢦࣔ(class) σʔλϕʔεʹinsert ਖ਼ৗʹॻ͖ࠐ·Εͨ ࣄ࣮Λฦ٫ ࣄ࣮ʹج͍ͮͨ
 ΠϕϯτΛൃߦ

Slide 53

Slide 53 text

Event Sourcing / Command Event Application Command RDBMS Transaction

Slide 54

Slide 54 text

Event Sourcing / Query Event / Listener Application NoSQL Query

Slide 55

Slide 55 text

Event Sourcing / Query Event / Listener Application NoSQL Query EventͷൃߦΛݕ஌͠ NoSQLʹσʔλΛૠೖ

Slide 56

Slide 56 text

Event Sourcing / Queryྫ Event / Listener Application NoSQL Query EventͷൃߦΛݕ஌͠ NoSQLʹσʔλΛૠೖ Application͔ΒQuery
 நग़໰͍߹Θͤ

Slide 57

Slide 57 text

Event Sourcing / Query Event / Listener Application NoSQL Query EventͷൃߦΛݕ஌͠ NoSQLʹσʔλΛૠೖ Application͔ΒQuery
 நग़໰͍߹Θͤ NoSQLʹ໰͍߹Θͤ υϝΠϯʹ࠷దԽ͞Εͨ΋ͷΛظ଴

Slide 58

Slide 58 text

Event Sourcing / Query Event / Listener Application NoSQL Query EventͷൃߦΛݕ஌͠ NoSQLʹσʔλΛૠೖ Application͔ΒQuery
 நग़໰͍߹Θͤ NoSQLʹ໰͍߹Θͤ υϝΠϯʹ࠷దԽ͞Εͨ΋ͷΛظ଴ ݁ՌΛฦ͢ͷΈ

Slide 59

Slide 59 text

Cache System σʔλϕʔεߋ৽
 $PNNBOE σʔλϕʔεߋ৽׬ྃΠϕϯτ
 &WFOU4PVSDJOH σʔλϕʔεߋ৽׬ྃݕ஌
 &WFOU-JTUFOFS Ωϟογϡ࡟আͳͲ

Slide 60

Slide 60 text

Structure Event Publisher Command Query Event Subscriber

Slide 61

Slide 61 text

Structure Event Publisher Command Query Event Subscriber ੹຿͸ॻ͖ࠐΈͷΈ

Slide 62

Slide 62 text

Structure Event Publisher Command Query Event Subscriber ੹຿͸ॻ͖ࠐΈͷΈ ੹຿͸ಡΈࠐΈͷΈ

Slide 63

Slide 63 text

Structure Event Publisher Command Query Event Subscriber ੹຿͸ॻ͖ࠐΈͷΈ ੹຿͸ಡΈࠐΈͷΈ ੹຿͸Eventૹ৴ͷΈ

Slide 64

Slide 64 text

Structure Event Publisher Command Query Event Subscriber ੹຿͸ॻ͖ࠐΈͷΈ ੹຿͸ಡΈࠐΈͷΈ ੹຿͸Eventૹ৴ͷΈ ੹຿͸Eventड৴ͱ
 ॻ͖ࠐΈ

Slide 65

Slide 65 text

Event Sourcing • CommandɺQueryɺEvent Sourcing͸
 ผΞϓϦέʔγϣϯɾݴޠͰ࣮૷Ͱ͖Δ͘Β͍ͷ
 γϯϓϧ͞ • EventอଘͱυϝΠϯʹରԠͨ͠QueryΛͲ͏΍ͬͯ
 ޮ཰తʹ࣮૷͢Δ͔

Slide 66

Slide 66 text

ΞϓϦέʔγϣϯ෼ׂྫ

Slide 67

Slide 67 text

ΞϓϦέʔγϣϯ෼ׂྫ PHP WebΞϓϦέʔγϣϯ webΞϓϦ։ൃνʔϜ

Slide 68

Slide 68 text

ΞϓϦέʔγϣϯ෼ׂྫ PHP WebΞϓϦέʔγϣϯ webΞϓϦ։ൃνʔϜ ूܭॲཧ push etc CLI։ൃνʔϜ / DWH etc

Slide 69

Slide 69 text

ΞϓϦέʔγϣϯ෼ׂྫ PHP WebΞϓϦέʔγϣϯ webΞϓϦ։ൃνʔϜ ूܭॲཧ push etc CLI։ൃνʔϜ / DWH etc ޿ࠂ഑৴ܥAPI ޿ࠂ഑৴։ൃνʔϜ

Slide 70

Slide 70 text

ΞϓϦέʔγϣϯ෼ׂྫ PHP WebΞϓϦέʔγϣϯ webΞϓϦ։ൃνʔϜ ूܭॲཧ push etc CLI։ൃνʔϜ / DWH etc ޿ࠂ഑৴ܥAPI ޿ࠂ഑৴։ൃνʔϜ ϢʔβʔͷӾཡ৘ใʹج͍ͮͨ ৘ใ͕ཉ͍͠Ͱ͢ ϦΞϧλΠϜͰ

Slide 71

Slide 71 text

Event Sourcing / Message Broker

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

Event Sourcing / RDBMS • PubSubͰشൃੑͷͳ͍΋ͷΛબ୒͢Δ
 ͦΜͳػೳ͸ͳ͍ͷͰόονॲཧͳͲͰ
 ఆظతʹσʔλ௥Ճ͕͋Δ͔Ͳ͏͔Λݕࡧ͢Δ
 • ϝοηʔδอ؅͕ՄೳͰɺ࠶ݱ͢Δ͜ͱ͕Մೳͳ΋ͷΛ࠾༻͢Δͷ ͕๬·͍͠
 ಘҙ෼໺ • εέʔϥϒϧͰ͋Δ͜ͱ
 SlaveͳͲΛ૿΍͢͜ͱͰରԠ͸Ͱ͖Δ

Slide 74

Slide 74 text

Event Sourcing / Redis • PubSubͰشൃੑͷͳ͍΋ͷΛબ୒͢Δ
 PUBLISH SUBSCRIBEͳͲ͕͋ΔͷͰ࣮ݱ͸Ͱ͖Δ͕ɺ
 شൃੑʹ͍ͭͯ͸ઃఆͰؤுΔ
 • ϝοηʔδอ؅͕ՄೳͰɺ
 ࠶ݱ͢Δ͜ͱ͕Մೳͳ΋ͷΛ࠾༻͢Δͷ͕๬·͍͠
 ͋·ΓಘҙͰ͸ͳ͍(τϥϯβΫγϣϯͳ͠) • εέʔϥϒϧͰ͋Δ͜ͱ
 ༰қʹͰ͖Δ

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

Message Broker

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

Apache Kafka • ZookeeperΛར༻ͨ͠ΫϥελϦϯάʹΑΔߴՄ༻ੑ • ϝοηʔδͷӬଓԽɺϨϓϦέʔγϣϯɺ࠶औಘՄ • ϏοάσʔλରԠ • ετϦʔϜରԠͷϝοηʔδϯάϛυϧ΢ΣΞ • Kafka ConnectʹΑΔपลγεςϜͱͷߴ͍਌࿨ੑ
 (Amazon kinesisͱ΄΅ಉ͡)

Slide 79

Slide 79 text

Event Sourcing • ΠϕϯτΛΠϕϯτετΞʹอଘ
 Kafkaࣗମʹอଘ͢Δ͜ͱ͕Ͱ͖ɺ
 σʔλϕʔεʹసૹՄೳ • ه࿥͞ΕͨΠϕϯτ͔ΒΦϒδΣΫτΛ෮ݩͰ͖Δ
 ॲཧ͞ΕͨΠϕϯτ͸࠶ൃߦՄೳ • ΠϕϯτʴϩάʴΦϒδΣΫτɺΠϕϯτ͸ෆม
 ൃߦޙͷΠϕϯτΛॻ͖׵͑Δ͜ͱ͸Ͱ͖ͳ͍ • ൃੜͨ͠ࣄ࣮Λ఻͑Δ
 τϥϯβΫγϣϯ͋Γ

Slide 80

Slide 80 text

ϝοηʔδͷܽଛʹ͍ͭͯ ૹ৴ࣦഊ BDLड৴ࣦഊ #SPLFSμ΢ϯ ϝοηʔδड৴ࣦഊ

Slide 81

Slide 81 text

ϝοηʔδ఻ୡͷอূ • At least once semantics
 ॏෳΛڐՄ • At most once semantics
 ܽଛΛڐՄ • Exactly once semantics
 ॏෳɺ͓ΑͼܽଛΛڐՄ͠ͳ͍
 
 "Exactly-once Semantics are Possible: Here’s How Kafka Does it". Confluent APACHE KAFKA. 
 https://www.confluent.io/blog/exactly-once-semantics-are-possible-heres-how-apache-kafka-does-it/ ࢀর

Slide 82

Slide 82 text

Performance?

Slide 83

Slide 83 text

Apache Kafka֓ཁ • Partition
 ෛՙ෼ࢄ༻్ʹར༻
 ෳ਺ͷConsumer͕ͦΕͧΕͷPartitionΛࢀর͠ɺ
 ͦΕͧΕ͕ॲཧΛߦ͏
 ॲཧϑϩʔͷσβΠϯʹΑͬͯଟ༷ͳར༻ํ๏ • librdkafka͕ඇৗʹߴ଎
 PHPͰ͸rdkafka(librdkafkaϥοϓ)

Slide 84

Slide 84 text

Example Partition

Slide 85

Slide 85 text

Performance • confluent: 250000 records, 34.84177593s • sarama-cluster: 250000 records, 2m20.614963038s
 • confluent was almost 5x faster on the read.

Slide 86

Slide 86 text

Consumer

Slide 87

Slide 87 text

Kafka Connect • Kafka Connectͱ͸ɺ
 पลγεςϜ͔ΒͷσʔλΛऔΓࠐΈ(Source)ɺ
 σʔλૹ৴(Sink)ͷೋछྨΛαϙʔτ͢Δػೳ • Amazon SQS΍MongoDBͷσʔλΛKafkaͰऔࠐΉɺ
 ϝοηʔδΛͦͷ··Elasticsearch΍RDBMSʹ֨ೲɺ
 ͕ߦ͑Δ • Connect͸ࣗ༝ʹ֦ுͯ͠ಠࣗConnectΛ࣮૷Մೳ

Slide 88

Slide 88 text

Kafka Connect • γϯϓϧͳέʔεͰ͋Ε͹ɺ
 ಛʹ࣮૷͢Δ͜ͱͳ͘QueryΛαϙʔτ • Consumer͸ผΞϓϦέʔγϣϯͱͯ͠
 ෼ׂ͢Δͷ΋͍͍Ͱ͠ΐ͏ • ෳࡶͳσʔλΛ࡞੒͢ΔͷͰ͋Ε͹
 ConsumerͰσʔλΛ૊Έ߹ΘͤΔ

Slide 89

Slide 89 text

Structure Event Publisher Command Query Event Subscriber Application ੹຿͸ಡΈࠐΈͷΈ ੹຿͸Eventૹ৴ͷΈ WebΞϓϦέʔγϣϯ ͔Β੾Γग़͢

Slide 90

Slide 90 text

Event Sourcing+ CQRS / Kafka • Command QueryΛ୲౰͢ΔWebΞϓϦέʔγϣϯΛ
 γϯϓϧʹ • Event SourcingʹΑͬͯɺΞϓϦέʔγϣϯʹՁ஋Λ௥ Ճ͢Δ͜ͱ͕Ͱ͖Δ(෼ੳͳͲ) • Command QueryͷಉظΛαϙʔτ͠ɺ
 ΞϓϦέʔγϣϯʹ߹Θͤͯෛՙ෼ࢄ͕༰қ

Slide 91

Slide 91 text

ఆظߋ৽ͤ͞Δόονॲཧͷߟ͑ํ΋มΘΔ

Slide 92

Slide 92 text

Slide 93

Slide 93 text

Example

Slide 94

Slide 94 text

Example: Produce Ϣʔβʔͷ࣌ܥྻߦಈϩά͕ QIQSELBGLBܦ༝ͰૹΒΕͯ͘Δ

Slide 95

Slide 95 text

Example: Kafka "QBDIF,BGLB "QBDIF;PPLFFQFS QBSUJUJPO ϲ݄͘Β͍Ͱԯ͘Β͍
 ΞϓϦέʔγϣϯ΁ͷো֐ɾऔΓ͜΅͠ͳ͠

Slide 96

Slide 96 text

Example: Consume σʔλϕʔεΛ݁߹ͯ͠ϏδωεϩδοΫٵऩ QVTI௨஌ࢦࣔͳͲΠϕϯτΛૹ৴ ଞαʔϏε͕SBCCJUNRΛ࢖͍ͬͯΔͨΊ

Slide 97

Slide 97 text

Example: Cassandra $BTTBOESB$MVTUFS ԯͪΐͬͱ͘Β͍ 55-͋ΓͷͨΊ ো֐ͳ͠ɾίϯύΫγϣϯఆظ࣮ߦͰ τϥϒϧͳ͠

Slide 98

Slide 98 text

Example: Cassandra ͜͜·Ͱ਺NTҎ಺Ͱऴྃ͢ΔͨΊɺ ΄΅ϦΞϧλΠϜͰ൓ө͞ΕΔ

Slide 99

Slide 99 text

ଞ • ίϯςϯπͷσʔλΛKafkaܦ༝Ͱऩू͠HDFS֨ೲ
 SparkʹΑΔ෼ੳॲཧޙ Cassandra֨ೲ
 ΞϓϦέʔγϣϯ͔Β͸Cassandraʹ
 γϯϓϧͳΫΤϦΛ౤͛ΔͷΈʹ • Event Sourcing, CQRSͷ૊Έ߹ΘͤʹΑΓ
 Ωϟογϡੜ੒΍σʔλ࠷దԽʹΑΓߴ଎Խʹߩݙ


Slide 100

Slide 100 text

Now

Slide 101

Slide 101 text

େࡶ೺ͳαϯϓϧ͸ԼهΛࢀর͍ͩ͘͞
 https://github.com/ytake/laravel-presto- kafka-demo

Slide 102

Slide 102 text

·ͱΊ • େن໛ʹͳΔ͜ͱ͕༧ଌͰ͖ͨΒ
 ಋೖʹνϟϨϯδ • ҰͭͷϑϨʔϜϫʔΫ͚ͩͰ΍Ζ͏ͱ͠ͳ͍͜ͱ • ϛυϧ΢ΣΞͷ஌ࣝ͸ඞཁʹ • DDDͷ؍఺͚ͩͰ͸ͳ͘ɺ
 ෼ࢄॲཧ΍ෳࡶͳσʔλॲཧͷ
 ϦϑΝΫλϦϯάʹ΋׆͖Δύλʔϯ