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

  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
  3. ελʔϑΣεςΟόϧגࣜձࣾ

  4. ͦΜͳελʔϑΣεςΟόϧͰ͸ ΤϯδχΞืूதʂʂʂ

  5. Caution • ࠓճͷ಺༰͸શͯͷΞϓϦέʔγϣϯͰ 
 ద༻Ͱ͖Δ΋ͷͰ͸͋Γ·ͤΜ • ࣮ࡍʹຊਓ͕࠾༻͍ͯ͠Δ΋ͷ 
 ϕʔεͷ಺༰Ͱ͢

  6. Agenda • ΞϓϦέʔγϣϯͷ੒௕ͱ 
 λʔχϯάϙΠϯτ 
 • ղܾ͢ΔͨΊͷ஌ࣝ • ෼ࢄτϥϯβΫγϣϯରࡦ

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

  8. খ͞ͳνʔϜ • σʔλϕʔεઃܭ + ORM etc 
 ϑϨʔϜϫʔΫͰߏங͞ΕΔ 
 ΞϓϦέʔγϣϯ

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

  9. ෳ਺ͷνʔϜ • ૿͑ΔΞϓϦέʔγϣϯػೳ 
 • ։ൃνʔϜͷ૿һ 
 εΩϧ͸༷ʑ

  10. ΞϓϦέʔγϣϯͱσʔλϕʔε • ORMͰN+1͕૿͑Δέʔε 
 ൃߦͨ͠SQL͸ 
 ΞϓϦέʔγϣϯʹ߹͍ͬͯΔ͔ʁ • ϝϞϦɺCPUͳͲͷ૿ڧͰ৐Γ੾Δ 


    ໰୊͕ޙճ͠ʹͳΔ͜ͱ΋
  11. ΍ͬͯ͠·͍͕ͪͳରԠ • σʔλऔಘ؆ུԽͷͨΊͷ 
 σʔλϕʔεઃܭ(;͑Δඇਖ਼نԽ) 
 • ͱΓ͋͑ͣϦετͰશ෦औಘ 
 ͦΕ͔Β1ϨίʔυͣͭৄࡉΛऔಘ͠Α͏

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

    users WHERE user_id = ?; 
 • ͜Ε͕΋͠10000݅औಘͰ 
 ൃߦ͞Ε͍ͯͨΒʁ 
 • ORM͕ѱ͍ͷͰ͸ͳ͘ 
 ద੾ʹར༻Ͱ͖͍ͯͳ͍έʔε
  13. େ͖͘νʔϜͱࣄۀͷ੒௕ • ૿͑ଓ͚ΔΞϓϦέʔγϣϯػೳ 
 • ։ൃνʔϜͷڊେԽ 
 ෳ਺ͷνʔϜߏ੒ͱ 
 ෳ਺ͷεςʔΫϗϧμ

  14. ෆ҆ఆͳΞϓϦέʔγϣϯ΁ • Ϩίʔυ૿Ճɾ࣮૷ίʔυ૿ՃʹΑΔ 
 ͞ΒͳΔύϑΥʔϚϯε௿Լ • ͍͡ΊΒΕଓ͚Δσʔλϕʔε • ͋ͪͪ͜Ͱى͜Γ࢝ΊΔো֐

  15. ࠔ೉ͳཁ݅ͷ࣮ݱ • ϦΫΤετ͝ͱʹϨεϙϯεΛ૊Έཱͯ 
 ΞϓϦέʔγϣϯͷύϑΥʔϚϯεѱԽ 
 • ਖ਼نԽͨ͠͸͍͍΋ͷͷɺཁ݅ʹ߹Θͤ ͨσʔλऔಘίετ૿ 


  16. ΍ͬͯ͠·͍͕ͪͳରԠ • ݪҼ͸Θ͔Γ·ͤΜ͕஗͘ͳ͖ͬͯͨͷͰ Ωϟογϡ͠·͢ 
 -> ෳࡶԽ͢ΔΩϟογϡαʔόʔ • ݪҼ͸Θ͔Γ·ͤΜ͕஗͘ͳ͖ͬͯͨͷͰ Ωϟογϡ͠·͢

    
 -> ΩϟογϡαʔόʹՃ͑ͯCDN΋௥Ճ
  17. ΋͏खஈ͕ͳ͍ɾɾɾʂ

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

  19. σʔλॲཧͷෳࡶԽ Ϣʔβʔ৘ใมߋ Ϣʔβʔ৘ใ࡟আ Ϣʔβʔ৘ใ͕ݟ͔ͭΒͳ͍ͨΊ 
 σʔλॲཧ͝ͱʹ"1*ΞΫηε ͋ͦ͜ͱͦ͜Ͱ৘ใ͕ҧ͏ʂ 
 Ͳͷσʔλ͕ຊ෺ʁ શͯͷΞϓϦέʔγϣϯ͔Β

    
 Ωϟογϡͳ͠ͰΞΫηε 
 ৗʹߴෛՙঢ়ଶʹ
  20. ࢭΊΒΕͳ͍ ϏδωεͷՃ଎

  21. ฐ֐ • ϦϦʔε༏ઌͷͨΊɺ 
 ܧ͗଍͠ͷΞϓϦέʔγϣϯ 
 • εςʔΫϗϧμ૿Ճʹ൐͏ 
 ΞϓϦέʔγϣϯͷෳࡶԽ

    • খதن໛ͷΞϓϦέʔγϣϯ࣌୅ͷ 
 ઃܭͱ࣮૷༝དྷͷෆ۩߹͕૿Ճ
  22. σʔλઃܭ༝དྷͷ໰୊ • େྔσʔλͷϑϧεΩϟϯ 
 • INDEXෆ଍ͷͨΊͷύϑΥʔϚϯε௿Լ • γϯϓϧͳߏ੒ނͷػೳ௥Ճ࣌ͷ 
 ΫΤϦෳࡶԽ

  23. ࣮૷ίʔυ༝དྷͷฐ֐ • ػೳ௥ՃͷͨΊͷௐࠪʹ2ϲ݄ 
 • ͞·͟·ͳཁҼͷੵΈॏͶʹΑΓ 
 བྷΈ߹ͬͨίʔυͰϞνϕʔγϣϯμ΢ϯ • ͕͔͔࣌ؒͬͯ͠·͏͕ނɺ

    
 ϏδωενʔϜʹ·ͣҰݴ 
 ʮ͕͔͔࣌ؒΔͷͰͰ͖·ͤΜʯ
  24. ͦͷ݁Ռ • Ϗδωεͷ੒௕ػձଛࣦ • γϡϦϯΫ࢝͠ΊΔࣄۀ • ଞࣾʹෛ͚ͯ͠·͏ࣄۀ • څ༩্͕͕Βͳ͍ɾɾ

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

  26. ࣄۀ͸੒௕͢Δ΋ͷ • ΞϓϦέʔγϣϯ͸ϦϦʔε͔ͯ͠Β੒௕ • ૝ఆ֎ͷ੒௕Λ਱͛Δ 
 WebΞϓϦέʔγϣϯ • ͞·͟·ͳϏδωεͷՄೳੑΛߟྀͨ͠ 


    σʔλઃܭ
  27. ੒௕Λࢧ͑Δʹ͸ʁ • ఆظతͳσʔλϕʔεϦϑΝΫλϦϯάɺ ΞϓϦέʔγϣϯͷϦϑΝΫλϦϯά 
 ͕࣮ࢪͰ͖Δ͔ • ͋Γͱ͋ΒΏΔՄೳੑΛ૝ఆͨ͠σʔλ ઃܭ͸ෆՄೳ 27

  28. ΞϓϦέʔγϣϯͰى͜Δ໰୊ • ਖ਼نԽ͞Εͨςʔϒϧͱ 
 ඇਖ਼نԽςʔϒϧͷઓ͍ • ෳࡶԽ͢Δॻ͖ࠐΈॲཧͱଟൃ͢ΔN+1 • σʔλϞσϧͱυϝΠϯϞσϧ͕ҟͳΔ

  29. Α͋͘ΔN+1 • ঎඼Λऔಘ͠ ஍ҬɾΩονϯ৘ใΛऔಘ 
 • ΠΠωɺΫνίϛ਺΋औಘ͠ͳ͚Ε͹...

  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() ) ) ; } }
  31. ͜Μͳςʔϒϧઃܭͨ͠هԱ͸͋Γ·ͤΜ͔ʁ • UIΛߏ੒͢Δཁૉ͕औಘ͠΍͍͢ 
 ςʔϒϧઃܭ • JOIN͢Δͱ஗͘ͳΔʁ 
 ͳΒ͹௒ϫΠυΧϥϜઃܭͩ

  32. ͜Μͳςʔϒϧ͋Γ·ͤΜ͔ʁ • ͳʹ͔ͷεςʔλεΛฦ͢ʹ͸ 
 ͋ͷΧϥϜͱ͜ͷΧϥϜͱ͋ΕΛɾɾɾɻ • ϏδωεϩδοΫ͕ςʔϒϧʹ͋Δ • ΧϥϜ໊ͱ༻్͕શ͘ผ

  33. ΞϓϦέʔγϣϯͰى͜Δ໰୊ • ඇਖ਼نԽςʔϒϧ͸ಛఆͷཁ݅Ͱ͸ղܾ Ͱ͖Δ͕ɺͦΕҎ֎ʹ͸೉͍͠ɻ 
 σʔλநग़ܥ΍ɺ 
 αʔϏε֦େɺ࢓༷มߋͳͲʹ͸ແཧ͕ ͋Δ

  34. ཁ݅ͱσʔλߏ଄ͷࠩ෼͸ ඞͣ͋Δ

  35. ॻ͖ࠐΈͱಡΈࠐΈͷҧ͍ ॻ͖ࠐΈ ಡΈࠐΈ Ұ؏ੑɾՄ༻ੑ τϥϯβΫγϣϯΛ༻ ͍ͯॻ͖ࠐΈΛߦ͏ Ұ؏ੑॏࢹ ݁Ռ੔߹ੑͱՄ༻ੑ σʔλ ਖ਼نԽ

    ඇਖ਼نԽ εέʔϥϏϦςΟ Ұൠతʹ εέʔϥϏϦςΟ͸ 
 ॏཁͰ͸ͳ͍ ଟ͘ൺॏΛ઎Ί͓ͯΓ 
 εέʔϥϏϦςΟ͸ ॏཁ
  36. ߟ͑ΔϙΠϯτ • ॻ͖ࠐΈॲཧͰɺಡΈࠐΈཁ݅ʹରԠ͢Δ ͨΊͷॲཧ͕ଟ͍ • ಡΈࠐΈཁ݅Λ஌Βͳ͚Ε͹ॻ͖ࠐΊͳ͍ • Ϩεϙϯεͱσʔλߏ଄͕͋·Γʹ΋ҧ͍ ͗͢Δ

  37. ߟ͑ΔϙΠϯτ • σʔλͷਖ਼͠͞ͱཁ݅Ϩϕϧͷਖ਼͠͞͸ ҧ͏΋ͷ • ͲͪΒ͔ʹدͤͨઃܭʹ͢Δɺ 
 Ͱ͸ͳ྆͘ํΛ෼཭Ͱ͖Ε͹γϯϓϧʹ 


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

  39. ॻ͖ࠐΈଟ਺ͷΞϓϦέʔγϣϯ • ॻ͖ࠐΈʹڧ͘ɺ 
 εέʔϧ͕༰қͳσʔλϕʔε΁ 
 Cassandra, DynamoDB etc

  40. ಡΈࠐΈଟ਺ͷΞϓϦέʔγϣϯ • RDBMSͷΈͰ΋े෼ 
 • LIKEݕࡧͳͲ͸Elasticsearch, Solr΁

  41. ղܾɺͰ͖ͳ͍ɾɾ • ϛυϧ΢ΣΞϨϕϧͰͷղܾํ๏Ͱɺ 
 ΞϓϦέʔγϣϯࣗମ͕࣋ͭ 
 ෳࡶ͞͸ղܾͰ͖ͳ͍ɻ • ύϑΥʔϚϯε໘Ͱͷվળ͸Ͱ͖Δ͕ɺ 


    ࣄۀͷ੒௕Λࢧ͑ΔεϐʔσΟ͞͸ͳ͍
  42. ΞϓϦέʔγϣϯϨϕϧͷ՝୊

  43. ΞϓϦέʔγϣϯϨϕϧͰͷ՝୊ • ෼ੳΛߦΘͳ͍͜ͱʹΑΔޡͬͨ൚༻Խ • ෳ਺ͷίϯςΩετ͕ࠞࡏ • ͳΜͰ΋͠Α͏ͱ͢Δॲཧ

  44. ڥք෇͚ΒΕͨίϯςΩετ ঎඼͸ 
 ঎඼໊ 
 ѻ͍ͬͯΔΩονϯళฮ ஋ஈ 
 ൢചظؒͰ͢

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


  46. ڥք෇͚ΒΕͨίϯςΩετ ঎඼͸ 
 ঎඼໊ 
 ݸ਺ ഑ૹઌͰ͢

  47. ڥք෇͚ΒΕͨίϯςΩετ QSPEVDU/BNF 
 LJUDIFO/BNF QSJDF TBMFT1FSJPE RVBOUJUZ TJQQJOH"EESFTT 


  48. ڥք෇͚ΒΕͨίϯςΩετ ঎඼͸ 
 ঎඼໊ 
 ஋ஈͰ͢

  49. ڥք෇͚ΒΕͨίϯςΩετ QSPEVDU/BNF 
 LJUDIFO/BNF QSJDF TBMFT1FSJPE RVBOUJUZ TJQQJOH"EESFTT 


  50. ڥք෇͚ΒΕͨίϯςΩετ • ঎඼ͱ͍͏ݴ༿Ͱ΋಺༰͕ҟͳΔ • ΞϓϦέʔγϣϯ಺Ͱ΋ଟʑ • ڞ௨ԽͰ͖Δ΋ͷͰ͸ͳ͍

  51. ڥք෇͚ΒΕͨίϯςΩετ • ྫ͑͹ɺ঎඼Λࢦ͢ݴ༿ͱ 
 DB্ͷproductsςʔϒϧ͸Ұக͠ͳ͍ έʔε͕ଟ͍ 
 • ͲͪΒ͔ʹ߹ΘͤΒΕΔ΋ͷͰ͸ͳ͍ͱ 


    ೝࣝ͢Δ͜ͱ
  52. ॻ͖ࠐΈͱಡΈࠐΈΛ ෼཭ͯ͠Έͯ͸Ͳ͏͔

  53. CQRS

  54. CQRS • ॻ͖ࠐΈϞσϧͱಡΈࠐΈϞσϧΛִ཭ • υϝΠϯϞσϧͷ෼཭͚ͩͰͳ͘ 
 σʔλετΞ͢Β΋෺ཧతʹผ෺ʹ෼཭Մೳ 
 ؔ৺ࣄͷ෼཭Λపఈ 


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

  56. CQRS ͳΜΒ͔ͷม׵ॲཧΛ௨ͯ͡ 
 3FBEͷσʔλΛߋ৽

  57. CQRS • CommandͱReadʹڥքઢ͕͋Δ • CommandͱRead͸ 
 ಉ͡ϦϙδτϦɺϢʔεέʔεͱ͠ͳ͍ • ಉ͡ςʔϒϧ͸ࢀর͠ͳ͍

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

  59. େ͖͘ͳͬͨαʔϏεͰղܾ͞ΕΔ໰୊ • ෳࡶԽ͍ͯͨ͠ಡΈࠐΈϞσϧͷ 
 ύϑΥʔϚϯεΛվળ • ಡΈࠐΈϞσϧʹؔ͢Δ 
 εέʔϥϏϦςΟ޲্

  60. ஫ҙ఺ • CQRS͸ಛఆͷػೳʹͷΈద༻Մೳ 
 ΞϓϦέʔγϣϯશͯʹద༻͢Δ΋ͷͰ͸ ͳ͍ • ॻ͖ࠐΈϞσϧͱಡΈࠐΈϞσϧͷࠩ෼͕Α ͘Θ͔Βͳ͍ 


    -> ཁ݅ͷ෼ੳΛ·ͣ͠·͠ΐ͏
  61. CQRSʹΑͬͯղܾ͞ΕΔ໰୊ • ॻ͖ࠐΈϞσϧ͸CUDΛ୲౰͠ɺ 
 υϝΠϯϞσϧͷ࣮૷Λߦ͏ • ಡΈࠐΈϞσϧͷ୯७Խ 
 DTOͷΈ΁

  62. CQRSʹΑͬͯղܾ͞ΕΔ໰୊ • ಡΈࠐΈϞσϧ͸ɺཁ݅ʹ߹Θͤͨ 
 ͞·͟·ͳσʔλϕʔεΛར༻͠ 
 ಡΈࠐΈϞσϧͷύϑΥʔϚϯεΛվળ • ॻ͖ࠐΈϞσϧ΋ಉ༷ʹ 


    ཁ݅ʹ߹ΘͤͨσʔλϕʔεΛར༻
  63. ྫ • ϥϯΩϯάॲཧ 
 ͋Δظؒ·ͰͷσʔλΛ࢖ͬͨ 
 ϥϯΩϯάΛੜ੒ • ੥ٻσʔλͷੜ੒ 


    
 ͳͲ
  64. ϥϯΩϯά࡞੒໰୊ • ϦΫΤετຖʹϥϯΩϯά࡞੒ 
 -> εέʔϧ͠ͳ͍ 
 • ྫ͑͹1ԯલޙͷશσʔλʹରͯ͠ 


    ౎౓ΫΤϦΛ౤͛ͯऔಘ͢Δ
  65. ঎඼ͷϥϯΩϯάྫ • ྫ͑͹ 
 ঎඼ͦͷ΋ͷΛѻ͏Ϟσϧͱ 
 ϥϯΩϯάΛߏ੒͢Δ঎඼ͷϞσϧΛ 
 ڞ௨Խͯ͠͠·͏

  66. ঎඼ͷϥϯΩϯάྫ • ྫ͑͹ 
 ঎඼ͦͷ΋ͷΛѻ͏Ϟσϧͱ 
 ϥϯΩϯάΛߏ੒͢Δ঎඼ͷϞσϧΛ 
 ڞ௨Խͯ͠͠·͏ 


    -> ౰વμϝ
  67. ϥϯΩϯά࡞੒໰୊ղܾ • લ೔·ͰͷσʔλΛ࢖ͬͯ 
 ϥϯΩϯάΛ࡞Δཁ݅ͷ৔߹ 
 ʢཁ݅ʹΑͬͯมΘΓ·͢ʣ • σʔλͷߏ੒ཁૉ͸ෆมͰ 


    ౎౓ੜ੒͢Δඞཁ͸ͳ͍ 
 ࣄલʹσʔλΛੜ੒͠ɺϦʔυΛ୲౰͢Δσʔλ ϕʔεʹอ࣋
  68. ϥϯΩϯά࡞੒໰୊ղܾ • ϥϯΩϯάʹ͍ͭͯͷ஌͕ࣝͳ͘ͱ΋ 
 ಘΒΕΔ͜ͱ͕Ͱ͖Δ • ElasticsearchͷΤΠϦΞεͳͲΛ 
 ར༻͢Δ͜ͱͰ༰қʹରԠՄೳ

  69. ϥϯΩϯά࡞੒໰୊ղܾ • ϥϯΩϯάੜ੒ʹෆ۩߹͕͋ͬͨ৔߹ɺ 
 ࠶౓ੜ੒͢Ε͹ྑ͍ • ো֐͕͋ͬͯ΋࠶࣮ߦ͢Ε͹Α͍

  70. CQRS ར఺

  71. CQRS ར఺ • ଱ো֐ੑͷ޲্ • εέʔϥϏϦςΟ • ޮ཰ͷྑ͍σʔλϕʔεͷબ୒ • పఈͨؔ͠৺ͷ෼཭

  72. CQRS ܽ఺

  73. CQRS ܽ఺ • ҰͭҰͭͷػೳ͸γϯϓϧ 
 ߏ੒͢Δཁૉ͕૿͑ΔͨΊશମͰݟΔͱ ෳࡶԽ 
 • ϨϓϦέʔγϣϯͷλΠϜϥά

  74. ෳࡶԽ • CUDΞϓϦέʔγϣϯ 
 • RΞϓϦέʔγϣϯ • ಡΈࠐΈϞσϧߋ৽ΞϓϦέʔγϣϯ

  75. ෳࡶԽ • ѻ͏σʔλϕʔε͕૿͑Ε͹ɺ 
 ͦΕͧΕͷσʔλϕʔεʹ߹Θͤͨ 
 ؅ཧɺӡ༻ํ๏͕ඞཁ • ։ൃ࣌ʹෳ਺ͷσʔλϕʔεͷ஌͕ࣝ 


    ඞਢ
  76. ϨϓϦέʔγϣϯͷλΠϜϥά • γϯϓϧͳϥϯΩϯάͳͲ͸໰୊ͳ͠ 
 • ϦΞϧλΠϜੑ͕ཁٻ͞ΕΔॲཧ 
 ྫ) ঎඼͕ొ࿥͞ΕͨΒଈ 


    ݕࡧΫΤϦͰώοτͰ͖Δ༷ʹͯ͠ʂ
  77. ϨϓϦέʔγϣϯͷλΠϜϥά • ͍͍ͶϘλϯΛԡͨ͠ΒΠϯΫϦϝϯτ/ σΫϦϝϯτͤͯ͞ɺ͍͍ͶॱͰιʔτ • ϝοηʔδ͕౤ߘ͞ΕͨΒɺ 
 ϑΥϩϫʔશһʹϦΞϧλΠϜͰ௨஌

  78. CQRS͚ͩͰ͸ղܾ͕Ͱ͖ͳ͍ • DBͷτϦΨʔͳͲΛ༻͍ͯมߋΛݕ஌ 
 ҟͳΔσʔλϕʔεΛબ୒͢Δͱ 
 ରԠෆՄೳ • ϦʔυϞσϧߋ৽༻ϓϩηεΛ 


    ༻ҙ͠ͳ͚Ε͹ͳΒͳ͍ 
 ͕ɺมߋͷݕ஌͕͏·͘Ͱ͖ͳ͍
  79. ྫ֎ • Debezium • DynamoDB streams • LinkedIn Databus 


    
 ͳͲ͸ॻ͖ࠐΈΛݕ஌ͯ͠௨஌Մೳ
  80. CQRS͚ͩͰ͸ղܾ͕Ͱ͖ͳ͍ • ҟͳΔσʔλϕʔε΁ͷίϛοτ 
 • 2ϑΣʔζίϛοτରԠ͸೉͍ͨ͠Ί 
 ආ͚ͳ͚Ε͹ͳΒͳ͍

  81. ϑϨʔϜϫʔΫͰղܾͰ͖Δ͡ΌΜʂ • ྫ͑͹Laravel 
 Queue͸ɺPHPͷΦϒδΣΫτΛ 
 γϦΞϥΠζ͠QueueʹಥͬࠐΜͩ෺ • पลγεςϜ͕PHPͩͱ͸ݶΒͳ͍

  82. Event Sourcing

  83. Event Sourcing • ΠϕϯτΛه࿥ͯ͠࠶ݱ͢Δύλʔϯ • ΠϕϯτΛΠϕϯτετΞʹอଘ͠ਅͷιʔεʹ • ه࿥͞ΕͨΠϕϯτ͔ΒΦϒδΣΫτΛ෮ݩ • Πϕϯτ͸ෆม

  84. Event Sourcing • ಡΈࠐΈ͕ར༻͢Δσʔλϕʔε΁ͷ 
 ൓өʹඞਢ • ৴པͰ͖Δਅͷσʔλιʔεʹ 
 ΠϕϯτετΞʹσʔλ͕͋Ε͹ྑ͍

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

  86. ͓͢͢Ί͸ʁ • Message Broker͸εέʔϥϏϦςΟॏࢹ • ௚ۙͷΠϕϯτΛ͙͢ʹऔಘͰ͖Δ΋ͷ • ۤ࿑ͨ͘͠ͳ͚Ε͹Apache Kafka 


    (AWS MSK / Con f l uent ͳͲ)
  87. Event Sourcing CQRS

  88. CQRS

  89. CQRS σʔλߋ৽͕ൃੜʂ 
 ৽͍͠σʔλૹΓ·͢Ͷ

  90. ղܾͰ͖Δ໰୊

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

  92. N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ εφοϓγϣοτతʹσʔλΛ 
 ॻ͖ࠐΈ 
 MBTUJOTFSU*%͕Ͳ͏ͯ͠΋࢖͍͍ͨ৔߹ͳͲ

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

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

  95. N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ &MBTUJDTFBDI΁ॻ͖ࠐΈ 
 ಛఆͷϨίʔυͷΈॻ͖׵͑Δ 
 ྫ͑͹ϥΠΫ਺΍ɺίϝϯτ਺ͳͲ

  96. N+1ͳͲʹΑΔύϑΥʔϚϯεྼԽ ಡΈࠐΈ͸γϯϓϧʹ 
 ΠϯσοΫεʹ໰͍߹ΘͤΔͷΈ 
 ෳࡶͳܭࢉॲཧ͸ߦΘͳ͍

  97. ϝϦοτ • ॴҦεϚʔτUIύλʔϯΛ 
 ଞʹӨڹΛ༩͑Δ͜ͱͳ࣮͘ݱ • ॻ͖ࠐΈͰඞཁͱ͞ΕΔਖ਼نԽΛ่͢͜ͱͳ͘ 
 ରԠՄೳ •

    ಡΈࠐΈΛεέʔϧͤ͞΍͍͢
  98. ϝϦοτ • ಡΈࠐΈϞσϧͷߋ৽ॲཧ΋ࢸͬͯ؆୯ 
 • ৔߹ʹΑͬͯ͸ϏδωεϩδοΫΛ࣮૷ ͢Δ͜ͱ΋͋ΓɺෳࡶʹͳΒͳ͍Α͏ʹ ஫ҙ͢Δ

  99. ஫ҙ • Ϩίʔυʹߋ৽ɺ 
 ࡟আ͕ൃੜ͢Δ৔߹ 
 μʔςΟϦʔυʹ஫ҙ

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

  101. ෼ࢄτϥϯβΫγϣϯ • ಡΈࠐΈϞσϧߋ৽ϓϩηε͕ 
 ෳ਺ͷσʔλϕʔεʹ 
 ॻ͖ࠐ·ͳ͚Ε͹͍͚ͳ͍έʔε • 2ϑΣʔζίϛοτ͸ίετ͕ߴ͍

  102. ෼ࢄτϥϯβΫγϣϯ͸೉͘͠ɺෳࡶ • ෺ཧతʹҟͳΔσʔλϕʔεͰ 
 ॲཧ͕ࣦഊͨ͠৔߹ 
 • औΓফ͢ॲཧΛ૸Βͤͳ͚Ε͹ͳΒͳ͍ • NoSQL΍KafkaͳͲʹ͸ͳ͍

  103. ෼ࢄτϥϯβΫγϣϯΛ࢖Θͳ͍ • ҰͭͷϓϩηεͰ 
 ෳ਺σʔλϕʔε΁ॻ͖ࠐΉͷΛආ͚Δ • Ͳ͏ͯ͠΋ආ͚ΒΕͳ͍৔߹͸ 
 ϚΠΫϩαʔϏεΞʔΩςΫνϟͷ 


    τϥβΫγϣϯରࡦͷҰͭɺSagaΛར༻
  104. ίϨΦάϥϑΟͷαʔΨ ঎඼ड஫ΠϕϯτΛൃߦ

  105. ίϨΦάϥϑΟͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼ड஫ΠϕϯτΛফඅ 1&/%*/(ঢ়ଶͱ͢Δ

  106. ίϨΦάϥϑΟͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼༻ҙΠϕϯτΛൃߦ

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

  108. ίϨΦάϥϑΟͷαʔΨ ձܭαʔϏε͕ 
 ܾࡁ׬ྃΠϕϯτΛൃߦ

  109. ίϨΦάϥϑΟͷαʔΨ ΩονϯαʔϏε͕ 
 ܾࡁ׬ྃΠϕϯτΛফඅ 
 ࠷ऴతͳΠϕϯτΛऔಘ͢Δ·Ͱ "8"*5*/(ঢ়ଶͱ͢Δ 


  110. ίϨΦάϥϑΟͷαʔΨ ঎඼ड஫αʔϏε͕ 
 ܾࡁ׬ྃΠϕϯτΛফඅ 


  111. ίϨΦάϥϑΟͷαʔΨ ঎඼ड஫αʔϏε͕ 
 ड஫Λਖ਼ৗऴྃͱݟ၏͠௨஌ 


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

  113. ίϨΦάϥϑΟͷαʔΨ ϝϦοτ • ର৅͕গͳ͘ɺγϯϓϧͳॲཧͷϑϩʔ ʹ࠷ద 
 • ॲཧͷ੹຿͕෼ࢄ͍ͯ͠ΔͨΊ 
 ୯Ұো֐఺ͳ͠

  114. ίϨΦάϥϑΟͷαʔΨ σϝϦοτ • ෼ࢄ͍ͯ͠Δ͕ނʹΘ͔Γʹ͍͘ • ॥؀ґଘ • ݁߹ςετͷ೉қ౓͕ߴ͍ • ؔ܎͢ΔαʔϏεͷΠϕϯτ͸શͯαϒεΫ

    ϥΠϒ͢Δඞཁ͕͋Δ
  115. ΦʔέετϨʔγϣϯͷαʔΨ ঎඼ड஫ΠϕϯτΛൃߦ

  116. ΦʔέετϨʔγϣϯͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼ड஫ΠϕϯτΛফඅ 1&/%*/(ঢ়ଶͱ͢Δ

  117. ΦʔέετϨʔγϣϯͷαʔΨ ΩονϯαʔϏε͕ 
 ঎඼༻ҙΠϕϯτΛൃߦ

  118. ΦʔέετϨʔγϣϯͷαʔΨ ΦʔέετϨλʔͱͯ͠ 
 ঎඼༻ҙΠϕϯτΛফඅ

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

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

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

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

  123. ΦʔέετϨʔγϣϯͷαʔΨ ϝϦοτ • ॥؀ґଘͳ͠ • ؔ܎͢ΔαʔϏεͷΠϕϯτΛαϒεΫ ϥΠϒ͢Δඞཁ͕ͳ͍ • ίϨΦάϥϑΟΑΓ΋εςʔλεΛ࣋ͨ ͳ͍ͨΊɺϩδοΫ͕୯७ʹ

  124. ΦʔέετϨʔγϣϯͷαʔΨ ϝϦοτ • ΦʔέετϨʔλʹϏδωεϩδοΫ͕ 
 ूத͠΍͘͢ͳΔ 
 ίʔσΟωʔτ͚ͩΛߦ͏Α͏ʹ 
 ϏδωεϩδοΫΛഉআ͢Δඞཁ͋Γ

    • ϫʔΫϑϩʔܗʹͳΔͨΊɺ 
 ো֐఺ʹͳΔՄೳੑ͋Γ
  125. αʔΨͷ஫ҙ఺ • ߋ৽σʔλͷ૕ࣦ • μʔςΟϦʔυ • ൓෮ෆೳಡΈऔΓ

  126. αʔΨͷ஫ҙ఺ • ෼ࢄॲཧ͸Ԟ͕ਂ͘೉қ౓͕ߴ͍ • PHPͰ࣮ݱͤ͞Δͷ͸͓͢͢Ί͠·ͤΜ • ಘҙͳݴޠɺ࢓૊Έʹ೚ͤΑ͏

  127. ES+CQRSͷ 
 ΤοηϯεΛऔΓೖΕΔ

  128. ES+CQRSͷൃల • DDD޲͚ͷղܾύλʔϯͰ͸͋Δ͕ɺ 
 ۙ೥Ͱ͸ΤοηϯεΛऔΓೖΕͨ 
 LambdaɺKappaΞʔΩςΫνϟ͕͋Δ 
 (େن໛σʔλॲཧ޲͚ not

    Web App)
  129. KappaΞʔΩςΫνϟ

  130. KappaΞʔΩςΫνϟ

  131. ·ͱΊ

  132. ·ͱΊ • Ϗδωεʹؔ৺Λ࣋ͭ͜ͱ͕ୈҰ • ن໛ʹ߹Θͤͨσʔλઃܭ 
 ఆظతͳϦϑΝΫλϦϯά 
 ཁ݅ͷ෼ੳͰϏδωεΛࢧ͑Δ •

    దࡐదॴΛݟۃΊΔٕज़
  133. ࣄۀΛࢧ͍͑ͯ͜͏