Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Firestore で CQRS やってみた

Firestore で CQRS やってみた

Yuji Kinjo

May 28, 2019
Tweet

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. 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

    View Slide

  6. Sub collection
    Map (Array) or Sub Collection

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. ͜Μͳײ͡

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. ·ͣ͸γϯϓϧʹ

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  25. View Slide

  26. ͚ͩ͜͜ݟΕ͹ྑ͍

    View Slide

  27. Trigger functions

    View Slide

  28. Trigger functions

    View Slide

  29. Trigger functions

    View Slide

  30. Batch Write

    View Slide

  31. ϐλΰϥεΠον

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  36. ͜͏͍͏Πϝʔδ

    View Slide

  37. View Slide

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

    View Slide

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

    View Slide

  40. Trigger functions
    Command -> Query
    ͷҰํ޲

    View Slide

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

    View Slide