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

事業のスケールアウトを支える PHPで作る分散アーキテクチャ

yuuki takezawa
December 11, 2020

事業のスケールアウトを支える PHPで作る分散アーキテクチャ

事業の成長と、それにともなうアプリケーションの課題、
発生しがちな問題を追いながら、
解決策の一つであるCQRS導入について解説します。
分散システムで発生する問題についても軽く触れていきます。

yuuki takezawa

December 11, 2020
Tweet

More Decks by yuuki takezawa

Other Decks in Technology

Transcript

  1. ࣄۀͷεέʔϧΞ΢τΛࢧ͑Δ


    PHPͰ࡞Δ෼ࢄΞʔΩςΫνϟ
    Yuuki Takezawa / ytake

    View Slide

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

    View Slide

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

    View Slide

  4. ͦΜͳελʔϑΣεςΟόϧͰ͸


    ΤϯδχΞืूதʂʂʂ

    View Slide

  5. Caution
    • ࠓճͷ಺༰͸શͯͷΞϓϦέʔγϣϯͰ

    ద༻Ͱ͖Δ΋ͷͰ͸͋Γ·ͤΜ


    • ࣮ࡍʹຊਓ͕࠾༻͍ͯ͠Δ΋ͷ

    ϕʔεͷ಺༰Ͱ͢

    View Slide

  6. Agenda
    • ΞϓϦέʔγϣϯͷ੒௕ͱ

    λʔχϯάϙΠϯτ

    • ղܾ͢ΔͨΊͷ஌ࣝ


    • ෼ࢄτϥϯβΫγϣϯରࡦ

    View Slide

  7. Ϗδωεͷ੒௕ͱ૊৫

    View Slide

  8. খ͞ͳνʔϜ
    • σʔλϕʔεઃܭ + ORM etc

    ϑϨʔϜϫʔΫͰߏங͞ΕΔ

    ΞϓϦέʔγϣϯ

    • গਓ਺ͷ։ൃऀͰߏ੒͞ΕΔ։ൃ૊৫

    View Slide

  9. ෳ਺ͷνʔϜ
    • ૿͑ΔΞϓϦέʔγϣϯػೳ

    • ։ൃνʔϜͷ૿һ

    εΩϧ͸༷ʑ

    View Slide

  10. ΞϓϦέʔγϣϯͱσʔλϕʔε
    • ORMͰN+1͕૿͑Δέʔε

    ൃߦͨ͠SQL͸

    ΞϓϦέʔγϣϯʹ߹͍ͬͯΔ͔ʁ


    • ϝϞϦɺCPUͳͲͷ૿ڧͰ৐Γ੾Δ

    ໰୊͕ޙճ͠ʹͳΔ͜ͱ΋

    View Slide

  11. ΍ͬͯ͠·͍͕ͪͳରԠ
    • σʔλऔಘ؆ུԽͷͨΊͷ

    σʔλϕʔεઃܭ(;͑Δඇਖ਼نԽ)

    • ͱΓ͋͑ͣϦετͰશ෦औಘ

    ͦΕ͔Β1ϨίʔυͣͭৄࡉΛऔಘ͠Α͏

    View Slide

  12. ΞϓϦέʔγϣϯͱσʔλϕʔε
    • SELECT * FROM articles;

    SELECT * FROM users WHERE user_id = ?;

    • ͜Ε͕΋͠10000݅औಘͰ

    ൃߦ͞Ε͍ͯͨΒʁ

    • ORM͕ѱ͍ͷͰ͸ͳ͘

    ద੾ʹར༻Ͱ͖͍ͯͳ͍έʔε

    View Slide

  13. େ͖͘νʔϜͱࣄۀͷ੒௕
    • ૿͑ଓ͚ΔΞϓϦέʔγϣϯػೳ

    • ։ൃνʔϜͷڊେԽ

    ෳ਺ͷνʔϜߏ੒ͱ

    ෳ਺ͷεςʔΫϗϧμ

    View Slide

  14. ෆ҆ఆͳΞϓϦέʔγϣϯ΁
    • Ϩίʔυ૿Ճɾ࣮૷ίʔυ૿ՃʹΑΔ

    ͞ΒͳΔύϑΥʔϚϯε௿Լ


    • ͍͡ΊΒΕଓ͚Δσʔλϕʔε


    • ͋ͪͪ͜Ͱى͜Γ࢝ΊΔো֐

    View Slide

  15. ࠔ೉ͳཁ݅ͷ࣮ݱ
    • ϦΫΤετ͝ͱʹϨεϙϯεΛ૊Έཱͯ

    ΞϓϦέʔγϣϯͷύϑΥʔϚϯεѱԽ

    • ਖ਼نԽͨ͠͸͍͍΋ͷͷɺཁ݅ʹ߹Θͤ
    ͨσʔλऔಘίετ૿

    View Slide

  16. ΍ͬͯ͠·͍͕ͪͳରԠ
    • ݪҼ͸Θ͔Γ·ͤΜ͕஗͘ͳ͖ͬͯͨͷͰ
    Ωϟογϡ͠·͢

    -> ෳࡶԽ͢ΔΩϟογϡαʔόʔ


    • ݪҼ͸Θ͔Γ·ͤΜ͕஗͘ͳ͖ͬͯͨͷͰ
    Ωϟογϡ͠·͢

    -> ΩϟογϡαʔόʹՃ͑ͯCDN΋௥Ճ

    View Slide

  17. ΋͏खஈ͕ͳ͍ɾɾɾʂ

    View Slide

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

    View Slide

  19. σʔλॲཧͷෳࡶԽ
    Ϣʔβʔ৘ใมߋ Ϣʔβʔ৘ใ࡟আ
    Ϣʔβʔ৘ใ͕ݟ͔ͭΒͳ͍ͨΊ

    σʔλॲཧ͝ͱʹ"1*ΞΫηε
    ͋ͦ͜ͱͦ͜Ͱ৘ใ͕ҧ͏ʂ

    Ͳͷσʔλ͕ຊ෺ʁ
    શͯͷΞϓϦέʔγϣϯ͔Β

    Ωϟογϡͳ͠ͰΞΫηε

    ৗʹߴෛՙঢ়ଶʹ

    View Slide

  20. ࢭΊΒΕͳ͍


    ϏδωεͷՃ଎

    View Slide

  21. ฐ֐
    • ϦϦʔε༏ઌͷͨΊɺ

    ܧ͗଍͠ͷΞϓϦέʔγϣϯ

    • εςʔΫϗϧμ૿Ճʹ൐͏

    ΞϓϦέʔγϣϯͷෳࡶԽ


    • খதن໛ͷΞϓϦέʔγϣϯ࣌୅ͷ

    ઃܭͱ࣮૷༝དྷͷෆ۩߹͕૿Ճ

    View Slide

  22. σʔλઃܭ༝དྷͷ໰୊
    • େྔσʔλͷϑϧεΩϟϯ

    • INDEXෆ଍ͷͨΊͷύϑΥʔϚϯε௿Լ


    • γϯϓϧͳߏ੒ނͷػೳ௥Ճ࣌ͷ

    ΫΤϦෳࡶԽ

    View Slide

  23. ࣮૷ίʔυ༝དྷͷฐ֐
    • ػೳ௥ՃͷͨΊͷௐࠪʹ2ϲ݄

    • ͞·͟·ͳཁҼͷੵΈॏͶʹΑΓ

    བྷΈ߹ͬͨίʔυͰϞνϕʔγϣϯμ΢ϯ


    • ͕͔͔࣌ؒͬͯ͠·͏͕ނɺ

    ϏδωενʔϜʹ·ͣҰݴ

    ʮ͕͔͔࣌ؒΔͷͰͰ͖·ͤΜʯ

    View Slide

  24. ͦͷ݁Ռ
    • Ϗδωεͷ੒௕ػձଛࣦ


    • γϡϦϯΫ࢝͠ΊΔࣄۀ


    • ଞࣾʹෛ͚ͯ͠·͏ࣄۀ


    • څ༩্͕͕Βͳ͍ɾɾ

    View Slide

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

    View Slide

  26. ࣄۀ͸੒௕͢Δ΋ͷ
    • ΞϓϦέʔγϣϯ͸ϦϦʔε͔ͯ͠Β੒௕


    • ૝ఆ֎ͷ੒௕Λ਱͛Δ

    WebΞϓϦέʔγϣϯ


    • ͞·͟·ͳϏδωεͷՄೳੑΛߟྀͨ͠

    σʔλઃܭ

    View Slide

  27. ੒௕Λࢧ͑Δʹ͸ʁ
    • ఆظతͳσʔλϕʔεϦϑΝΫλϦϯάɺ
    ΞϓϦέʔγϣϯͷϦϑΝΫλϦϯά

    ͕࣮ࢪͰ͖Δ͔


    • ͋Γͱ͋ΒΏΔՄೳੑΛ૝ఆͨ͠σʔλ
    ઃܭ͸ෆՄೳ
    27

    View Slide

  28. ΞϓϦέʔγϣϯͰى͜Δ໰୊
    • ਖ਼نԽ͞Εͨςʔϒϧͱ

    ඇਖ਼نԽςʔϒϧͷઓ͍


    • ෳࡶԽ͢Δॻ͖ࠐΈॲཧͱଟൃ͢ΔN+1


    • σʔλϞσϧͱυϝΠϯϞσϧ͕ҟͳΔ

    View Slide

  29. Α͋͘ΔN+1
    • ঎඼Λऔಘ͠ ஍ҬɾΩονϯ৘ใΛऔಘ

    • ΠΠωɺΫνίϛ਺΋औಘ͠ͳ͚Ε͹...

    View Slide

  30. public function run(): \Generato
    r


    {
    foreach ($repository->findAll() as $row)
    {


    yield new ReadProductTransfer
    (


    $row
    ,


    $this->kitchenRepository->find($row->getId())
    ,


    $this->areaRepository->find($row->getId()
    )


    )
    ;

    }

    }


    View Slide

  31. ͜Μͳςʔϒϧઃܭͨ͠هԱ͸͋Γ·ͤΜ͔ʁ
    • UIΛߏ੒͢Δཁૉ͕औಘ͠΍͍͢

    ςʔϒϧઃܭ


    • JOIN͢Δͱ஗͘ͳΔʁ

    ͳΒ͹௒ϫΠυΧϥϜઃܭͩ

    View Slide

  32. ͜Μͳςʔϒϧ͋Γ·ͤΜ͔ʁ
    • ͳʹ͔ͷεςʔλεΛฦ͢ʹ͸

    ͋ͷΧϥϜͱ͜ͷΧϥϜͱ͋ΕΛɾɾɾɻ


    • ϏδωεϩδοΫ͕ςʔϒϧʹ͋Δ


    • ΧϥϜ໊ͱ༻్͕શ͘ผ

    View Slide

  33. ΞϓϦέʔγϣϯͰى͜Δ໰୊
    • ඇਖ਼نԽςʔϒϧ͸ಛఆͷཁ݅Ͱ͸ղܾ
    Ͱ͖Δ͕ɺͦΕҎ֎ʹ͸೉͍͠ɻ

    σʔλநग़ܥ΍ɺ

    αʔϏε֦େɺ࢓༷มߋͳͲʹ͸ແཧ͕
    ͋Δ

    View Slide

  34. ཁ݅ͱσʔλߏ଄ͷࠩ෼͸


    ඞͣ͋Δ

    View Slide

  35. ॻ͖ࠐΈͱಡΈࠐΈͷҧ͍
    ॻ͖ࠐΈ ಡΈࠐΈ
    Ұ؏ੑɾՄ༻ੑ
    τϥϯβΫγϣϯΛ༻
    ͍ͯॻ͖ࠐΈΛߦ͏
    Ұ؏ੑॏࢹ
    ݁Ռ੔߹ੑͱՄ༻ੑ
    σʔλ ਖ਼نԽ ඇਖ਼نԽ
    εέʔϥϏϦςΟ
    Ұൠతʹ
    εέʔϥϏϦςΟ͸

    ॏཁͰ͸ͳ͍
    ଟ͘ൺॏΛ઎Ί͓ͯΓ

    εέʔϥϏϦςΟ͸
    ॏཁ

    View Slide

  36. ߟ͑ΔϙΠϯτ
    • ॻ͖ࠐΈॲཧͰɺಡΈࠐΈཁ݅ʹରԠ͢Δ
    ͨΊͷॲཧ͕ଟ͍


    • ಡΈࠐΈཁ݅Λ஌Βͳ͚Ε͹ॻ͖ࠐΊͳ͍


    • Ϩεϙϯεͱσʔλߏ଄͕͋·Γʹ΋ҧ͍
    ͗͢Δ

    View Slide

  37. ߟ͑ΔϙΠϯτ
    • σʔλͷਖ਼͠͞ͱཁ݅Ϩϕϧͷਖ਼͠͞͸
    ҧ͏΋ͷ


    • ͲͪΒ͔ʹدͤͨઃܭʹ͢Δɺ

    Ͱ͸ͳ྆͘ํΛ෼཭Ͱ͖Ε͹γϯϓϧʹ

    View Slide

  38. ϛυϧ΢ΣΞϨϕϧͰ͸

    View Slide

  39. ॻ͖ࠐΈଟ਺ͷΞϓϦέʔγϣϯ
    • ॻ͖ࠐΈʹڧ͘ɺ

    εέʔϧ͕༰қͳσʔλϕʔε΁

    Cassandra, DynamoDB etc

    View Slide

  40. ಡΈࠐΈଟ਺ͷΞϓϦέʔγϣϯ
    • RDBMSͷΈͰ΋े෼

    • LIKEݕࡧͳͲ͸Elasticsearch, Solr΁

    View Slide

  41. ղܾɺͰ͖ͳ͍ɾɾ
    • ϛυϧ΢ΣΞϨϕϧͰͷղܾํ๏Ͱɺ

    ΞϓϦέʔγϣϯࣗମ͕࣋ͭ

    ෳࡶ͞͸ղܾͰ͖ͳ͍ɻ


    • ύϑΥʔϚϯε໘Ͱͷվળ͸Ͱ͖Δ͕ɺ

    ࣄۀͷ੒௕Λࢧ͑ΔεϐʔσΟ͞͸ͳ͍

    View Slide

  42. ΞϓϦέʔγϣϯϨϕϧͷ՝୊

    View Slide

  43. ΞϓϦέʔγϣϯϨϕϧͰͷ՝୊
    • ෼ੳΛߦΘͳ͍͜ͱʹΑΔޡͬͨ൚༻Խ


    • ෳ਺ͷίϯςΩετ͕ࠞࡏ


    • ͳΜͰ΋͠Α͏ͱ͢Δॲཧ

    View Slide

  44. ڥք෇͚ΒΕͨίϯςΩετ
    ঎඼͸

    ঎඼໊

    ѻ͍ͬͯΔΩονϯళฮ
    ஋ஈ

    ൢചظؒͰ͢

    View Slide

  45. ڥք෇͚ΒΕͨίϯςΩετ
    QSPEVDU/BNF

    LJUDIFO/BNF
    QSJDF
    TBMFT1FSJPE

    View Slide

  46. ڥք෇͚ΒΕͨίϯςΩετ
    ঎඼͸

    ঎඼໊

    ݸ਺
    ഑ૹઌͰ͢

    View Slide

  47. ڥք෇͚ΒΕͨίϯςΩετ
    QSPEVDU/BNF

    LJUDIFO/BNF
    QSJDF
    TBMFT1FSJPE
    RVBOUJUZ
    TJQQJOH"EESFTT

    View Slide

  48. ڥք෇͚ΒΕͨίϯςΩετ
    ঎඼͸

    ঎඼໊

    ஋ஈͰ͢

    View Slide

  49. ڥք෇͚ΒΕͨίϯςΩετ
    QSPEVDU/BNF

    LJUDIFO/BNF
    QSJDF
    TBMFT1FSJPE
    RVBOUJUZ
    TJQQJOH"EESFTT

    View Slide

  50. ڥք෇͚ΒΕͨίϯςΩετ
    • ঎඼ͱ͍͏ݴ༿Ͱ΋಺༰͕ҟͳΔ


    • ΞϓϦέʔγϣϯ಺Ͱ΋ଟʑ


    • ڞ௨ԽͰ͖Δ΋ͷͰ͸ͳ͍

    View Slide

  51. ڥք෇͚ΒΕͨίϯςΩετ
    • ྫ͑͹ɺ঎඼Λࢦ͢ݴ༿ͱ

    DB্ͷproductsςʔϒϧ͸Ұக͠ͳ͍
    έʔε͕ଟ͍

    • ͲͪΒ͔ʹ߹ΘͤΒΕΔ΋ͷͰ͸ͳ͍ͱ

    ೝࣝ͢Δ͜ͱ

    View Slide

  52. ॻ͖ࠐΈͱಡΈࠐΈΛ


    ෼཭ͯ͠Έͯ͸Ͳ͏͔

    View Slide

  53. CQRS

    View Slide

  54. CQRS
    • ॻ͖ࠐΈϞσϧͱಡΈࠐΈϞσϧΛִ཭


    • υϝΠϯϞσϧͷ෼཭͚ͩͰͳ͘

    σʔλετΞ͢Β΋෺ཧతʹผ෺ʹ෼཭Մೳ

    ؔ৺ࣄͷ෼཭Λపఈ

    • DDDʹ͓͚ΔಡΈࠐΈͱॻ͖ࠐΈͷࠩ෼Λղܾ͢Δ
    ύλʔϯ

    View Slide

  55. CQRS

    View Slide

  56. CQRS
    ͳΜΒ͔ͷม׵ॲཧΛ௨ͯ͡

    3FBEͷσʔλΛߋ৽

    View Slide

  57. CQRS
    • CommandͱReadʹڥքઢ͕͋Δ


    • CommandͱRead͸

    ಉ͡ϦϙδτϦɺϢʔεέʔεͱ͠ͳ͍


    • ಉ͡ςʔϒϧ͸ࢀর͠ͳ͍

    View Slide

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

    View Slide

  59. େ͖͘ͳͬͨαʔϏεͰղܾ͞ΕΔ໰୊
    • ෳࡶԽ͍ͯͨ͠ಡΈࠐΈϞσϧͷ

    ύϑΥʔϚϯεΛվળ


    • ಡΈࠐΈϞσϧʹؔ͢Δ

    εέʔϥϏϦςΟ޲্

    View Slide

  60. ஫ҙ఺
    • CQRS͸ಛఆͷػೳʹͷΈద༻Մೳ

    ΞϓϦέʔγϣϯશͯʹద༻͢Δ΋ͷͰ͸
    ͳ͍


    • ॻ͖ࠐΈϞσϧͱಡΈࠐΈϞσϧͷࠩ෼͕Α
    ͘Θ͔Βͳ͍

    -> ཁ݅ͷ෼ੳΛ·ͣ͠·͠ΐ͏

    View Slide

  61. CQRSʹΑͬͯղܾ͞ΕΔ໰୊
    • ॻ͖ࠐΈϞσϧ͸CUDΛ୲౰͠ɺ

    υϝΠϯϞσϧͷ࣮૷Λߦ͏


    • ಡΈࠐΈϞσϧͷ୯७Խ

    DTOͷΈ΁

    View Slide

  62. CQRSʹΑͬͯղܾ͞ΕΔ໰୊
    • ಡΈࠐΈϞσϧ͸ɺཁ݅ʹ߹Θͤͨ

    ͞·͟·ͳσʔλϕʔεΛར༻͠

    ಡΈࠐΈϞσϧͷύϑΥʔϚϯεΛվળ


    • ॻ͖ࠐΈϞσϧ΋ಉ༷ʹ

    ཁ݅ʹ߹ΘͤͨσʔλϕʔεΛར༻

    View Slide


  63. • ϥϯΩϯάॲཧ

    ͋Δظؒ·ͰͷσʔλΛ࢖ͬͨ

    ϥϯΩϯάΛੜ੒


    • ੥ٻσʔλͷੜ੒
    
 

    ͳͲ

    View Slide

  64. ϥϯΩϯά࡞੒໰୊
    • ϦΫΤετຖʹϥϯΩϯά࡞੒

    -> εέʔϧ͠ͳ͍

    • ྫ͑͹1ԯલޙͷશσʔλʹରͯ͠

    ౎౓ΫΤϦΛ౤͛ͯऔಘ͢Δ

    View Slide

  65. ঎඼ͷϥϯΩϯάྫ
    • ྫ͑͹

    ঎඼ͦͷ΋ͷΛѻ͏Ϟσϧͱ

    ϥϯΩϯάΛߏ੒͢Δ঎඼ͷϞσϧΛ

    ڞ௨Խͯ͠͠·͏

    View Slide

  66. ঎඼ͷϥϯΩϯάྫ
    • ྫ͑͹

    ঎඼ͦͷ΋ͷΛѻ͏Ϟσϧͱ

    ϥϯΩϯάΛߏ੒͢Δ঎඼ͷϞσϧΛ

    ڞ௨Խͯ͠͠·͏

    -> ౰વμϝ

    View Slide

  67. ϥϯΩϯά࡞੒໰୊ղܾ
    • લ೔·ͰͷσʔλΛ࢖ͬͯ

    ϥϯΩϯάΛ࡞Δཁ݅ͷ৔߹

    ʢཁ݅ʹΑͬͯมΘΓ·͢ʣ


    • σʔλͷߏ੒ཁૉ͸ෆมͰ

    ౎౓ੜ੒͢Δඞཁ͸ͳ͍

    ࣄલʹσʔλΛੜ੒͠ɺϦʔυΛ୲౰͢Δσʔλ
    ϕʔεʹอ࣋

    View Slide

  68. ϥϯΩϯά࡞੒໰୊ղܾ
    • ϥϯΩϯάʹ͍ͭͯͷ஌͕ࣝͳ͘ͱ΋

    ಘΒΕΔ͜ͱ͕Ͱ͖Δ


    • ElasticsearchͷΤΠϦΞεͳͲΛ

    ར༻͢Δ͜ͱͰ༰қʹରԠՄೳ

    View Slide

  69. ϥϯΩϯά࡞੒໰୊ղܾ
    • ϥϯΩϯάੜ੒ʹෆ۩߹͕͋ͬͨ৔߹ɺ

    ࠶౓ੜ੒͢Ε͹ྑ͍


    • ো֐͕͋ͬͯ΋࠶࣮ߦ͢Ε͹Α͍

    View Slide

  70. CQRS ར఺

    View Slide

  71. CQRS ར఺
    • ଱ো֐ੑͷ޲্


    • εέʔϥϏϦςΟ


    • ޮ཰ͷྑ͍σʔλϕʔεͷબ୒


    • పఈͨؔ͠৺ͷ෼཭

    View Slide

  72. CQRS ܽ఺

    View Slide

  73. CQRS ܽ఺
    • ҰͭҰͭͷػೳ͸γϯϓϧ

    ߏ੒͢Δཁૉ͕૿͑ΔͨΊશମͰݟΔͱ
    ෳࡶԽ

    • ϨϓϦέʔγϣϯͷλΠϜϥά

    View Slide

  74. ෳࡶԽ
    • CUDΞϓϦέʔγϣϯ

    • RΞϓϦέʔγϣϯ


    • ಡΈࠐΈϞσϧߋ৽ΞϓϦέʔγϣϯ

    View Slide

  75. ෳࡶԽ
    • ѻ͏σʔλϕʔε͕૿͑Ε͹ɺ

    ͦΕͧΕͷσʔλϕʔεʹ߹Θͤͨ

    ؅ཧɺӡ༻ํ๏͕ඞཁ


    • ։ൃ࣌ʹෳ਺ͷσʔλϕʔεͷ஌͕ࣝ

    ඞਢ

    View Slide

  76. ϨϓϦέʔγϣϯͷλΠϜϥά
    • γϯϓϧͳϥϯΩϯάͳͲ͸໰୊ͳ͠

    • ϦΞϧλΠϜੑ͕ཁٻ͞ΕΔॲཧ

    ྫ) ঎඼͕ొ࿥͞ΕͨΒଈ

    ݕࡧΫΤϦͰώοτͰ͖Δ༷ʹͯ͠ʂ

    View Slide

  77. ϨϓϦέʔγϣϯͷλΠϜϥά
    • ͍͍ͶϘλϯΛԡͨ͠ΒΠϯΫϦϝϯτ/
    σΫϦϝϯτͤͯ͞ɺ͍͍ͶॱͰιʔτ


    • ϝοηʔδ͕౤ߘ͞ΕͨΒɺ

    ϑΥϩϫʔશһʹϦΞϧλΠϜͰ௨஌

    View Slide

  78. CQRS͚ͩͰ͸ղܾ͕Ͱ͖ͳ͍
    • DBͷτϦΨʔͳͲΛ༻͍ͯมߋΛݕ஌

    ҟͳΔσʔλϕʔεΛબ୒͢Δͱ

    ରԠෆՄೳ


    • ϦʔυϞσϧߋ৽༻ϓϩηεΛ

    ༻ҙ͠ͳ͚Ε͹ͳΒͳ͍

    ͕ɺมߋͷݕ஌͕͏·͘Ͱ͖ͳ͍

    View Slide

  79. ྫ֎
    • Debezium


    • DynamoDB streams


    • LinkedIn Databus
    
 

    ͳͲ͸ॻ͖ࠐΈΛݕ஌ͯ͠௨஌Մೳ

    View Slide

  80. CQRS͚ͩͰ͸ղܾ͕Ͱ͖ͳ͍
    • ҟͳΔσʔλϕʔε΁ͷίϛοτ

    • 2ϑΣʔζίϛοτରԠ͸೉͍ͨ͠Ί

    ආ͚ͳ͚Ε͹ͳΒͳ͍

    View Slide

  81. ϑϨʔϜϫʔΫͰղܾͰ͖Δ͡ΌΜʂ
    • ྫ͑͹Laravel

    Queue͸ɺPHPͷΦϒδΣΫτΛ

    γϦΞϥΠζ͠QueueʹಥͬࠐΜͩ෺


    • पลγεςϜ͕PHPͩͱ͸ݶΒͳ͍

    View Slide

  82. Event Sourcing

    View Slide

  83. Event Sourcing
    • ΠϕϯτΛه࿥ͯ͠࠶ݱ͢Δύλʔϯ


    • ΠϕϯτΛΠϕϯτετΞʹอଘ͠ਅͷιʔεʹ


    • ه࿥͞ΕͨΠϕϯτ͔ΒΦϒδΣΫτΛ෮ݩ


    • Πϕϯτ͸ෆม

    View Slide

  84. Event Sourcing
    • ಡΈࠐΈ͕ར༻͢Δσʔλϕʔε΁ͷ

    ൓өʹඞਢ


    • ৴པͰ͖Δਅͷσʔλιʔεʹ

    ΠϕϯτετΞʹσʔλ͕͋Ε͹ྑ͍

    View Slide

  85. Message Brokerબఆ
    • PubSubͰشൃੑͷͳ͍΋ͷΛબ୒͢Δ


    • ϝοηʔδอ؅͕ՄೳͰɺ࠶ݱ͢Δ͜ͱ
    ͕Մೳͳ΋ͷΛ࠾༻͢Δͷ͕๬·͍͠


    • εέʔϥϒϧͰ͋Δ͜ͱ

    View Slide

  86. ͓͢͢Ί͸ʁ
    • Message Broker͸εέʔϥϏϦςΟॏࢹ


    • ௚ۙͷΠϕϯτΛ͙͢ʹऔಘͰ͖Δ΋ͷ


    • ۤ࿑ͨ͘͠ͳ͚Ε͹Apache Kafka

    (AWS MSK / Con
    f
    l
    uent ͳͲ)

    View Slide

  87. Event Sourcing


    CQRS

    View Slide

  88. CQRS

    View Slide

  89. CQRS
    σʔλߋ৽͕ൃੜʂ

    ৽͍͠σʔλૹΓ·͢Ͷ

    View Slide

  90. ղܾͰ͖Δ໰୊

    View Slide

  91. ෳࡶ͔ͭϋΠύϑΥʔϚϯεͳ

    ݕࡧ

    View Slide

  92. N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ
    εφοϓγϣοτతʹσʔλΛ

    ॻ͖ࠐΈ

    MBTUJOTFSU*%͕Ͳ͏ͯ͠΋࢖͍͍ͨ৔߹ͳͲ

    View Slide

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

    View Slide

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

    View Slide

  95. N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ
    &MBTUJDTFBDI΁ॻ͖ࠐΈ

    ಛఆͷϨίʔυͷΈॻ͖׵͑Δ

    ྫ͑͹ϥΠΫ਺΍ɺίϝϯτ਺ͳͲ

    View Slide

  96. N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ
    ಡΈࠐΈ͸γϯϓϧʹ

    ΠϯσοΫεʹ໰͍߹ΘͤΔͷΈ

    ෳࡶͳܭࢉॲཧ͸ߦΘͳ͍

    View Slide

  97. ϝϦοτ
    • ॴҦεϚʔτUIύλʔϯΛ

    ଞʹӨڹΛ༩͑Δ͜ͱͳ࣮͘ݱ


    • ॻ͖ࠐΈͰඞཁͱ͞ΕΔਖ਼نԽΛ่͢͜ͱͳ͘

    ରԠՄೳ


    • ಡΈࠐΈΛεέʔϧͤ͞΍͍͢

    View Slide

  98. ϝϦοτ
    • ಡΈࠐΈϞσϧͷߋ৽ॲཧ΋ࢸͬͯ؆୯

    • ৔߹ʹΑͬͯ͸ϏδωεϩδοΫΛ࣮૷
    ͢Δ͜ͱ΋͋ΓɺෳࡶʹͳΒͳ͍Α͏ʹ
    ஫ҙ͢Δ

    View Slide

  99. ஫ҙ
    • Ϩίʔυʹߋ৽ɺ

    ࡟আ͕ൃੜ͢Δ৔߹

    μʔςΟϦʔυʹ஫ҙ

    View Slide

  100. ෼ࢄτϥϯβΫγϣϯ

    View Slide

  101. ෼ࢄτϥϯβΫγϣϯ
    • ಡΈࠐΈϞσϧߋ৽ϓϩηε͕

    ෳ਺ͷσʔλϕʔεʹ

    ॻ͖ࠐ·ͳ͚Ε͹͍͚ͳ͍έʔε


    • 2ϑΣʔζίϛοτ͸ίετ͕ߴ͍

    View Slide

  102. ෼ࢄτϥϯβΫγϣϯ͸೉͘͠ɺෳࡶ
    • ෺ཧతʹҟͳΔσʔλϕʔεͰ

    ॲཧ͕ࣦഊͨ͠৔߹

    • औΓফ͢ॲཧΛ૸Βͤͳ͚Ε͹ͳΒͳ͍


    • NoSQL΍KafkaͳͲʹ͸ͳ͍

    View Slide

  103. ෼ࢄτϥϯβΫγϣϯΛ࢖Θͳ͍
    • ҰͭͷϓϩηεͰ

    ෳ਺σʔλϕʔε΁ॻ͖ࠐΉͷΛආ͚Δ


    • Ͳ͏ͯ͠΋ආ͚ΒΕͳ͍৔߹͸

    ϚΠΫϩαʔϏεΞʔΩςΫνϟͷ

    τϥβΫγϣϯରࡦͷҰͭɺSagaΛར༻

    View Slide

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

    View Slide

  105. ίϨΦάϥϑΟͷαʔΨ
    ΩονϯαʔϏε͕

    ঎඼ड஫ΠϕϯτΛফඅ
    1&/%*/(ঢ়ଶͱ͢Δ

    View Slide

  106. ίϨΦάϥϑΟͷαʔΨ
    ΩονϯαʔϏε͕

    ঎඼༻ҙΠϕϯτΛൃߦ

    View Slide

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

    View Slide

  108. ίϨΦάϥϑΟͷαʔΨ
    ձܭαʔϏε͕

    ܾࡁ׬ྃΠϕϯτΛൃߦ

    View Slide

  109. ίϨΦάϥϑΟͷαʔΨ
    ΩονϯαʔϏε͕

    ܾࡁ׬ྃΠϕϯτΛফඅ

    ࠷ऴతͳΠϕϯτΛऔಘ͢Δ·Ͱ
    "8"*5*/(ঢ়ଶͱ͢Δ

    View Slide

  110. ίϨΦάϥϑΟͷαʔΨ
    ঎඼ड஫αʔϏε͕

    ܾࡁ׬ྃΠϕϯτΛফඅ

    View Slide

  111. ίϨΦάϥϑΟͷαʔΨ
    ঎඼ड஫αʔϏε͕

    ड஫Λਖ਼ৗऴྃͱݟ၏͠௨஌

    View Slide

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

    View Slide

  113. ίϨΦάϥϑΟͷαʔΨ ϝϦοτ
    • ର৅͕গͳ͘ɺγϯϓϧͳॲཧͷϑϩʔ
    ʹ࠷ద

    • ॲཧͷ੹຿͕෼ࢄ͍ͯ͠ΔͨΊ

    ୯Ұো֐఺ͳ͠

    View Slide

  114. ίϨΦάϥϑΟͷαʔΨ σϝϦοτ
    • ෼ࢄ͍ͯ͠Δ͕ނʹΘ͔Γʹ͍͘


    • ॥؀ґଘ


    • ݁߹ςετͷ೉қ౓͕ߴ͍


    • ؔ܎͢ΔαʔϏεͷΠϕϯτ͸શͯαϒεΫ
    ϥΠϒ͢Δඞཁ͕͋Δ

    View Slide

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

    View Slide

  116. ΦʔέετϨʔγϣϯͷαʔΨ
    ΩονϯαʔϏε͕

    ঎඼ड஫ΠϕϯτΛফඅ
    1&/%*/(ঢ়ଶͱ͢Δ

    View Slide

  117. ΦʔέετϨʔγϣϯͷαʔΨ
    ΩονϯαʔϏε͕

    ঎඼༻ҙΠϕϯτΛൃߦ

    View Slide

  118. ΦʔέετϨʔγϣϯͷαʔΨ
    ΦʔέετϨλʔͱͯ͠

    ঎඼༻ҙΠϕϯτΛফඅ

    View Slide

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

    View Slide

  120. ΦʔέετϨʔγϣϯͷαʔΨ
    ΫϨδοτܾࡁґཔΠϕϯτΛ

    ফඅ

    ܾࡁΛߦ͏

    View Slide

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

    ൃߦ

    View Slide

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

    View Slide

  123. ΦʔέετϨʔγϣϯͷαʔΨ ϝϦοτ
    • ॥؀ґଘͳ͠


    • ؔ܎͢ΔαʔϏεͷΠϕϯτΛαϒεΫ
    ϥΠϒ͢Δඞཁ͕ͳ͍


    • ίϨΦάϥϑΟΑΓ΋εςʔλεΛ࣋ͨ
    ͳ͍ͨΊɺϩδοΫ͕୯७ʹ

    View Slide

  124. ΦʔέετϨʔγϣϯͷαʔΨ ϝϦοτ
    • ΦʔέετϨʔλʹϏδωεϩδοΫ͕

    ूத͠΍͘͢ͳΔ

    ίʔσΟωʔτ͚ͩΛߦ͏Α͏ʹ

    ϏδωεϩδοΫΛഉআ͢Δඞཁ͋Γ


    • ϫʔΫϑϩʔܗʹͳΔͨΊɺ

    ো֐఺ʹͳΔՄೳੑ͋Γ

    View Slide

  125. αʔΨͷ஫ҙ఺
    • ߋ৽σʔλͷ૕ࣦ


    • μʔςΟϦʔυ


    • ൓෮ෆೳಡΈऔΓ

    View Slide

  126. αʔΨͷ஫ҙ఺
    • ෼ࢄॲཧ͸Ԟ͕ਂ͘೉қ౓͕ߴ͍


    • PHPͰ࣮ݱͤ͞Δͷ͸͓͢͢Ί͠·ͤΜ


    • ಘҙͳݴޠɺ࢓૊Έʹ೚ͤΑ͏

    View Slide

  127. ES+CQRSͷ

    ΤοηϯεΛऔΓೖΕΔ

    View Slide

  128. ES+CQRSͷൃల
    • DDD޲͚ͷղܾύλʔϯͰ͸͋Δ͕ɺ

    ۙ೥Ͱ͸ΤοηϯεΛऔΓೖΕͨ

    LambdaɺKappaΞʔΩςΫνϟ͕͋Δ

    (େن໛σʔλॲཧ޲͚ not Web App)

    View Slide

  129. KappaΞʔΩςΫνϟ

    View Slide

  130. KappaΞʔΩςΫνϟ

    View Slide

  131. ·ͱΊ

    View Slide

  132. ·ͱΊ
    • Ϗδωεʹؔ৺Λ࣋ͭ͜ͱ͕ୈҰ


    • ن໛ʹ߹Θͤͨσʔλઃܭ

    ఆظతͳϦϑΝΫλϦϯά

    ཁ݅ͷ෼ੳͰϏδωεΛࢧ͑Δ


    • దࡐదॴΛݟۃΊΔٕज़

    View Slide

  133. ࣄۀΛࢧ͍͑ͯ͜͏

    View Slide