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

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

17d4ef53b432ebf7c566fd6a11345570?s=47 yuuki takezawa
December 11, 2020

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

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

17d4ef53b432ebf7c566fd6a11345570?s=128

yuuki takezawa

December 11, 2020
Tweet

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. ࣄۀΛࢧ͍͑ͯ͜͏