Slide 1

Slide 1 text

Firestore Ͱ CQRS ΍ͬͯΈͨ Firebase Meetup #13 @DeNA

Slide 2

Slide 2 text

Kinjo Yuji iOS Engineer Twitter: @_yukin01 GitHub: @yukin01

Slide 3

Slide 3 text

ɾσʔλϞσϦϯά͕೉͍͠ͱ͍͏࿩ ɾ࣮ࡍʹ΍ͬͯΈΔ ɾCQRS ͕࢖͑Δ͔΋͠Εͳ͍ ɾ·ͱΊ ͜Μͳ࿩Λ͠·͢

Slide 4

Slide 4 text

ϦϨʔγϣϯγοϓͲ͏දݱ͍ͯ͠·͔͢ʁ

Slide 5

Slide 5 text

Top-level Collection or Sub Collection collection("posts") .where("room_id", "==", "room_001") .orderBy("createdAt", "desc") collection("rooms") .doc("room_001") .collection("posts") .orderBy("createdAt", "desc") Top-level collection Sub collection

Slide 6

Slide 6 text

Sub collection Map (Array) or Sub Collection

Slide 7

Slide 7 text

͍ΖΜͳཁૉͰܾ·ͬͯ͘Δʢઈରղ͸ͳ͍ ɾଟॏ౓ => 1 : 1, 1 : n, n : n ɾ਌ࢠυΩϡϝϯτͷϥΠϑαΠΫϧ ɾΫΤϦ ɾॻ͖ࠐΈͷ੍ݶ document => 1 times/s collection => 500 times/s ɾetc.

Slide 8

Slide 8 text

Firestore ͰͰ͖Δ͜ͱࣗମ૿͍͑ͯΔ ɾarrayUnion/array-contains ɾincrement ɾCollection Group ʢΩϟονΞοϓେมʣ

Slide 9

Slide 9 text

࠷ۙࢥ͏͜ͱ ϢʔεέʔεʢͲ͏͍͏σʔλΛऔಘɾߋ৽͍͔ͨ͠ʣ ʹΑͬͯ ࠷దͳσʔλߏ଄͕ܾ·Δʢ࠷దղ͸͋Δ => ߏ଄ʹΑͬͯ͸σʔλͷऔಘɾߋ৽͕ ඇৗʹ೉͘͠ͳΔ͜ͱ΋…

Slide 10

Slide 10 text

νϟοτػೳͷσʔλߏ଄Λߟ͑Δ

Slide 11

Slide 11 text

͜Μͳײ͡

Slide 12

Slide 12 text

Contents - ϧʔϜ໊ - ΞΠίϯը૾ - ϝϯόʔ਺ - ະಡ਺ - ࠷৽ϝοηʔδ Conditions - ॴଐ͍ͯ͠ΔϧʔϜͷΈ - ౤ߘ࣌ؒͰιʔτ

Slide 13

Slide 13 text

Contents - ϧʔϜ໊ - ΞΠίϯը૾ - ϝϯόʔ਺ - ະಡ਺ - ࠷৽ϝοηʔδ Conditions - ॴଐ͍ͯ͠ΔϧʔϜͷΈ - ౤ߘ࣌ؒͰιʔτ

Slide 14

Slide 14 text

Contents - ϧʔϜ໊ - ΞΠίϯը૾ - ϝϯόʔ਺ - ະಡ਺ - ࠷৽ϝοηʔδ Conditions - ॴଐ͍ͯ͠ΔϧʔϜͷΈ - ౤ߘ࣌ؒͰιʔτ

Slide 15

Slide 15 text

Contents - ϧʔϜ໊ - ΞΠίϯը૾ - ϝϯόʔ਺ - ະಡ਺ - ࠷৽ϝοηʔδ Conditions - ॴଐ͍ͯ͠ΔϧʔϜͷΈ - ౤ߘ࣌ؒͰιʔτ

Slide 16

Slide 16 text

Contents - ϧʔϜ໊ - ΞΠίϯը૾ - ϝϯόʔ਺ - ະಡ਺ - ࠷৽ϝοηʔδ Conditions - ॴଐ͍ͯ͠ΔϧʔϜͷΈ - ౤ߘ࣌ؒͰιʔτ

Slide 17

Slide 17 text

Contents - ϧʔϜ໊ - ΞΠίϯը૾ - ϝϯόʔ਺ - ະಡ਺ - ࠷৽ϝοηʔδ Conditions - ॴଐ͍ͯ͠ΔϧʔϜͷΈ - ౤ߘ࣌ؒͰιʔτ

Slide 18

Slide 18 text

·ͣ͸γϯϓϧʹ

Slide 19

Slide 19 text

ɾϧʔϜ໊ɺ ΞΠίϯը૾ɺ ϝϯόʔ਺ ɾarray-contains ͷΫΤϦ ɾະಡ਺Ͳ͏͢Δ…ʁ

Slide 20

Slide 20 text

ɾະಡ਺ ࠷৽ϝοηʔδ ɾཁ݅͸ຬͨͤΔ ɾWrite ͷ੍ݶ͕…" (unreadCount ʹूத͢Δ)

Slide 21

Slide 21 text

ɾSub Collection Խ ɾཁ݅͸ຬͨͤΔ ɾ1ճͷΫΤϦͰ औಘͰ͖ͳ͍ Rooms => Members => Messages

Slide 22

Slide 22 text

ɾJOIN ͢Δύλʔϯ ɾਖ਼نԽ ɾΫϥΠΞϯταΠυ JOIN ɾ͍ΘΏΔ N+1 ໰୊ ʢઈରμϝͱ͍͏Θ͚Ͱ͸ͳ͍ʣ ɾJOIN ͠ͳ͍ύλʔϯ ɾඇਖ਼نԽ ɾඞཁͳσʔλΛ৑௕Խʢίϐʔʣ͢Δ ɾRDB Ͱ͸ߟ͑ʹ͍͕͘ NoSQL Ͱ͸Ұൠత

Slide 23

Slide 23 text

ɾJOIN ͢Δύλʔϯ ɾਖ਼نԽ ɾΫϥΠΞϯταΠυ JOIN ɾ͍ΘΏΔ N+1 ໰୊ ʢઈରμϝͱ͍͏Θ͚Ͱ͸ͳ͍ʣ ɾJOIN ͠ͳ͍ύλʔϯ ɾඇਖ਼نԽ ɾඞཁͳσʔλΛ৑௕Խʢίϐʔʣ͢Δ ɾRDB Ͱ͸ߟ͑ʹ͍͕͘ NoSQL Ͱ͸Ұൠత <= ࠾༻ͯ͠ΈΔ

Slide 24

Slide 24 text

ඇਖ਼نԽʢίϐʔʣͷ࣮ݱํ๏ ɾTransaction or Batch Write ɾAtomic ͳॻ͖ࠐΈΛ࣮ݱ ɾ࠷େ 500 ݅ͷ੍ݶ͋Γ ɾFirestore Trigger ɾ݁Ռ੔߹ੑ ɾΤϥʔॲཧɺϦτϥΠॲཧͷඞཁੑ

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

͚ͩ͜͜ݟΕ͹ྑ͍

Slide 27

Slide 27 text

Trigger functions

Slide 28

Slide 28 text

Trigger functions

Slide 29

Slide 29 text

Trigger functions

Slide 30

Slide 30 text

Batch Write

Slide 31

Slide 31 text

ϐλΰϥεΠον

Slide 32

Slide 32 text

CQRS (Command Query Responsibility Segregation) Command (ߋ৽ܥ) ͱ Query (ࢀরܥ) ͰػೳΛ෼ׂ DDD ͷจ຺ͰޠΒΕΔ͜ͱ͕ଟ͍ ES (Event Sourcing) ʮঢ়ଶʯͰ͸ͳ͘ʮΠϕϯτʯΛه࿥͍ͯ͘͠ߟ͑ํ ೚ҙͷঢ়ଶ͸ΠϕϯτΛ࠶ੜ͢Ε͹࠶ݱͰ͖Δ CQRS ͱ૊Έ߹ΘͤͰΑ͘ޠΒΕ͍ͯΔ

Slide 33

Slide 33 text

h"ps://www.slideshare.net/AmazonWebServices/ srv301op=mizing-serverless-applica=on-data-=ers-with-amazon-dynamodb

Slide 34

Slide 34 text

https://www.slideshare.net/AmazonWebServices/ srv301optimizing-serverless-application-data-tiers-with-amazon-dynamodb

Slide 35

Slide 35 text

Command ଆ͸Πϕϯτ͚ͩΛه࿥ (ཁ͸Create ͷΈ) => ׬ᘳʹ࣮ݱ͢Δͷ͸΍Ί͓ͯ͘ σʔλͷྲྀΕΛҰํ޲ʹ͢Δͱ͜ΖΛऔΓೖΕΔ

Slide 36

Slide 36 text

͜͏͍͏Πϝʔδ

Slide 37

Slide 37 text

No content

Slide 38

Slide 38 text

ɾਖ਼نԽ ɾηΩϡϦςΟϧʔϧͰ Write ͷΈڐՄ ɾ΄΅ RDB ͷײ֮

Slide 39

Slide 39 text

ɾඇਖ਼نԽ ɾηΩϡϦςΟϧʔϧͰ Read ͷΈڐՄ ɾΫϥΠΞϯτͷॲཧָ͕ ɾཁ݅มߋʹରԠ͠΍͍͢

Slide 40

Slide 40 text

Trigger functions Command -> Query ͷҰํ޲

Slide 41

Slide 41 text

·ͱΊ - Firestore + Functions Ͱ CQRS ΛऔΓೖΕͨ σʔλϞσϦϯάΛ࣮૷ - Command ͱ Query Ͱ׬શʹ෼཭ - ϐλΰϥεΠονΛҰํ޲ʹͰ͖Δ - ͕ - ঢ়ଶ͕ଟ͘ɺRead ͕සൟͳϢʔεέʔεͰ͸ ༗ޮ͔΋