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

Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用...

Developers Summit 2014 「Play2/Scalaでドメイン駆動設計を利用した大規模Webアプリケーションのスクラム開発の勘所」

http://event.shoeisha.jp/devsumi/20140213/session/407
以上の発表の発表内容となります。

----
slideshareより移行

Soichiro Yoshimura

September 27, 2023
Tweet

More Decks by Soichiro Yoshimura

Other Decks in Technology

Transcript

  1. ٢ଜ ૯Ұ࿠ (@sifue) • ݩʑ͸ɺ੡଄ۀͷۀ຿վֵΛϝ Πϯͱ͢ΔγεςϜίϯαϧ ςΟϯάͰಇ͘SE • झຯ͸ήʔϜ࣮گ (࠷ۙ͸FF14)

    ͱϓϩάϥϛϯά • ޷͖ͳݴޠ͸Java • 2012೥4݄ɺझຯͷήʔϜ࣮گ ΍ήʔϜ༻πʔϧ։ൃ͕ߴͯ͡ υϫϯΰ΁
  2. ίʔυͷٕज़తෛ࠴ • PHPͷίʔυߦ਺ 300ສߦʹର͠ • ίϐʔˍϖʔετ਺1ສϲॴ • જࡏతෆ۩߹਺(PMDܯࠂ஋)͕ 4500ϲॴ •

    ॥؀తෳࡶ౓600௒ϝιου͕͍͘ ͭ΋ଘࡏ • IDEαϙʔτ͕Ͱ͖ͳ͍จࣈྻͷϦ ϑϨΫγϣϯͷଟ͍ɺgrepෆೳͳ PHPͷίʔυ
  3. ॥؀తෳࡶ౓600௒ϝιου͸ ྫ͑ΔͳΒऴ൫ͷδΣϯΨ • ਓྨͷӳ஌Λ݁ूͯ͠΋ෆ۩ ߹ΛೖΕͣʹෆ۩߹վम͢Δ ͜ͱ͕ࠔ೉ͳϨϕϧ • ࠓ΋ղফ͞Ε͍ͯͳ͍ • ෆ۩߹मਖ਼Λ͢Δ਺ΑΓ΋ͦ

    ΕʹΑͬͯൃݱ͢Δෆ۩߹ͷ ํ͕ଟ͘ͳͬͯ͠·͏ͱ͍ ͏ɺ·͞ʹෛ࠴ ॥؀తෳ ࡶ౓ ෳࡶ͞ͷঢ়ଶ όάࠞೖ֬཰ 10ҎԼ 30ҎԼ 50ҎԼ 75Ҏ্ ඇৗʹྑ͍ߏ଄ 25.00% ߏ଄తͳϦεΫ ͋Γ 40.00% ςετෆՄೳ 75.00% ͍͔ͳΔมߋ΋ ޡमਖ਼ΛੜΉ 98.00%
  4. ໨త͸ܧଓతͳେن໛഑৴ʹ଱͑ΒΕΔΑ ͏ʹ͢ΔͨΊҎԼͷੑೳΛ୲อ͢Δ͜ͱ 1. εέʔϥϏϦςΟ 2. ҆ఆੑɾϑΥʔϧττϨϥϯτੑ 3. อकੑͱ֦ுੑ 4. ύϑΥʔϚϯε

    Ҏ্ͷॱ൪ͷ༏ઌॱҐͰ໨ඪΛઃఆ͢Δ͜ͱͱͳͬͨɻࠓͷઃܭͰ ͸αʔόʔΛ଍͢ͷʹେ͖ͳγεςϜมߋίετ͕ඞཁͰ͋Γɺࠓ ޙ༰қʹεέʔϧΞ΢τͰ͖Δ͜ͱʹओ؟Λ͓͍ͨɻ
  5. • Java, Scala, PHP, Ruby͔Βͷબ୒ • อकੑͷ؍఺͔Β੩తܕ෇͚ͷݴޠΛ࢖͍͔ͨͬͨ • ύϑΥʔϚϯεͷݒ೦͸ϓϩτλΠϓ࡞੒ޙʹ൑அ͢ Δ͜ͱʹ

    • ޾͍ϓϩτλΠϓΛ࡞ͬͨϝϯόʔ͸શһJava/Ruby/ؔ ਺ܕݴޠͳͲͷܦݧ͕͋ΓɺScalaʹ఍߅͸ͳ͔ͬͨ • ͨͩ͠ɺ్த͔ΒՃΘͬͨPHP͔͠΍ͬͯ͜ͳ͔ͬͨϝ ϯόʔ͕ScalaΛ΍Δʹ͋ͨͬͯ͸ਏ͍໘͕͋ͬͨ
  6. ϓϩάϥϛϯάίϯςετνϟϨϯ δϒοΫॳڃฤͷษڧձ • ୈ1ճ ࠶ؼؔ਺ͱਂ͞༏ઌ୳ࡧ • ୈ2ճ ελοΫͱΩϡʔͱ෯༏ઌ୳ࡧ • ୈ3ճ

    ᩦཉ๏ • ୈ4ճ ಈతܭը๏ͱϝϞԽ • ୈ5ճ ϓϥΠΦϦςΟʔΩϡʔ • ୈ6ճ Union-Find໦ • ୈ7ճ μΠΫετϥ๏
  7. 4. implicit • ϥΠϒϥϦ૚Λআ͍ͯ͸ۃྗར༻͠ͳ͍ • ಛʹimplicit converterΛΨϦΨϦ࢖ͬͨ෦෼͕ෛ࠴ʹͳΓ ΍͍͢ • ͻͱ͙ͭΒ͍ͳΒྑ͍͕3~4ݸಡΈग़ͨ͠Γɺείʔϓ

    ͝ͱʹҧ͏ίϯόʔλʔݺͼ࢝ΊΔͱେม… • ৑௕ͳهड़͸ݮΒͤͯྑ͍͕ɺଟ͘ͷ஋͕implicitͩͱpull requestͰͷίʔυϨϏϡʔͰΘ͔Γʹ͘͘ͳΔ
  8. DBͷਫฏ෼ׂͱਨ௚෼ׂ • DBʹ͸MySQLΛར༻ • ਫฏ෼ׂ • 64bitͷIDͷதʹγϟʔυID(12bit)΍σʔλλΠϓID(10bit)ͳ ͲΛ૊ΈࠐΜͰɺDBͷγϟʔσΟϯά͕༰қʹͳΔΑ͏ʹ͠ ͍ͯΔ •

    InstagramͷIDઃܭɺPinterestͷIDઃܭɺTwitterͷsnowflake ͳͲΛࢀߟʹͨ͠ • ਨ௚෼ׂ͸ɺαΠζ͕খ͘͞γϟʔσΟϯά͕ෆཁͳڞ༗DBʹ ͷΈద༻͍ͯ͠Δ
  9. ֎෦؀ڥ͔ΒෛՙΛ෼཭͢Δ ΞϓϦέʔγϣϯߏ੒ web༻ websocket༻ όον༻ ؅ཧπʔϧ༻ ֎෦Ϧιʔεதܧ༻ σʔλ ετΞ ΫϥΠ

    Ξϯτ ഑৴ܥ ϝοηʔδαʔόʔ • ߴෛՙ࣌͸ɺweb͔websokcet͕ඇৗʹॏ͘ͳΔͨΊͦͷଞ ͷػೳΛͰ͖Δ͚ͩಀ͢ߏ੒ͱͳ͍ͬͯΔ
  10. websocketΞϓϦ̍ΠϯελϯεͰɺ 5ສϢʔβʔͷࢹௌ؅ཧΛ࣮ݱ • nginxͱNettyαʔόʔͰඇಉظIOΛར༻͢Δ͜ͱͰ࠷େ઀ଓ਺͕վળ • REST API͔ΒWebsocketΛར༻͢Δ͜ͱʹΑͬͯ઀ଓίετ͕௿ݮ • ݁ՌɺCPUόΠϯυͷ෦෼Ͱ͸طଘͷੜ์ૹͷ4ഒͷޮ཰Λ࣮ݱ •

    ύϑΥʔϚϯεଌఆํ๏ • gatling͕ૉ੖Β͍͠ετϨεπʔϧɺϨϙʔτ͕៉ྷ • ͨͩ͠websocket෦෼͸ϓϥάΠϯͷύϑΥʔϚϯε͕ग़ͣɺ݁ہ node.jsͰετϨεπʔϧΛࣗ࡞ɻnode.jsૉ੖Β͍͠ɻ
  11. χίੜ2ͰDDDΛ͢Δʹ͋ͨͬͯ ࠷௿ݶపఈͨ͜͠ͱ 1. ϢϏΩλεݴޠ 2. ϞσϧΛ࢖ͬͯٞ࿦͢Δͱ͍͏͜ͱ 3. ϨΠϠʔυΞʔΩςΫνϟ 4. ਖ਼͍͠ϞδϡʔϧԽΛߦ͍ɺมߋ࣌ʹಡ·

    ͳ͖Ό͍͚ͳ͍ίʔυΛݮΒ͢ 1. ίΞͷৠཹ 2. ൚༻αϒυϝΠϯͷ෼཭ 5. ΤϯςΟςΟͱ஋ΦϒδΣΫτͷ࢖͍෼͚ UI૚ ΞϓϦέʔγϣϯ૚ υϝΠϯ૚ Πϯϑϥ૚ ґଘํ޲ ґଘํ޲ ґଘํ޲ ਤ: ϨΠϠʔυΞʔΩςΫνϟ ※ DDD: Domain-Driven Design
  12. Play2/Scala͸DDDΛ࣮ફ͢Δʹ͸ ͱͯ΋ྑ͍ϑϨʔϜϫʔΫ • CoC͕͖ͭ͘ͳ͘޷͖উखϑΥϧμ͕۷ΕΔ • ϚϧνϓϩδΣΫτػೳͰαϒϞδϡʔϧͷґଘؔ܎Λ࡞ΕɺϨΠϠʔ υΞʔΩςΫνϟͷڧ੍Ͱ͖Δ • υϝΠϯ૚ɺΠϯϑϥ૚͸playʹґଘ͠ͳ͍ͨͩͷjar •

    case class͕ΤϯςΟςΟͱ஋ΦϒδΣΫτͷ࡞੒ͷίετΛԼ͛Δ • ྫ͑͹ɺΠϯϑϥ૚ORMͷϚοϐϯάΫϥεͱυϝΠϯ૚ͷΤϯςΟ ςΟΛ෼͚Δ͜ͱͳͲ͕ۤʹͳΒͳ͍ɻ • play2ΛࣺͯΒΕΔΑ͏ʹ։ൃ͢Δ͜ͱ͕Մೳɻ ※ CoC:ʮઃఆΑΓن໿ʯʢCoC:Convention over Configurationʣ
  13. DDDͰ͸ͳ͍ίʔυͷྫ • StreamModel.class.phpͷٞ࿦͸೉͍͠... (1ສߦ) ൪૊Ͱ͋Γ ൪૊Λ࡞Δ΋ͷͰ͋Γ ൪૊Λίϐʔͨ͠Γߋ৽ͨ͠ΓόοΫΞοϓΛͱͬͨΓ͢Δ΋ͷͰ͋Γ ετϦʔϜͰ͋Γ ੜ์ૹͰ͋Γ λΠϜγϑτͰ͋Γ

    λΠϜγϑτ༧໿ͷϦετΛݟΕΔ΋ͷͰ͋Γ ϝοηʔδαʔόʔΛׂΓ౰ͯΔ΋ͷͰ͋Γ ଟࠃ੶ԽΛ͢Δ΋ͷͰ͋Γ Ωϟογϡͱͷ௨৴Λ͢Δ΋ͷͰ͋Γ DBͱͷ௨৴Λ͢Δ΋ͷͰ͋Γ
  14. ϢϏΩλεݴޠ͕ಋೖ͞ΕΔͱɺ ෳ਺ͷνʔϜͰڞ௨ͷݴޠΛ࢖ͬͯձ࿩͕Ͱ͖Δ • ετʔϦʔͷ಺༰ʹ͍ͭͯɺνʔϜ಺ɺνʔϜؔ܎ऀͱͷٞ࿦͕͠΍͘͢ͳΔ • ݁Ռͱͯ͠ɺγεςϜ಺ͷ࡞Γʹ͍ͭͯͷνʔϜશମͱཧղ౓͕ߴ·Δ • Programͱ͍͏Ϋϥε͸൪૊Ͱ͋Δ͚ͩͰ͋Δ • Streamͱ͍͏Ϋϥε͕ετϦʔϜͰ͋Δ͚ͩͰ͋Δ

    • Liveͱ͍͏Ϋϥε͕ੜ์ૹͰ͋Δ͚ͩͰ͋Δ • ੜ์ૹ͕͏·͘࡞Εͳ͍ͱ͔ɺετϦʔϜׂ͕Γ౰ͯΒΕͳ͍ͱ͔ͦΕ͕ ίʔυ্ͷͲ͜ͷ͸ͳ͔͠Θ͔Γ΍͍͢ • ແ࿦ϢϏΩλεݴޠ͕Ͱ͖Δࡍʹ͸௚઀ɺ·ͨ͸IRCͰ͔ͬ͠Γ૬ஊ͢Δඞཁ ͋Γ
  15. ίʔυͱීஈཁ݅ʹ͍ͭͯ࿩͍ͯ͠Δݴޠͷ ဃ཭͕গͳ͘ͳΓɺϦϑΝΫλੑೳ͕͕͋Δ • ͨͩ͠ɺυϝΠϯ૚͚ͩ • υϝΠϯ૚΁ͷϏδωεϩδοΫͷू໿ʹର͢Δҙ͕ࣝࠜ෇͘ • ݁ՌɺϏδωεϩδοΫͷมߋͷϦϑΝΫλʹڧ͘ͳΔ • Կ౓͔ੜ์ૹͷ഑৴Πϯϑϥ΍ϝοηʔδαʔόʔͷར༻ͷཁ͕݅มΘ

    Δ౓ʹϦϑΝΫλϦϯάΛߦ͕ͬͨɺ໰୊ͳ͘ߦ͑ͨ • աڈ͸͜͏͍͏͜ͱΛ΍Ζ͏ͱͨ͠ࡍɺ͍Ζ͍Ζͳ৔ॴʹϏδωεϩ δοΫ͕ඈͼՐ͍ͯͯ͠ɺେ࢓ࣄɺσάϨ΋ଟ͔ͬͨ • ͨͩɺ͏͔ͬΓ͢ΔͱϏδωεϩδοΫ͕υϝΠϯ૚͔Βಀ͛ͯɺΞϓϦ έʔγϣϯ૚΍Πϯϑϥ૚ʹߦ͖͕ͪͳͷͰɺίʔυϨϏϡʔɺઃܭϨ ϏϡʔͰͷೖ೦ͳ؂ࢹͱܧଓతͳϦϑΝΫλϦϯά͕ඞཁͰ͋Δ
  16. ։ൃ؀ڥ͸ IntelliJ IDEA Ultimateʹ౷Ұ • ࡉ͔͍࡞Γ͜Έ΍҆ఆੑ͕ྑ͍ • ձ͕ࣾνʔϜϝϯόʔʹಋೖ • ཧ࿦্͸ͲΜͳιϑτ΢ΣΞͰ΋ϝϞாͰ͸࡞ΕΔ͕…

    • ։ൃ؀ڥΛ౷Ұ͢Δ͜ͱͰɺ؀ڥߏஙυΩϡϝϯτͳͲΛߴ ඼࣭ʹͰ͖Δྑ͕͋͞Δ • vimmerʹ΋޷ධͳideavim͕͋Δ
  17. Play2/Scala։ൃͷ೉఺ 1. sbt͕஗͗͢Δ • proxyΛ࡞ͬͨΓɺྑ͍ϚγϯΛ࢖͏͙Β͍͔͠ͳ͍ 2. Play2ͷscalaςϯϓϨʔτ͕ɺίϯύΠϧ஗͘ɺจ๏͕σβΠφʔ ʹ΍͘͞͠ͳ͍࢓༷ • GroovyςϯϓϨʔτͰ࡞੒ɻ

    github/dwangoͰϑΥʔΫͨ͠΋ ͷΛެ։த 3. ςετͰࠔΔobjectͱtraitͱؔ਺Ҿ਺ • specs2ͷmockitoͷ੍໿ɻobjectͷϞοΫ࡞Εͳ͍ɺtrait͸mixin ͕ඞཁɺδΣωϦΫεύϥϝʔλʔ͕෇͍ͨؔ਺Ҿ਺ͷϝιου Λ֦ுͰ͖ͳ͍ɻ
  18. ࣗ਎ͷ΢ΥʔλʔϑΥʔϧ։ൃͱΞδϟ Πϧ։ൃͷϓϩδΣΫτϚωʔδϟܦݧ 1. աڈ4౓ͷϑΥʔλʔϑΥʔϧ։ൃͱɺେࣦഊͷܦݧ • ཁٻ͕มߋ͞Εͯ͠·͏ͱ஍ࠈ • ෆ֬ఆཁૉʹରԠ͢ΔͨΊͷόοϑΝॏཁ • ࠷ޙͷ͠Θدͤ͸඼࣭ʹ

    2. ཁ͕݅֬ఆͰ͖ͳ͍ɺ·ͨɺཁٻͷ༏ઌॱҐ͕೔ʑมΘΔ৔߹ • ΞδϟΠϧͱεΫϥϜͷߟ͕͑ྑ͍ • ೔ʑมΘΔνʔϜͷ໨ඪ΁ͷॊೈͳରԠ͕ඞཁͳWeb։ൃ
  19. ΞδϟΠϧಋೖ·Ͱͷେม͞ • ΈΜͳΨϯτνϟʔτ͕Θ͔Γ΍ͯ͘͢޷͖ɺͱ͍͏໰୊ • ܒ໤׆ಈ͸΍͸ΓϑΣΠετΡϑΣΠε (εϥΠυ࡞ͬͨΓ) • ࣮ࡍͷݱ৔ʹ͋ΔϚωδϝϯτ໰୊ͷࠜຊ͸ɺΞδϟΠϧͱ͔ ΢ΥʔλʔϑΥʔϧͱ͔ؔ܎ͳ͍͜ͱ͕ଟ͍ •

    ໰୊ͷൃݟɺ໨త΍໨ඪͷઃఆΛ͠ɺνʔϜͰͷPDCAͷ࣮ߦ ͕Ͱ͖͍ͯΕ͹ྑ͍ͷ͕ͩͦΕ͕Ͱ͖ͯͳ͍͜ͱ΋͋Δ • ΧʔϘʔΠ։ൃʹ΋ྑ͕͋͞ΔͷͰڧཁ͠ͳ͍΄͏͕ྑ͍͜ͱ΋ • ਐḿ֬ೝ͕ߴίετͰɺυΩϡϝϯτ͸࢒Βͳ͍͕ɺݸਓͷ ύϑΥʔϚϯεΛҾ͖ग़ͤΔ
  20. εΫϥϜ։ൃͷ՝୊ • ίχϡχέʔγϣϯίετ͕ͱʹ͔͘ߴ͍ͷͰີͳίϛϡχέʔγϣϯ͕ෛ ୲ʹͳΒͳ͍࢓૊Έ͕ඞཁ • ϝϯόʔͷཁ݅ఆٛͷೳྗ͕਎ʹ͖ͭʹ͍͘ • ཁ݅ఆٛͱ͍͏࢓ࣄ͕ετʔϦʔͷ؅ཧͱͯ͠؆ུԽ͞Ε͍ͯΔ൓໘ɺ ֊૚Խ͕ෆे෼ͩͬͨΓൈ͚࿙Ε͕ൃੜ͠΍͍͢ •

    ཁٻ΍ཁ͕݅ਂ͍ίϯςΩετ෇͖ͷυΩϡϝϯτʹ·ͱ·Δ͜ͱ͕গͳ͍ ͨΊ(ετʔϦʔ͸୹͍จॻ)ɺϢʔβʔͷཁٻͷཧղʹ͸ݸʑ౒ྗ͕ඞཁ • ཁٻ͕೔ʑมΘΔͷͰϦονͳυΩϡϝϯςʔγϣϯ͕มߋ࣌ʹෛ࠴ʹͳΓ ͕ͪ • ୔ࢁͷ๧ࢠΛ͔ͿΕΔਓ΄Ͳଟ๩ʹͳΓ͕ͪ
  21. ΈΜͳͰ͓՛ࢠΛ৯΂ͨΓɺҰॹʹ ήʔϜΛ΍ͬͨΓ͢ΔΑ͏৺͕͚͍ͯΔ • ີͳίϛϡχέʔγϣϯͷετϨεΛͰ͖Δ͚ͩݮΒ͢ • ۩ମྫ: • ͓՛ࢠਆࣾ • ϘʔυήʔϜɺωτή

    • Ͱ͖Δ͚ͩIRC (ࣾ಺νϟοτ) Ͱࡁ·͢ • ΄Μͱ͸୭ͱ΋ϑΣΠεɾτΡɾϑΣΠεͷίϛϡχέʔ γϣϯΛऔΒͣ։ൃ͍͍ͯͨ͠ਓ΋͍ΔͷͰ...·ͩ՝୊
  22. χίੜͰͷεΫϥϜͰ ॏࢹ͍ͯ͠Δ͜ͱ 1. Ϣʔβʔཧղʹରͯ࣌ؒ͠Λ͔͚Δ 2. ετʔϦʔͷϙΠϯτ਺Λେମ2~3೔Ҏ಺ͰऴΘΔྔʹ͍ͯ͠Δ 3. ΈΜͳͰ͓՛ࢠΛ৯΂ͨΓɺҰॹʹήʔϜΛ΍ͬͨΓ͢ΔΑ͏৺͕͚ ͍ͯΔ 4.

    εΫϥϜϚελʔ͕ৗʹϓϨΠϯάϚωʔδϟʔͰ͋ΕΔΑ͏ʹ͢Δ 5. ΏͱΓΛ࣋ͬͨ։ൃܭը 6. اըͱ૬ஊ͢Δͱ͖ʹ͸ɺෆ֬ఆͳ࣌ظͱ༏ઌॱҐͱҰॹʹ࣋ͪࠐΉ 7. ΠϯϑϥνʔϜ΍ଞνʔϜͱͷڞಉ࡞ۀ͸߹ྲྀόοϑΝΛߟྀ͢Δ