Firestore Ͱ CQRS ͬͯΈͨFirebase Meetup #13 @DeNA
View Slide
Kinjo YujiiOS EngineerTwitter: @_yukin01GitHub: @yukin01
ɾσʔλϞσϦϯά͕͍͠ͱ͍͏ɾ࣮ࡍʹͬͯΈΔɾCQRS ͕͑Δ͔͠Εͳ͍ɾ·ͱΊ͜ΜͳΛ͠·͢
ϦϨʔγϣϯγοϓͲ͏දݱ͍ͯ͠·͔͢ʁ
Top-level Collection or Sub Collectioncollection("posts").where("room_id", "==", "room_001").orderBy("createdAt", "desc")collection("rooms").doc("room_001").collection("posts").orderBy("createdAt", "desc")Top-level collectionSub collection
Sub collectionMap (Array) or Sub Collection
͍ΖΜͳཁૉͰܾ·ͬͯ͘Δʢઈରղͳ͍ɾଟॏ => 1 : 1, 1 : n, n : nɾࢠυΩϡϝϯτͷϥΠϑαΠΫϧɾΫΤϦɾॻ͖ࠐΈͷ੍ݶdocument => 1 times/scollection => 500 times/sɾetc.
Firestore ͰͰ͖Δ͜ͱࣗମ૿͍͑ͯΔɾarrayUnion/array-containsɾincrementɾCollection GroupʢΩϟονΞοϓେมʣ
࠷ۙࢥ͏͜ͱϢʔεέʔεʢͲ͏͍͏σʔλΛऔಘɾߋ৽͍͔ͨ͠ʣʹΑͬͯ࠷దͳσʔλߏ͕ܾ·Δʢ࠷దղ͋Δ=>ߏʹΑͬͯσʔλͷऔಘɾߋ৽͕ඇৗʹ͘͠ͳΔ͜ͱ…
νϟοτػೳͷσʔλߏΛߟ͑Δ
͜Μͳײ͡
Contents- ϧʔϜ໊- ΞΠίϯը૾- ϝϯόʔ- ະಡ- ࠷৽ϝοηʔδConditions- ॴଐ͍ͯ͠ΔϧʔϜͷΈ- ߘ࣌ؒͰιʔτ
·ͣγϯϓϧʹ
ɾϧʔϜ໊ɺΞΠίϯը૾ɺϝϯόʔɾarray-contains ͷΫΤϦɾະಡͲ͏͢Δ…ʁ
ɾະಡ࠷৽ϝοηʔδɾཁ݅ຬͨͤΔɾWrite ͷ੍ݶ͕…"(unreadCount ʹूத͢Δ)
ɾSub Collection Խɾཁ݅ຬͨͤΔɾ1ճͷΫΤϦͰऔಘͰ͖ͳ͍Rooms => Members=> Messages
ɾJOIN ͢Δύλʔϯɾਖ਼نԽɾΫϥΠΞϯταΠυ JOINɾ͍ΘΏΔ N+1 ʢઈରμϝͱ͍͏Θ͚Ͱͳ͍ʣɾJOIN ͠ͳ͍ύλʔϯɾඇਖ਼نԽɾඞཁͳσʔλΛԽʢίϐʔʣ͢ΔɾRDB Ͱߟ͑ʹ͍͕͘ NoSQL ͰҰൠత
ɾJOIN ͢Δύλʔϯɾਖ਼نԽɾΫϥΠΞϯταΠυ JOINɾ͍ΘΏΔ N+1 ʢઈରμϝͱ͍͏Θ͚Ͱͳ͍ʣɾJOIN ͠ͳ͍ύλʔϯɾඇਖ਼نԽɾඞཁͳσʔλΛԽʢίϐʔʣ͢ΔɾRDB Ͱߟ͑ʹ͍͕͘ NoSQL ͰҰൠత<= ࠾༻ͯ͠ΈΔ
ඇਖ਼نԽʢίϐʔʣͷ࣮ݱํ๏ɾTransaction or Batch WriteɾAtomic ͳॻ͖ࠐΈΛ࣮ݱɾ࠷େ 500 ݅ͷ੍ݶ͋ΓɾFirestore Triggerɾ݁Ռ߹ੑɾΤϥʔॲཧɺϦτϥΠॲཧͷඞཁੑ
͚ͩ͜͜ݟΕྑ͍
Trigger functions
Batch Write
ϐλΰϥεΠον
CQRS(Command Query Responsibility Segregation)Command (ߋ৽ܥ) ͱ Query (ࢀরܥ) ͰػೳΛׂDDD ͷจ຺ͰޠΒΕΔ͜ͱ͕ଟ͍ES (Event Sourcing)ʮঢ়ଶʯͰͳ͘ʮΠϕϯτʯΛه͍ͯ͘͠ߟ͑ํҙͷঢ়ଶΠϕϯτΛ࠶ੜ͢Ε࠶ݱͰ͖ΔCQRS ͱΈ߹ΘͤͰΑ͘ޠΒΕ͍ͯΔ
h"ps://www.slideshare.net/AmazonWebServices/srv301op=mizing-serverless-applica=on-data-=ers-with-amazon-dynamodb
https://www.slideshare.net/AmazonWebServices/srv301optimizing-serverless-application-data-tiers-with-amazon-dynamodb
Command ଆΠϕϯτ͚ͩΛه (ཁCreate ͷΈ)=> ᘳʹ࣮ݱ͢ΔͷΊ͓ͯ͘σʔλͷྲྀΕΛҰํʹ͢Δͱ͜ΖΛऔΓೖΕΔ
͜͏͍͏Πϝʔδ
ɾਖ਼نԽɾηΩϡϦςΟϧʔϧͰWrite ͷΈڐՄɾ΄΅ RDB ͷײ֮
ɾඇਖ਼نԽɾηΩϡϦςΟϧʔϧͰRead ͷΈڐՄɾΫϥΠΞϯτͷॲཧָ͕ɾཁ݅มߋʹରԠ͍͢͠
Trigger functionsCommand -> QueryͷҰํ
·ͱΊ- Firestore + Functions Ͱ CQRS ΛऔΓೖΕͨσʔλϞσϦϯάΛ࣮- Command ͱ Query Ͱશʹ- ϐλΰϥεΠονΛҰํʹͰ͖Δ- ͕- ঢ়ଶ͕ଟ͘ɺRead ͕සൟͳϢʔεέʔεͰ༗ޮ͔