イベント駆動マイクロサービスアーキテクチャ / Event-Driven Microservices Architecture

660946c5788429ad71546d35e74a709b?s=47 disc99
April 27, 2019

イベント駆動マイクロサービスアーキテクチャ / Event-Driven Microservices Architecture

660946c5788429ad71546d35e74a709b?s=128

disc99

April 27, 2019
Tweet

Transcript

  1. Πϕϯτۦಈ ϚΠΫϩαʔϏεΞʔΩςΫνϟ 4IJOKVLV-5 !EJTD

  2. "CPVU.F w /BNFEJTD
 5XJUUFS!EJTD@ w $PNQBOZΞιϏϡʔגࣜձࣾ
 5FDI-FBE43& w 3FDFOU5PQJDTH31$Ϛείοτ

  3. ຊ೔ͷςʔϚ ΠϕϯτۦಈΞʔΩςΫνϟͰ ͲͷΑ͏ͳՄೳੑ͕ੜ·ΕΔ͔

  4. લఏ w ͜ͷࢿྉͰͷϚΠΫϩαʔϏεͷఆٛ w ͭҎ্ͷγεςϜ͕࿈ܞ͢Δ
 ਺ඦͱ͔਺ઍͷαʔϏε࿈ܞΛ͢Δେاۀ͚͕ͩର৅Ͱ͸ͳ͍  w ͦΕͧΕͷγεςϜ͕֦ுɺ·ͨ࿈ܞ͕૿͑ΔՄೳੑ͕͋Δ w

    ຊ౰ʹϚΠΫϩαʔϏε͕ඞཁ͔ͷٞ࿦͸͠ͳ͍ w $234΍Πϕϯτιʔγϯάͷৄࡉઆ໌͸ׂѪ
  5. BTPWJFXϙΠϯτελʔτ ΠϕϯτۦಈΞʔΩςΫνϟͷ׆༻ࣄྫ

  6. ਐΊํ w લ൒dཧ࿦ฤd w ϦΫΤετϨεϙϯεͷ՝୊ w ΠϕϯτۦಈΞʔΩςΫνϟ w Πϕϯτϕʔε࿈ܞ w

    υϝΠϯΠϕϯτ w ৗறܕͱΠϕϯτۦಈܕ w τϥϯβΫγϣϯ w ޙ൒d࣮ફฤd w BTPWJFXϙΠϯταʔϏε w ઓུ w ઓज़
  7. લ൒ ΠϕϯτۦಈΞʔΩςΫνϟʹΑΓ มΘΔ͜ͱ

  8. ϦΫΤετϨεϙϯεͷ՝୊ͱ Πϕϯτϕʔε࿈ܞ

  9. ϚΠΫϩαʔϏεͷಉظඇಉظ w ͭͷҟͳΔ௨৴ϞʔυʹΑͬͯ࿈ ܞ͕Մೳ w ϦΫΤετϨεϙϯεʢಉظʣ w Πϕϯτϕʔεʢඇಉظʣ

  10. ϦΫΤετϨεϙϯεͷ՝୊ w ͓ޓ͍ͷαʔϏε͕ͦΕͧΕͷؔ܎ੑΛཧղ͍ͯ͠Δඞཁ
 ʢີ݁߹ʣ w ͍ͣΕ͔ͷαʔϏε͕ఀࢭͨ͠৔߹ɺશαʔϏεͷػೳ͕ఀࢭ
 ʢՄ༻ੑʣ

  11. ϦΫΤετϨεϙϯεʹΑΔ࿈ܞ w ରଟϦΫΤετϨεϙϯε࿈ܞ w ଟରଟϦΫΤετϨεϙϯε࿈ܞ w ো֐ൃੜ

  12. ̍ରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ

  13. ̍ରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ w ϙΠϯτػೳ௥Ճ

  14. ̍ରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ w ϙΠϯτػೳ௥Ճ w &$αΠτ͔Βݺͼग़͠

  15. ̍ରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ w ϙΠϯτػೳ௥Ճ w &$αΠτ͔Βݺͼग़͠ ػೳ௥Ճ͝ͱʹ&$αΠτͷमਖ਼

  16. ଟରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ w /FXTαΠτͷ্ཱͪ͛

  17. ଟରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ w /FXTαΠτͷ্ཱͪ͛ w ֤όοΫΤϯυαʔϏεݺͼग़͠

  18. ଟରଟϦΫΤετϨεϙϯε࿈ܞ w όοΫΤϯυαʔϏεΛར༻ͨ͠ &$αΠτ w /FXTαΠτͷ্ཱͪ͛ w ֤όοΫΤϯυαʔϏεݺͼग़͠ ͢΂ͯͷόοΫΤϯυΛཧղ͠ݺͼ ग़͢ඞཁ͕͋Δ

  19. ো֐ൃੜ w όοΫΤϯυαʔϏεͷো֐

  20. ো֐ൃੜ w όοΫΤϯυαʔϏεͷো֐ όοΫΤϯυো֐ͷ఻೻ Մ༻ੑ͕όοΫΤϯυͷ਺ͰԼ͕Δ

  21. ΠϕϯτۦಈΞʔΩςΫνϟ Πϕϯτϕʔε w ಛఆͷग़དྷࣄ Πϕϯτ Λݕ஌͠ɺͦΕʹ൓Ԡͯ͠ॲཧΛ͢Δ w ύϒϦογϟʔ͔Βൃߦ͞ΕͨΠϕϯτΛɺαϒεΫϥΠό͕؂ࢹ͠ɺͦͷΠϕϯτʹؔ͢ΔॲཧΛߦ͏ w ෳࡶੑ͸্͕Γ΍͍͕͢ɺૄ݁߹Ͱ֦ுੑ͕ߴ͘ɺՄ༻ੑ΋޲্

    w ձһొ࿥ͨ͠ w ϓϥϯΛ༧໿ͨ͠ w ࢧ෷͍͕ߦΘΕͨ w ϙΠϯτ͕෇༩͞Εͨ ʜͳͲ Πϕϯτੜ੒ Πϕϯτݕ஌ ৽͍͠Πϕϯτੜ੒ ൓Ԡͯ͠ॲཧ
  22. ΠϕϯτϕʔεʹΑΔ࿈ܞ w ରଟΠϕϯτϕʔε࿈ܞ w ଟରଟΠϕϯτϕʔε࿈ܞ w ো֐ൃੜ

  23. ̍ରଟΠϕϯτϕʔε࿈ܞ w &$αΠτ͔ΒΠϕϯτΛύϒϦο γϡ w όοΫΤϯυαʔϏε͸ΠϕϯτΛ αϒεΫϥΠϒ ύϒϦογϡ αϒεΫϥΠϒ

  24. ̍ରଟΠϕϯτϕʔε࿈ܞ w &$αΠτ͔ΒΠϕϯτΛύϒϦο γϡ w όοΫΤϯυαʔϏε͸ΠϕϯτΛ αϒεΫϥΠϒ w ϙΠϯτػೳ௥Ճ ύϒϦογϡ

    αϒεΫϥΠϒ αϒεΫϥΠϒ
  25. ̍ରଟΠϕϯτϕʔε࿈ܞ w &$αΠτ͔ΒΠϕϯτΛύϒϦο γϡ w όοΫΤϯυαʔϏε͸ΠϕϯτΛ αϒεΫϥΠϒ w ϙΠϯτػೳ௥Ճ όοΫΤϯυ୯ମͰͷػೳ௥Ճ

    ύϒϦογϡ αϒεΫϥΠϒ αϒεΫϥΠϒ
  26. ଟରଟΠϕϯτϕʔε࿈ܞ w &$αΠτ͔ΒΠϕϯτΛύϒϦο γϡ w όοΫΤϯυαʔϏε͸ΠϕϯτΛ αϒεΫϥΠϒ w /FXTαΠτ্ཱͪ͛ ύϒϦογϡ

    αϒεΫϥΠϒ ύϒϦογϡ αϒεΫϥΠϒ
  27. ଟରଟΠϕϯτϕʔε࿈ܞ w &$αΠτ͔ΒΠϕϯτΛύϒϦο γϡ w όοΫΤϯυαʔϏε͸ΠϕϯτΛ αϒεΫϥΠϒ w /FXTαΠτ্ཱͪ͛ ಉ͡ΠϕϯτΛύϒϦογϡ͢Δ͜

    ͱͰಉ༷ͷػೳΛ࣮ݱ ύϒϦογϡ αϒεΫϥΠϒ ύϒϦογϡ αϒεΫϥΠϒ
  28. ো֐ൃੜ w όοΫΤϯυαʔϏεͷো֐ ύϒϦογϡ αϒεΫϥΠϒ ύϒϦογϡ αϒεΫϥΠϒ

  29. ো֐ൃੜ w όοΫΤϯυαʔϏεͷো֐ ো֐͕఻೻͠ͳ͍ ෮ؼޙɺো֐ൃੜ࣌఺͔Β࠶։Մೳ ύϒϦογϡ αϒεΫϥΠϒ ύϒϦογϡ αϒεΫϥΠϒ

  30. ΠϕϯτΛͲͷΑ͏ʹઃܭ͢Δ͔

  31. υϝΠϯΠϕϯτ w υϝΠϯʹؔ͢Δग़དྷࣄΛද͢σʔλ w ଟ͘Ϗδωεϧʔϧ͕ద߹͢ΔՄೳੑ͕͋Δ w ʙͱ͖ɺ΋ͦ͠͏ͳͬͨΒʙɺʙͷ৔߹ɺͳͲ w ιʔείʔυͱϏδωεϩδοΫͷҰக w

    ϚΠΫϩαʔϏε ڥք͚ͮΒΕͨίϯςΩετ ͔Βൃੜ͢ΔΠϕϯτ΋υϝΠϯΠϕϯτͱͳΔ Մೳੑ͕ߴ͍ w ϚΠΫϩαʔϏεؒͷ࿈ܞʹޮՌత
  32. ΠϕϯτΛͲͷΑ͏ʹ഑৴͢Δ͔

  33. ϝοηʔδϒϩʔΧʔ w ඇಉظͰΠϕϯτͱͳΔσʔλΛϝοηʔδͱͯ͠഑৴ w αʔϏεؒͰΦϒβʔόύλʔϯͷ࣮ݱ w ΠϕϯτόεɺΠϕϯτϓϩηοαʔɺϝοηʔδΩϡʔͳͲͱ΋ݺ͹ΕΔ w ୅දతͳ੡඼ w

    3BCCJU.2ɺ,BGLBɺ"NB[PO424ɺ(PPHMF1VC4VCɺ"[VSF&WFOU )VCT w ੡඼ʹΑͬͯɺಛੑ͕͋ΔͷͰ༻్ʹ߹Θͤͯબ୒ w ॏෳഉআɺॱংอূɺ༰ྔ੍ݶɺӬଓԽɺύϑΥʔϚϯεɺϓϩτίϧɺ ϦτϥΠʜ
  34. ΠϕϯτΛͲͷΑ͏ʹऔΓग़͔͢

  35. ΠϕϯτۦಈϑΝϯΫγϣϯͱόον w Πϕϯτॲཧͱ͸ճݶΓͷΠϯελϯε
 㱠ηογϣϯ  w ඇಉظͰεςʔτϨε͕ଟ͍ w Πϕϯτۦಈ'BB4͕ީิʹద͍ͯ͠Δ w

    Πϕϯτۦಈ'BB4ͱΠϕϯτۦಈόον͸ྨࣅ
  36. ৗறܕͱΠϕϯτۦಈܕ w ΠϕϯτۦಈॲཧΛ࣮ߦͰ͖ΔϥϯλΠϜʹΑΓ αʔόͷΑ͏ͳৗற؀ڥ͕ෆཁʹͳΔ w Πϕϯτۦಈ'BB4ͷ׆༻ w ίετɺεέʔϥϏϦςΟͷ޲্
 ྫ "84-BNCEB


      ݄݅ɺ(#ඵ·Ͱແྉ
 σϑΥϧτಉ࣮࣌ߦ਺ w όον΋Πϕϯτۦಈʹஔ͖׵͑Մೳ w ߋʹ'BB4ӡ༻ $/$'4FSWFSMFTT8IJUFQBQFSW
  37. τϥϯβΫγϣϯΛͲ͏͢Δ͔

  38. 4BHB w ϚΠΫϩαʔϏεͰ෼ࢄτϥϯβΫγϣϯ ಛʹϑΣʔζίϛο τ ͸σϝϦοτ͕ଟ͍ w ඇಉظϝοηʔδϯάʹΑΓαʔϏεؒͰϫʔΫϑϩʔΛߏ ஙɺσʔλͷҰ؏ੑΛҡ࣋ w

    τϥϯβΫγϣϯϝοηʔδΛར༻͠ɺଞαʔϏεΛॱ࣍ߋ ৽ w ݁Ռ͸Ԡ౴ϝοηʔδʹͯऔಘ w Τϥʔ࣌͸ิਖ਼τϥϯβΫγϣϯ Πϕϯτ ʹΑΔϩʔϧ όοΫ w ݁Ռ੔߹ੑΛڐ༰͢Δ͜ͱͰɺૄ݁߹ͳαʔϏεؒτϥϯβΫ γϣϯΛ࣮ݱ͕Ͱ͖Δ͕ෳࡶੑ΋্͕Δ
  39. 4BHB ίϨΦάϥϑΟܕ w ϝϦοτ w Πϕϯτൃߦ͕γϯϓϧ w αʔϏεಉ͕͓࢜ޓ͍Λ஌Δඞཁ͕ͳ͘ૄ݁߹ w σϝϦοτ

    w 4BHBͷશମ೺Ѳ͕ࠔ೉ w ॥؀ࢀরͷѻ͍͕೉͍͠ w খن໛ͳ4BHBͰ͋Ε͹ޮՌత w ෳࡶͳτϥϯβΫγϣϯΛ؅ཧ͢Δʹ͸ΦʔέετϨʔ γϣϯܕ͕޲͍͍ͯΔ ύϒϦογϡ αϒεΫϥΠϒ
  40. 4BHB ΦʔέετϨʔγϣϯܕ w ϝϦοτ w ॥؀ґଘ͕ͳ͘γϯϓϧ w 4BHBͷશମΛ؅ཧͰ͖Δ w ֤αʔϏε͸࣮ߦฦ৴ͷΈʹͳΓෳࡶੑ͕Լ͕Δ

    w ϩʔϧόοΫ͕༰қ w σϝϦοτ w ΦʔέετϨʔλʔʹϏδωεϩδοΫ͕ूத͠΍͍͢
 ʢີ݁߹ͯ͠͠·͏Մೳੑ͕͋Δʣ w ΦʔέετϨʔλʔΛ׬݁ʹఆٛͰ͖Δ࢓૊Έ͕ඞཁ w খن໛ͳ4BHBҎ֎Ͱ͸༗ޮͳՄೳੑ͕ߴ͍ ύϒϦογϡ αϒεΫϥΠϒ ᶃ ᶄ ᶅ ᶆᶊᶎ ᶇ ᶈ ᶉ ᶍ ᶌ ᶋ
  41. લ൒ͷ·ͱΊ w ֤αʔϏε͔Βൃੜ͢ΔΠϕϯτΛத৺ʹઃܭ w ಉظతॲཧ͔Βɺඇಉظʹ͢Δ͜ͱͰ֦ுੑ΍Մ༻ੑ͕ߴ·Δ w ϥϯλΠϜ໘ͷબ୒ࢶ΋૿͑ɺίετ࡟ݮɺεέʔϥϏϦςΟڧԽ w τϥϯβΫγϣϯʹର͢Δߟ͑ํΛม͑Δඞཁੑ͕͋Δ

  42. (PMEFO3FUSJFWFS1BO$BLFT H31$Ϛείοτ

  43. ޙ൒ ΠϕϯτۦಈΞʔΩςΫνϟʹ͓͚Δ BTPWJFXϙΠϯταʔϏεͷઓུͱઓज़

  44. ઓུ

  45. BTPWJFXϙΠϯτͱ͸ ஷΊΔ ࢖͏ ֬ೝ͢Δ

  46. BTPWJFXϙΠϯτͱ͸ ஷΊΔ ࢖͏ ֬ೝ͢Δ w ಛఆͷ৚݅ɺঢ়ଶΛݩʹձһ͕ϙΠϯτΛ֫ಘ͢Δ w ࠓޙ΋༷ʑͳ৚͕݅௥Ճ͞ΕΔՄೳੑ͕ߴ͍ w Ұൠతʹ৚݅ୡ੒͔Βɺ֫ಘ·ͰͷϦΞϧλϜੑ͸

    ௿͍
  47. BTPWJFXϙΠϯτͱ͸ ࢖͏ ஷΊΔ ֬ೝ͢Δ w ձһ͕ϙΠϯτΛར༻͠ ࢧ෷͍Λߦ͏ w 6*ɾෆਖ਼๷ࢭͷͨΊɺόϦσʔ γϣϯɺτϥϯβΫγϣϯ͸ॏཁ

    w τϥϯβΫγϣϯͱ߹ΘͤϦΞϧ λΠϜੑ΋ߴ͍
  48. BTPWJFXϙΠϯτͱ͸ ֬ೝ͢Δ ஷΊΔ ࢖͏ w ձһͷݱࡏϙΠϯτΛ֬ೝͨ͠Γɺ঎඼΍Ωϟϯ ϖʔϯͳͲͰ֫ಘ͢ΔϙΠϯτΛ֬ೝ͢Δ w ϔομʔ΍֤छϖʔδͰࢀর͞ΕΔͨΊτϥ ϑΟοΫ͕ඇৗʹߴ͍

    w ϦΞϧλΠϜੑ΋ॏཁ
  49. ϙΠϯτͱΠϕϯτۦಈΞʔΩςΫνϟ Πϕϯτۦಈ આ໌ ஷΊΔ ˓ ɾߋ৽ॲཧͰՄ༻ੑ͕ॏཁ ɾϦΞϧλϜੑ͸௿͍ ࢖͏ ˚ ɾߋ৽ॲཧͰՄ༻ੑ͕ॏཁ

    ɾόϦσʔγϣϯ΍τϥϯβΫγϣϯ΋ॏཁ ɾϦΞϧλΠϜੑ͸ൺֱతߴ͍
 ʢϏδωεཁ݅࣍ୈڐ༰͞ΕΔՄೳੑ͋Γʣ ֬ೝ͢Δ º ɾࢀরॲཧͰɺো֐Λڐ༰Ͱ͖ΔՄೳੑ͕͋Δ ɾϨΠςϯγʔͱϦΞϧλϜੑ͕ॏཁ
  50. ϙΠϯταʔϏε w ձһͷϙΠϯτػೳ ஷΊΔɾ࢖͏ɾ֬ೝ͢Δ Λѻ͏
 %%%ͷڥք͚ͮΒΕͨίϯςΩετ  w ஷΊΔ৚݅ͷ؅ཧػೳΛ࣋ͪɺࠓޙ΋֦ு͍ͯ͘͠ w

    ྫձһొ࿥ϙΠϯτɺ஍ҬݶఆϙΠϯτɺϙΠϯτΩϟϯϖʔϯ  w ϙΠϯτΛ׆༻ͨ͠ࢪࡦ࣮ݱͷͨΊɺ֦ுੑ΍ॊೈੑ͕ٻΊΒΕΔ ࢀߟྫͰࠓޙͷαʔϏεల։Λ໿ଋ͢Δ΋ͷͰ͸͋Γ·ͤΜ
  51. ઓज़

  52. ઓज़ w શମ૾ w αʔϏεؒΠϯλʔϑΣΠεఆٛ w ϝοηʔδϒϩʔΧʔ w ϙΠϯταʔϏεΞʔΩςΫνϟ w

    ͦͷଞॏࢹͨ͜͠ͱ
  53. શମ૾ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠

  54. શମ૾ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠ ֤αʔϏε͔ΒશαʔϏεڞ௨ͷϝοηʔδϒϩʔΧʔʹυϝΠϯΠϕϯτΛύϒϦογϡ

  55. શମ૾ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠ ϙΠϯτʹؔ࿈͢ΔΠϕϯτΛαϒεΫϥΠϒ

  56. શମ૾ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠ ϦΞϧλΠϜੑΛཁٻ͢Δॲཧ͸ಉظݺͼग़͠

  57. ϙΠϯταʔϏεͷϙΠϯτ w ֦ுੑɾૄ݁߹ w ֤αʔϏε͸ϙΠϯτͷίΞυϝΠϯʢఏڙ৚݅ɺܭࢉϩδοΫʣΛ஌Δඞཁ͕ͳ͍ w ֤αʔϏε͸ࣗ਎ͷυϝΠϯΠϕϯτΛύϒϦογϡ͢Δ͜ͱΛܖ໿ w طʹΠϕϯτ͕ఏڙ͞Ε͍ͯΕ͹ɺϙΠϯταʔϏε୯ମͰαʔϏεͷػೳ֦ு͕Մೳ w

    Մ༻ੑ w ඇಉظ࿈ܞͷͨΊϙΠϯταʔϏε͕ఀࢭ͍ͯͯ͠΋֤αʔϏε΁ͷӨڹΛ࠷খݶʹͰ͖Δ w ো֐෮ؼͨ࣌͠఺ͰΠϕϯτͷ࠶ಡΈࠐΈ͕Մೳ w ಉظॲཧ͸αʔϏεϨϕϧͷ(SBDFGVM%FHSBEBUJPOΛҙࣝ͢Δ w ϙΠϯτ֬ೝͳͲͷಉظ ߴτϥϑΟοΫͳॲཧ͸ݺͼग़͠ݩͰରࡦΛݕ౼
  58. ઓུ w શମ૾ w αʔϏεؒΠϯλʔϑΣΠεఆٛ w ϝοηʔδϒϩʔΧʔ w ϙΠϯταʔϏεΞʔΩςΫνϟ w

    ͦͷଞॏࢹͨ͜͠ͱ
  59. αʔϏεؒΠϯλʔϑΣΠεఆٛ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠

  60. l*UJTWJUBMMZJNQPSUBOUXIFOVTJOHUIJT QBUUFSOUPTFUUMFPOBTUBOEBSEEBUB GPSNBUBOEFTUBCMJTIBDPOUSBDU WFSTJPOJOHQPMJDZSJHIUGSPNUIFTUBSUz ΠϕϯτۦಈΞʔΩςΫνϟͰ͸ɺܖ໿͢Δσʔλ ܗࣜΛఆΊɺ؅ཧΛཱ֬͢Δͷ͕ඇৗʹॏཁ

  61. 4JOHMFTPVSDFPGUSVUI w ୯Ұͷ(JUϦϙδτϦʹ֤αʔϏεؒͷΠϯλʔϑΣΠεΛ 1SPUPDPM#V⒎FSTͰఆٛ w ίϯγϡʔϚʔܖ໿ͷ࣮ݱ w Πϕϯτϕʔε ඇಉظ NFTTBHFͱͯ͠ఆٛ

    w ϦΫΤετϨεϙϯε ओʹಉظ H31$ͷTFSWJDFͱͯ͠ఆٛ w $*$%ʹΑΔϥΠϒϥϦ഑৴ w ϦϙδτϦʹϓογϡ͢Δͱ$*$%Λ࣮ߦ͠ϥΠϒϥϦͱͯ͠ ࣗಈ഑৴ w ഑৴͞ΕͨϥΠϒϥϦΛಡΈࠐΉ͚ͩͰαʔϏεؒ࿈ܞΛૉ ૣ͘ɾ҆શʹ࣮ݱ ࣗಈੜ੒
  62. 1SPUPDPM#V⒎FST w γϯϓϧ w ੩తܕ෇͚ w ଟݴޠରԠ w ܰྔ w

    ϝοηʔδϯάϛυϧ΢ΣΞʹ͸༰ྔ੍ݶ͕͋Δ ৔߹͕ଟ͍ w ࣄۀ੒௕ɺϢʔβ૿ՃʹΑΓϝοηʔδ਺͸૿Ճ ͢Δ w +40/4DIFNBΑΓϝϦοτ͕େ͖͔ͬͨ message PlanReservedEvent { string event_id = 1; string event_type = 2; google.protobuf.Timestamp event_create_time = 3; int32 member_id = 4; int32 plan_no = 5; int32 price = 6; // ... }
  63. ઓज़ w શମ૾ w αʔϏεؒΠϯλʔϑΣΠεఆٛ w ϝοηʔδϒϩʔΧʔ w ϙΠϯταʔϏεΞʔΩςΫνϟ w

    ͦͷଞॏࢹͨ͜͠ͱ
  64. ϝοηʔδϒϩʔΧʔ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠

  65. 4QSJOH$MPVE4USFBN º "NB[PO,JOFTJT%BUB4USFBNT

  66. 4QSJOH$MPVE4USFBN w ࣾ಺ͷΞϓϦέʔγϣϯ͸΄΅+BWB 4QSJOH#PPU  w 4QSJOHͷΠϕϯτۦಈϚΠΫϩαʔϏεϑϨʔϜϫʔ Ϋ w ύϒϦογϟʔαϒεΫϥΠόʹΑΔΠϕϯτ഑

    ৴ w ίϯγϡʔϚʔάϧʔϓ w ύʔςΟγϣϯαϙʔτ w 4QSJOH#PPUͱͷ౷߹ 4PVSDF 4JOL 1SPDFTTFS .FTTBHF #SPLFS 4PVSDFc1SPDFTTFSc4JOL .FTTBHF #SPLFS
  67. "NB[PO,JOFTJT%BUB4USFBNT w ࣾ಺ͷΠϯϑϥ͸΄΅"84 w "84੡ϑϧϚωʔδυσʔλετϦʔ ϛϯάαʔϏε w ߴՄ༻ੑɺߴεϧʔϓοτɺϨίʔυͷ ௕ظอ࣋ɺεέʔϦϯά w

    ݱࡏͳΒϚωʔδυ,BGLB .4, ΍ 424 4QSJOH$MPVE4USFBNະରԠ ͳ Ͳ΋ީิ
  68. ύϒϦογϟʔͱαϒεΫϥΠόͷ࣮૷ w ύϒϦογϟʔ w ഑৴͞ΕͨϥΠϒϥϦ 1SPUPDPM #V⒎FST ͷΠϕϯτੜ੒ w 4QSJOH$MPVE4USFBNʹΑΓ

    .FTTBHFͱͯ͠ૹ৴ @EnableBinding(Source.class) class Publisher { Source source; public void publish(Plan plan) { var event = PlanReservedEvent.newBuilder() .setEventId(UUID.randomUUID().toString()) .setEventType(PlanReservedEvent.getDescriptor().getFullName()) .setEventCreateTime(now()) .setMemberId(plan.memberId()) // ... .build(); var message = MessageBuilder.withPayload(event) .setHeader("eventType", eventType(event)) .build(); source.output().send(message); } }
  69. ύϒϦογϟʔͱαϒεΫϥΠόͷ࣮૷ w αϒεΫϥΠό ϙΠϯταʔϏε  w ഑৴͞ΕͨϥΠϒϥϦ 1SPUPDPM #V⒎FST ͷΠϕϯτλΠϓͰϑΟϧλʔ

    w Πϕϯτ୯ҐͰυϝΠϯϩδοΫΛ࣮૷ @EnableBinding(Sink.class) class Subscriber { @StreamListener(value=Sink.INPUT, condition="headers['eventType']=='plan.v1.PlanReservedEvent'") public void handle(PlanReservedEvent event) { // ... } @StreamListener(value=Sink.INPUT, condition="headers['eventType']=='plan.v1.PlanChangedEvent'") public void handle(PlanChangedEvent event) { // ... } @StreamListener(value=Sink.INPUT, condition="headers['eventType']=='plan.v1.PlanCanceledEvent'") public void handle(PlanCanceledEvent event) { // ... } }
  70. ઓज़ w શମ૾ w αʔϏεؒΠϯλʔϑΣΠεఆٛ w ϝοηʔδϒϩʔΧʔ w ϙΠϯταʔϏεΞʔΩςΫνϟ w

    ͦͷଞॏࢹͨ͜͠ͱ
  71. ϙΠϯταʔϏεΞʔΩςΫνϟ ύϒϦογϡ ύϒϦογϡ ύϒϦογϡ αϒεΫϥΠϒ ಉظݺͼग़͠ ಉظݺͼग़͠

  72. υϝΠϯۦಈઃܭ w ࣾ಺Ͱ޿͘࠾༻͞Ε͍ͯΔ w αʔϏε͝ͱͷ੹຿ͷࢦ਑ ڥք͚ͮΒΕͨίϯςΩετ  w νʔϜ։ൃͰઃܭࢥ૝ʹڞ௨ೝࣝΛ࣋ͪ΍͍͢ w

    ϙΠϯτʹؔ͢ΔෳࡶͳϏδωεϩδοΫɺϧʔϧΛૉ௚ʹදݱͰ͖Δ w มߋ༰қੑͷ޲্ w υϝΠϯΠϕϯτͱ૬ੑ͕ྑ͍
  73. $234ͱΠϕϯτιʔγϯά w ࣄۀ֦େͱڞʹϙΠϯτͷ෇༩ϩδοΫ͸ෳࡶʹͳΓɺޙ͔ΒͰ΋मਖ਼͕ඞཁ w ෇༩཰ºձһଐੑº঎඼ºՁ֨ºൢച۠෼ºΩϟϯϖʔϯºߪೖཤྺºʜ w ಡΈࠐΈॲཧ͸֤ϖʔδ୯ҐͰݺͼग़͞ΕΔͨΊɺߴτϥϑΟοΫ w ձһͷอ࣋ϙΠϯτɺߪೖ࣌֫ಘͰ͖ΔϙΠϯτ w

    ձһ͕֬ೝ͢ΔҎ֎ʹ΋ܦཧ΍؂ࠪͷҝʹɺաڈͷཤྺ΋ؚΊϙΠϯτૢ࡞Λ࢒ ͓ͯ͘͠ඞཁ͕͋Δ w σʔλ͕ΠϕϯτϕʔεͰ࿈ܞ͞Ε͍ͯΔ
  74. $234ͱΠϕϯτιʔγϯά w ࣄۀ֦େͱڞʹϙΠϯτͷ෇༩ϩδοΫ͸ෳࡶʹͳΓɺޙ͔ΒͰ΋मਖ਼͕ඞཁ w ෇༩཰ºձһଐੑº঎඼ºՁ֨ºൢച۠෼ºΩϟϯϖʔϯºߪೖཤྺºʜ w ಡΈࠐΈॲཧ͸֤ϖʔδ୯ҐͰݺͼग़͞ΕΔͨΊɺߴτϥϑΟοΫ w ձһͷอ࣋ϙΠϯτɺߪೖ࣌֫ಘͰ͖ΔϙΠϯτ w

    ձһ͕֬ೝ͢ΔҎ֎ʹ΋ܦཧ΍؂ࠪͷҝʹɺաڈͷཤྺ΋ؚΊϙΠϯτૢ࡞Λ࢒ ͓ͯ͘͠ඞཁ͕͋Δ w σʔλ͕ΠϕϯτϕʔεͰ࿈ܞ͞Ε͍ͯΔ ෭࡞༻ͷ͋ΔෳࡶͳϏδωεϩδοΫʹରͯ͠ɺ$234ͷ $PNNBOE͕༗ޮ
  75. $234ͱΠϕϯτιʔγϯά w ࣄۀ֦େͱڞʹϙΠϯτͷ෇༩ϩδοΫ͸ෳࡶʹͳΓɺޙ͔ΒͰ΋मਖ਼͕ඞཁ w ෇༩཰ºձһଐੑº঎඼ºՁ֨ºൢച۠෼ºΩϟϯϖʔϯºߪೖཤྺºʜ w ಡΈࠐΈॲཧ͸֤ϖʔδ୯ҐͰݺͼग़͞ΕΔͨΊɺߴτϥϑΟοΫ w ձһͷอ࣋ϙΠϯτɺߪೖ࣌֫ಘͰ͖ΔϙΠϯτ w

    ձһ͕֬ೝ͢ΔҎ֎ʹ΋ܦཧ΍؂ࠪͷҝʹɺաڈͷཤྺ΋ؚΊϙΠϯτૢ࡞Λ࢒ ͓ͯ͘͠ඞཁ͕͋Δ w σʔλ͕ΠϕϯτϕʔεͰ࿈ܞ͞Ε͍ͯΔ ύϑΥʔϚϯεΛཁٻ͞ΕΔ৔໘Ͱ͸ɺ$PNNBOEͱ 2VFSZΛ෼ׂ͠ɺνϡʔχϯάͷ༨஍Λ֬อ
  76. $234ͱΠϕϯτιʔγϯά w ࣄۀ֦େͱڞʹϙΠϯτͷ෇༩ϩδοΫ͸ෳࡶʹͳΓɺޙ͔ΒͰ΋मਖ਼͕ඞཁ w ෇༩཰ºձһଐੑº঎඼ºՁ֨ºൢച۠෼ºΩϟϯϖʔϯºߪೖཤྺºʜ w ಡΈࠐΈॲཧ͸֤ϖʔδ୯ҐͰݺͼग़͞ΕΔͨΊɺߴτϥϑΟοΫ w ձһͷอ࣋ϙΠϯτɺߪೖ࣌֫ಘͰ͖ΔϙΠϯτ w

    ձһ͕֬ೝ͢ΔҎ֎ʹ΋ܦཧ΍؂ࠪͷҝʹɺաڈͷཤྺ΋ؚΊϙΠϯτૢ࡞Λ࢒ ͓ͯ͘͠ඞཁ͕͋Δ w σʔλ͕ΠϕϯτϕʔεͰ࿈ܞ͞Ε͍ͯΔ աڈͷཤྺΛશͯ࣋ͪɺݱࡏঢ়ଶΛ࣮ݱ͢Δ͜ͱͰɺࠓޙ ͷ֦ு΍ɺ৴པੑΛ୲อ
  77. ෭࡞༻ͷগͳ͍ΦϒδΣΫτࢦ޲ w +BWB ΦϒδΣΫτࢦ޲ ঢ়ଶมԽ ෭࡞༻ ͱ ͸ݶΒͳ͍ w ΦϒδΣΫτࢦ޲Ͱ΋Πϛϡʔλϒϧͳઃܭ

    ͸ॏཁ w ΠϛϡʔλϒϧͳΦϒδΣΫτ w ΠϕϯτɺϞσϧɺόϦϡʔΦϒδΣΫ τɺϑΝʔετΫϥείϨΫγϣϯʜ w ύϑΥʔϚϯεݒ೦͕͋Ε͹ঢ়ଶมԽΛڐ༰ class Point { Integer value; Point(Integer value) { this.value = value; } // void add(Point point) { // value = value + point.value; // } Point add(Point point) { return new Point(value + point.value); } } มߋ͞ΕͨΦϒδΣΫτΛ৽͘͠ฦ͢ ঢ়ଶมԽΛߦ͏ϝιου͸࢖༻͠ͳ͍
  78. ઓज़ w શମ૾ w αʔϏεؒΠϯλʔϑΣΠεఆٛ w ϝοηʔδϒϩʔΧʔ w ϙΠϯταʔϏεΞʔΩςΫνϟ w

    ͦͷଞॏࢹͨ͜͠ͱ
  79. γϯϓϧͰࣺͯ΍͍͢ΞʔΩςΫνϟ w ࣄۀ੒௕ͷ଎౓Λߟ͑Δͱૣ͚Ε͹ɺ೥ɺେ఍೥΋ܦͭͱϨΨγΟγεςϜͱͳΓ΍͍͢ w ࣜ೥ભٶΛલఏʹ͓ͯ͘͠
 ෆ࣮֬ੑͷߴ͍௕ظతϝϯςφϯεੑΑΓɺϨΨγΠԽͨ͠ͱ͖ͷࣺͯ΍͢͞  w ڞ༗ϥΠϒϥϦɺڞ༗%#ͷېࢭ w

    $234΍ΠϕϯτιʔγϯάΛ+BWBͰ࣮ݱ͢ΔͳΒ"YPO'SBNFXPSL΍"LLBɺ&WFOUVBUFͳͲ͕બ୒ࢶ w લఏ஌ࣝɺֶशίετ͕ߴ͘ɺ্ཱͪ͛ɺӡ༻໘ͰΦʔόʔϔου͕ߴ͘ɺҰ౓ґଘ͢Δͱޙ໭Γ΋೉͍͠ w ࠷খݶͷػೳͷΈࣗલͰ༻ҙ w $234΍Πϕϯτιʔγϯάͷલఏ஌͕ࣝͳ͍ਓ΋গͳ͘ͳ͍ w 3FBEͱ8SJUFͷ෼཭ɺΠϕϯτϋϯυϥʔɺύλʔϯϚονɺϦϓϨΠͳͲ
  80. ޙ൒ͷ·ͱΊ w ΠϕϯτۦಈʹΑΓϙΠϯταʔϏεΛૄ݁߹ͳ࿈ܞ͕Մೳ w Πϕϯτ࿈ܞʹΑΓγεςϜͷ֦ுੑɾՄ༻ੑʹର͢Δબ୒ࢶ͕૿͑ Δ w ϙΠϯτͷυϝΠϯ͸$234ɺΠϕϯτιʔγϯάͱ΋૬ੑ͕ྑ͍ w ΤϥʔॲཧɺτϥϯβΫγϣϯͷ؅ཧͳͲӡ༻՝୊΋ฒߦͯ͠ݕ౼͕

    ඞཁ
  81. ࠷ޙʹ

  82. “the Architect's Dream, the Developer's Nightmare” by Martin Fowler ΞʔΩςΫνϟ͸ເʹ΋ѱເʹ΋ͳΓ͑Δ͜ͱΛ๨Εͳ͍

  83. ࢀߟ w ϚΠΫϩαʔϏεΞʔΩςΫνϟ 4BN/FXNBO  w .JDSPTFSWJDFT1BUUFSOT $ISJT3JDIBSETPO  w

    ࣮ઓυϝΠϯۦಈઃܭ 7BVHIO7FSOPO  w ਐԽతΞʔΩςΫνϟ /FBM'PSEɺ3FCFDDB1BSTPOTɺ1BUSJDL,VB  w ෼ࢄγεςϜσβΠϯύλʔϯ #SFOEBO#VSOT  w 4PGUXBSF"SDIJUFDUVSF1BUUFSOT .BSL3JDIBSET