$30 off During Our Annual Pro Sale. View Details »

FOLIO のマイクロサービス in Action / FOLIO's Microservices in Action

FOLIO のマイクロサービス in Action / FOLIO's Microservices in Action

Takuya "Mura-Mi" Murakami

October 26, 2019
Tweet

More Decks by Takuya "Mura-Mi" Murakami

Other Decks in Programming

Transcript

  1. FOLIO ͷϚΠΫϩαʔϏε in Action
    2019/10/26 ΉΒΈΜ (ଜ্୓໵)
    Scalaؔ੢αϛοτ2019
    Copyright © 2019 FOLIO, Ltd. All Rights Reserved.
    1

    View Slide

  2. ଜ্୓໵ (@Mura-Mi or @mura_mi)
    ΞϓϦέʔγϣϯΤϯδχΞ in FOLIO
    ͜Ε·ͰͷΩϟϦΞ:
    * Simplex, Inc. (2012~2016)
    * CyberAgent AdTech Studio (2016~2018)
    * FOLIO (2018~ )
    $ whoami
    2

    View Slide

  3. ࠓ೔࿩͢͜ͱ
    3
    '0-*0ͷ͔ΜͨΜͳ঺հ
    ϛΫϩ ୯ମαʔϏε
    ͷ࿩
    ٕज़ελοΫ
    ϨΠϠΞʔΩςΫνϟ
    'JOBHMF6TBHF
    ϚΫϩ αʔϏεશମ
    ͷ࿩
    Ͳ͏αʔϏεΛ෼͚Δ͔
    ҆ఆӡ༻ͷίπ
    ࠓޙͷ՝୊

    View Slide

  4. FOLIO ͱ͸ʁ
    4

    View Slide

  5. Scalaؔ੢Summit 2018 ʮScalaͰͭ͘Δূ݊ձࣾͱελʔτΞοϓʯΑΓ
    https://speakerdeck.com/mura_mi/securities-and-startup-with-scala?slide=19
    8
    ڈ೥ͷ Scalaؔ੢Summit Ͱ͸…

    View Slide

  6. ։ൃ։࢝
    FOLIO ͷ͔ΜͨΜͳྺ࢙
    9


    ૑ۀ

    ςʔϚ౤ࢿ
    ЌαʔϏε։࢝

    ςʔϚ౤ࢿ
    -*/&ͱ࿈ܞ։࢝

    ͓·͔ͤ౤ࢿ
    αʔϏε։࢝

    ϫϯίΠϯ౤ࢿ
    αʔϏε։࢝

    "84Ҡߦ։࢝

    ਖ਼ࣜαʔϏε։࢝

    View Slide

  7. ϛΫϩͳ࿩
    10
    Photo by Darius Cotoi on Unsplash

    View Slide

  8. Scala
    11
    ૑ۀ౰͔࣌Β4DBMBϚΠΫϩαʔϏεͰ։ൃ
    Λελʔτ
    υϝΠϯ஌ࣝͷදݱྗ
    +7.֎෦ػؔγεςϜͱͷۚ༥ಛ༗ͷϓϩτ
    ίϧ΍4%,ʹରԠ͠΍͍͢

    View Slide

  9. Finagle, Finatra, TwitterServer
    12
    'JOBHMF5XJUUFSࣾ੡ͷ31$ϑϨʔϜϫʔΫ
    5XJUUFS4FSWFS5XJUUFS಺Ͱͷ'JOBHMFαʔόʔΛηοτΞοϓ͢
    Δͱ͖ͷςϯϓϨʔτΛ044Խͨ͠΋ͷ
    'JOBUSB'JOBHMFͱ5XJUUFS4FSWFSΛར༻ͨ͠ΞϓϦέʔγϣϯϑ
    ϨʔϜϫʔΫɽϧʔςΟϯά%4-΍%*Λఏڙ
    ຖ݄ϦϦʔε͕͋Δ WFS͕ZZZZNNܗࣜ$BM7FSͱ͍͏

    View Slide

  10. Thrift
    13
    'BDFCPPL͕։ൃͨ͠31$ϑϨʔϜϫʔΫΠϯλʔϑΣΠ
    εఆٛݴޠ͓ΑͼόΠφϦ௨৴ϓϩτίϧ
    'JOBUSB͕ओʹαϙʔτ͍ͯ͠Δͷ͕)551 3&45"1*
    ͓
    Αͼ5ISJGU
    *%-ͷ͋Δ31$ϓϩτίϧͷඞཁੑܕ҆શɼ໌֬ͳ"1*
    ͷεΩʔϚ؅ཧ
    '0-*0্ཱͪ͛ظʹ͸H31$͕·ͩਖ਼ࣜϦϦʔεͷஈ֊Ͱ
    ͸ͳ͔ͬͨ

    View Slide

  11. ϨΠϠυΞʔΩςΫνϟ
    14
    Photo by Burhan Rexhepi on Unsplash

    View Slide

  12. * ؔ৺ͷ෼཭Λ࣮ݱ͢Δ্ͰɼϏδωε
    ϧʔϧͷ࣮૷ΛΠϯϑϥ (ϑϨʔϜϫʔ
    Ϋ΍ϛυϧ΢ΣΞ) ʹґଘͤ͞ͳ͍ɽ
    * ϑϨʔϜϫʔΫ΍ϛυϧ΢ΣΞͷબ୒ࢶ
    ͕࣮࣭1͔ͭ͠ແ͍૊৫Ͱ΋ɼυϝΠϯ
    ͷ࣮૷ΛϐϡΞʹอͭ͜ͱͰϏδωε
    ϧʔϧͷมߋͳͲʹ΋ॊೈʹରԠͰ͖
    ΔΑ͏ʹͳΔɽ
    15
    ΫϦʔϯΞʔΩςΫνϟ

    View Slide

  13. FOLIO ͰͷయܕతͳϨΠϠΞʔΩςΫνϟ
    16
    EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    '0-*0ͷϚΠΫϩαʔϏεʹ͓͚ΔϨΠ
    Ϡ෼͚Λنఆ͢Δࣾ಺ϑϨʔϜϫʔΫ͸
    ಛʹଘࡏ͠ͳ͍
    ֤αʔϏεͷ։ൃ։࢝࣌ظʹΑͬͯ͹Β
    ͖ͭ͸͋Δ͕ɼ࠷ۙͷαʔϏεͷߏ଄͸
    ͓͓Αͦ͜ͷ༷ʹͳ͍ͬͯΔ
    ͜ͷίϯϙʔωϯτͦΕͧΕΛTCUͷα
    ϒϓϩδΣΫτͱͯ͠ఆٛ͠ɼґଘͷҧ
    ൓͸ίϯύΠϧ͕௨Βͳ͍Α͏ʹ͍ͯ͠
    Δ

    View Slide

  14. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    domain ϨΠϠ
    17
    ͍ΘΏΔʮϏδωεͷؔ৺ࣄʯ
    ΤϯςΟςΟɺ஋ΦϒδΣΫτ
    ϦϙδτϦఆٛ USBJU

    ࣮૷͕Ͳͷ༷ʹͳ͍ͬͯΔ͔͸ͳΔ΂͘Ӆ͢
    3%# 3FEJT ώʔϓΩϟογϡ ଞϚΠΫϩ
    αʔϏε

    EPNBJO

    View Slide

  15. PBR (Price and Book-Value Ratio, גՁ७ࢿ࢈ഒ཰) = גՁ / BPS
    18
    value object: ܭࢉࣜΛܕʹམͱ͠ࠐΉ

    View Slide

  16. PBR (Price and Book-Value Ratio, גՁ७ࢿ࢈ഒ཰) = גՁ / BPS
    18
    value object: ܭࢉࣜΛܕʹམͱ͠ࠐΉ
    ϓϦϛςΟϒ஋͸ϥοϓ͢Δ

    View Slide

  17. PBR (Price and Book-Value Ratio, גՁ७ࢿ࢈ഒ཰) = גՁ / BPS
    18
    value object: ܭࢉࣜΛܕʹམͱ͠ࠐΉ
    ਺ࣜΛϝιουͱͯ͠ද͢

    View Slide

  18. ఆ͚ٛͩॻ͘
    19
    ֎෦αʔϏεݺͼग़͠ͷఆٛ

    View Slide

  19. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    domain: Ͳ͜·Ͱִ཭͢Δʁ
    20
    Ӆ͍ͯ͠Δٕज़ৄࡉ
    31$ΞϓϦέʔγϣϯ'8 'JOBHMF'JOBUSB

    4DBMB%#Ϛοϐϯά 2VJMM

    ϓϨθϯςʔγϣϯ 5ISJGU

    Ӆ͍ͯ͠ͳ͍ٕज़ৄࡉ
    ඇಉظॲཧΛද͢ܕΫϥε 5XJUUFS'VUVSF

    δΣωϦοΫϓϩάϥϛϯά TIBQFMFTT

    ϚΠΫϩαʔϏεͷϝϦοτͱͯ͠ʮٕज़ҟ࣭ੑʯͱ͋Δ
    ͕ɼ࣮ࡍ͸ʜ

    EPNBJO

    View Slide

  20. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    application ϨΠϠ
    21
    ʮϢʔεέʔε૚ʯͱ΋ݺ͹ΕΔ෦෼
    EPNBJOϨΠϠͷ஌ࣝΛ૊Έ߹Θͤͯ"1*΍όο
    ν࣮ߦ࣌ͷॲཧ಺༰Λهड़͢Δ
    BQQMJDBUJPO

    View Slide

  21. Ϣʔεέʔε͸ Request ͔Β Response ΁ͷؔ਺Ͱ͋Δ
    22
    use case trait

    View Slide

  22. Just pure Scala case class
    23
    DTO implementation

    View Slide

  23. ۩ମతͳܕύϥϝʔλʔΛ౰ͯ͸ΊΔͱʁ
    24
    use case implementation

    View Slide

  24. ࣮ࡍʹ΍͍ͬͯΔॲཧ͸ʁ
    25
    use case implementation

    View Slide

  25. ࣮ࡍʹ΍͍ͬͯΔॲཧ͸ʁ
    25
    use case implementation
    EPNBJOϨΠϠͷૢ࡞

    View Slide

  26. ࣮ࡍʹ΍͍ͬͯΔॲཧ͸ʁ
    25
    use case implementation
    Ϣʔεέʔεݻ༗ͷॲཧ
    Ϣʔεέʔεݻ༗ͷॲཧ

    View Slide

  27. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    application: සग़ॲཧͱυϝΠϯ΁ͷৠཹ
    26
    BQQMJDBUJPOϨΠϠͰසग़͢Δॲཧ͸
    "QQMJDBUJPO4FSWJDFͱݺΜͰڞ௨Խͨ͠Γ
    "QQMJDBUJPOϨΠϠͱ%PNBJOϨΠϠͷڥ໨͸ᐆ
    ດ͕ͩɼBQQΛॻ͖ͳ͕ΒEPNBJOʹ͍࣋ͬͯ
    ͘ &WBOTຊʹग़ͯ͘Δʮৠཹʯ͸ॏཁͳ࡞ۀ

    BQQMJDBUJPO

    View Slide

  28. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    presentation ϨΠϠ
    27
    "1*Λ࣮૷͢Δٕज़ৄࡉ૚
    '0-*0ͩͱຆͲ͕5ISJGUͳͷͰɺϢʔεέʔε
    %UPͱ5ISJGUͷڮ౉͠ͳͲ͕ओͳ໾ׂ
    QSFTFOUBUJPO

    View Slide

  29. ࣾ಺ͷ׳ྫ্ Adapter ͱಡΜͰ͍Δ͕ɼTranslator ΍ Converter ͷ΄͏͕͍ۙ
    (ൺֱత৽͍͠αʔϏεʹ͸ͦͷΑ͏ͳωʔϛϯά΋͋Δ)
    28
    RequestAdapter

    View Slide

  30. ࣾ಺ͷ׳ྫ্ Adapter ͱಡΜͰ͍Δ͕ɼTranslator ΍ Converter ͷ΄͏͕͍ۙ
    (ൺֱత৽͍͠αʔϏεʹ͸ͦͷΑ͏ͳωʔϛϯά΋͋Δ)
    28
    RequestAdapter
    5ISJGUͷϦΫΤετҾ਺

    View Slide

  31. ࣾ಺ͷ׳ྫ্ Adapter ͱಡΜͰ͍Δ͕ɼTranslator ΍ Converter ͷ΄͏͕͍ۙ
    (ൺֱత৽͍͠αʔϏεʹ͸ͦͷΑ͏ͳωʔϛϯά΋͋Δ)
    28
    RequestAdapter
    Ϣʔεέʔε૚ͷϦΫΤετ%50

    View Slide

  32. ͻͨ͢Β Thrift ͷੜͷ஋Λ VO ܕʹ͸Ί͜ΜͰ͍͘ 29
    RequestAdapter implementation

    View Slide

  33. RequestThrift → RequestDto → UseCase → ResponseDto → ResponseThrift
    30
    Gateway

    View Slide

  34. RequestThrift → RequestDto → UseCase → ResponseDto → ResponseThrift
    31
    Gateway

    View Slide

  35. Gateway ʹ·ͱΊΔͷ͸ DI ʹ͓·͔ͤͯ͠… 32
    components

    View Slide

  36. Finatra ͷ controller ʹ৯ΘͤΔ
    33
    controller

    View Slide

  37. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    presentation ϨΠϠ
    34
    QSFTFOUBUJPO

    View Slide

  38. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    idl
    35
    JEM΄ͱΜͲ5ISJGU*%-ͷΈͰߏ੒͞Εͨαϒϓϩ
    δΣΫτ
    5ISJGUͷ*%-ͷΈΛೖΕͨKBSϑΝΠϧΛެ։
    *%-ͷίϯύΠϧ͸ެ։ଆͰ͸ͳ͘ར༻͢Δଆͷ࢓ࣄ

    ࣗαʔϏεͷ5ISJGU*%-ΛίϯύΠϧ
    JEM
    JEMJOUFSOBM

    View Slide

  39. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    idl-external
    36
    ґଘ͢ΔϚΠΫϩαʔϏεͷίϯύΠϧΛߦ͏
    JEMFYUFSOBM

    View Slide

  40. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    infrastructure
    37
    EPNBJOϨΠϠͰఆ͚ٛͩॻ͍ͨϨϙδτϦFUDΛ
    %#ΫΤϦɺ3FEJTίʔϧɺଞϚΠΫϩαʔϏε
    ίʔϧͰ࣮૷͢Δ
    JOGSBTUSVDUVSF

    View Slide

  41. Finagle Client Λୟ͍ͯ Domain Model ʹ٧Ί௚͢
    38
    external service invocation implementation

    View Slide

  42. Finagle Client Λୟ͍ͯ Domain Model ʹ٧Ί௚͢
    38
    external service invocation implementation
    5ISJGU*%-͔Βੜ੒͞Εͨ'JOBHMF$MJFOU

    View Slide

  43. Finagle Client Λୟ͍ͯ Domain Model ʹ٧Ί௚͢
    38
    external service invocation implementation
    ଞαʔϏεͷฦΓ஋ΛυϝΠϯʹॻ͖ى͜͢

    View Slide

  44. EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    CBUDIPSTFSWFS

    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM
    entrypoint
    39
    ࠷ऴతͳ࣮ߦΫϥε΍DPOpHVSBUJPOΛஔ͘
    CBUDIPSTFSWFS

    FOUSZQPJOU

    View Slide

  45. ੲ࿩: ࠷ॳ͔Β͜ͷߏ੒Ͱ͸ͳ͔ͬͨ
    40
    TFSWFS CBUDI
    QSFTFOUBUJPO
    DPNNPO
    %#QFSTJTUFODF
    JEM
    EPNBJO
    BQQMJDBUJPO
    CBUDITQFDJpD
    BQQMJDBUJPO
    ҙਤ͍ͯ͠Δ͍ͳ͍ʹؔ
    ΘΒͣɼυϝΠϯϩδοΫ
    هड़ͱJEM͕ີ઀ʹͭͳ
    ͕͍ͬͯͨɽ
    3FQPTJUPSZ͕5ISJGUߏ
    ଄ମΛฦ͢
    ଞαʔϏεͷ5ISJGUߏ
    ଄ମΛͦͷ··࢖͏
    TFSWFSTQFDJpD
    BQQMJDBUJPO
    TFSWFSTQFDJpD
    JOGSB
    CBUDITQFDJpD
    JOGSB

    View Slide

  46. Thrift ͷੜ੒෺ΛϏδωεϧʔϧهड़ʹ༻͍ͳ͍
    41
    υϝΠϯϨΠϠΛ*%-͔Βੜ੒ͨ͠ఆٛʹґଘͤ͞ͳ͍ͷ͕ԿΑ
    Γେࣄ
    ϝϯςφϯε࣌ͷϥΠϑαΠΫϧ͕ҧ͏
    "1*͸֎෦αʔϏεͱͷܖ໿ɽޙํޓ׵ੑΛۃྗอͭΑ͏ʹ
    ӡ༻͢Δ
    ࣗαʔϏε಺ͷσʔλϞσϧ͸αʔϏεͷਐḿʹैͬͯॊೈ
    ʹݟ௚ͨ͠ΓɼϦϑΝΫλϦϯά͍ͨ͠
    σʔλߏ଄ΛυϥεςΟοΫʹมߋ͢Δ͜ͱ͸ଟ͘ͳ͍͕ɼ
    ໊લͷݟ௚͠͸͔ͳΓଟ͍ҹ৅ ͜Ε·Ͱݟ͑ͳ͔ͬͨڥք
    Λݟग़ͨ͠Γ͢Δ

    ஋ΦϒδΣΫτΛ࢖͑ͳ͍ɻৼΔ෣͍Λ஋ΦϒδΣΫτ౳ͷυϝ
    ΠϯΦϒδΣΫτʹدͤΒΕͳ͍

    View Slide

  47. Finagle ΛͲ͏࢖͏͔
    42

    View Slide

  48. Finatra Λར༻ͨ͠αʔϏεͷςϯϓϨʔτΛࣾ಺ϥΠϒϥϦͱ͢Δ
    43
    ࣾ಺ϥΠϒϥϦ util-finagle-all

    View Slide

  49. ఆظతʹΞοϓσʔτ͢Δ (ຌͦ൒೥ʹҰ౓ʁ) 44
    util/util-finagle-all

    View Slide

  50. TwitterServer admin ʹϖʔδΛ௥Ճ͢Δ
    45
    'JOBHMF4FSWJDFΛ5XJUUFS4FSWFSΛఴ͑ͯىಈ͢Δͱɺ
    )551BENJO6*͕ىಈͯ͠ɺ֤छϝτϦΫε΍UPHHMF ޙ

    ͷঢ়ଶ͕֬ೝͰ͖Δɻ
    ͜ͷ5XJUUFS4FSWFSͷBENJOϖʔδʹ͸ಠࣗͷϖʔδΛ
    ௥Ճ͢Δ͜ͱ͕ग़དྷΔɻ
    SFBEܥͷ"1*ͷத਎ͷ֬ೝ΍ɺରސ٬ϝοηʔδૹ৴ͷϦτϥΠ
    ࣮ࢪ༻ͷӡ༻ϢʔςΟϦςΟΛઃ͚Δͷʹ࢖͍ͬͯΔ
    ຊ൪؀ڥ͸4".-͔ΒϦμΠϨΫτ͢ΔΑ͏ʹͯ͠ɺಛఆͷϩʔϧ
    ͕Ξλον͞Ε͍ͯͳ͍ͱ৮Εͳ͍Α͏ʹͳ͍ͬͯΔ

    View Slide

  51. TwitterServer HTTP Admin
    46

    View Slide

  52. ಠࣗʹ௥Ճͨ͠ϖʔδ͔Β API ฦΓ஋ΛݟΔ
    47

    View Slide

  53. ಠࣗʹ௥Ճͨ͠ϖʔδ͔Β API ฦΓ஋ΛݟΔ
    47
    ௥Ճͨ͠ϝχϡʔ

    View Slide

  54. ಠࣗʹ௥Ճͨ͠ϖʔδ͔Β API ฦΓ஋ΛݟΔ
    47
    "1*ͷத਎Λ֬ೝͰ͖ΔΑ͏ʹ

    View Slide

  55. ϚΫϩͳ࿩
    48
    Photo by timJ on Unsplash

    View Slide

  56. ϚΠΫϩαʔϏεͷ
    ڥքΛݟग़͢ࢹ఺
    49
    Photo by Adli Wahid on Unsplash

    View Slide

  57. ϚΠΫϩαʔϏεΛͲ͏੾Δ͔
    50
    ʮϚΠΫϩαʔϏεͷڥք͸υϝΠϯڥքͰ͋
    Δʯͱ͋Δ
    υϝΠϯڥքΛݟۃΊΔͷ͸γεςϜΛ࡞Δਓ
    ͷ࢓ࣄͳͷͰɼࣄۀ΍αʔϏεͷ਺͚ͩ͋Δ
    '0-*0ͰͲ͏ଊ͍͑ͯΔ͔Λ͓఻͑͢Δ͜ͱͰ
    ࢀߟʹͳΕ͹

    View Slide

  58. ૊৫ͱͷҰக:ʮϓϩμΫτʯͱʮۀ຿ج൫ʯ
    51
    '0-*0Ͱ͸ɼ
    ਓͷސ٬͕ෳ਺ͷۚ༥঎඼Λӡ༻͢Δ
    ͦΕͧΕͷۚ༥঎඼͸ಠࣗͷӡ༻ϩδοΫΛ࣋ͭ
    ਓͷސ٬ͷޱ࠲։ઃ৹ࠪ͸౓͚ͩߦ͏ɽͭ·Γۚ
    ༥঎඼Λ·͍ͨͯސ٬JE͸ͭ
    ސ٬ͷอ༗͢Δۚ༥঎඼͝ͱʹ঎඼ޱ࠲͕ଘࡏ͢Δ΂
    ͖͕ͩɼ࠷ऴతͳצఆॲཧ͸ू໿͢Δ΂͖
    ͜ΕΛҙࣝͯ͠ɼۚ༥঎඼Ͱग़དྷ্͕ΔͭͷίϯςΩε
    τΛʮϓϩμΫτʯͱݺͼɼϓϩμΫτΛ·͍ͨͰσʔλ
    Λѻ͏ྖҬΛʮۀ຿ج൫ʯͱݺͿΑ͏ʹ͍ͯ͠Δ

    View Slide

  59. ʮϓϩμΫτʯͱʮۀ຿ج൫ʯ
    52
    ςʔϚ౤ࢿ ϫϯίΠϯ౤ࢿ
    ސ٬ج൫ ސ٬৘ใ؅ཧɼޱ࠲։ઃɼ$4ରԠ

    ূ݊ج൫ צఆ؅ཧɼೖग़ۚɼ஫จ؅ཧFUD

    ͓·͔ͤ౤ࢿ
    ۀ຿ج൫
    ϓϩμΫτ

    View Slide

  60. ࣗࣾͱଞࣾ: ϑΝαʔυͰ͋Γ෗ഊ๷ࢭ૚
    53
    ۚ༥αʔϏεΛࢧ͑ΔγεςϜ͸ɼࣗࣾҎ֎ͷఏڙ͢ΔγεςϜʹ
    ґΔϘϦϡʔϜ͕େ͖͍
    औҾॴϒϩʔΧʔͱͷ஫จ఻ୡ
    גՁ഑৴ɼίϯηϯαε༧૝σʔλ഑৴ σʔλϕϯμʔ

    צఆܥγεςϜ ֎෦"41Λར༻

    ۜߦৼࠐड෇γεςϜ
    ఏܞઌαʔϏεͱͷ࿈ܞ
    FUDʜ
    σʔλΛड͚౉͢ϓϩτίϧ͕ҧͬͨΓɼϕϯμʔಠࣗͷޠኮ֓
    ೦Λϥοϓ͢ΔͨΊʹϚΠΫϩαʔϏεΛݐͯΔɽ'0-*0಺෦͔
    Β͢Δͱ෗ഊ๷ࢭ૚ɼ֎෦͔ΒݟΔͱϑΝαʔυͱͯ͠ػೳ͢Δɽ

    View Slide

  61. ྫ: ֎෦γεςϜͱϚΠΫϩαʔϏε
    54
    σʔλϕϯμʔ
    40"1
    9.-

    $47WJB4'51
    ϕϯμʔಠࣗͷ
    σʔϞϯόΠφϦ
    ͷαϒεΫϥΠϒ
    3&45"1*$BMM
    '0-*0
    ϑϩϯτ
    ސ٬ࢿ࢈
    ࢀরܥ
    ঎඼؅ཧ
    -*/&޲͚
    'BDBEF
    σʔλ഑৴
    ϕϯμʔ
    σʔλऔΓ
    ࠐΈ

    View Slide

  62. ୭͕࢖͏ʁσʔλͷྲྀΕ͸ʁ
    55
    ʮϢʔβʔʯ͸จ຺ʹґͬͯͭͷҙ
    ຯΛ࣋ͪ͑Δ
    ސ٬
    ࣾ಺ΦϖϨʔλʔίϯςϯπ
    νʔϜ
    ϑϩϯτΞϓϦέʔγϣϯ͕ҧ͏
    4DBMBαʔϏε͸ಉҰϨϙδτϦ͔
    Βෳ਺αʔόʔΛݐͯͨΓ͢Δ
    BENJOͱUP$αʔϏεͰεέʔ
    ϧΛม͑ͨΓ͢Δ
    BENJOࣾ಺ΞϓϦ޲͚"1*
    TFSWJDFUP$αΠτ޲͚"1*

    View Slide

  63. αʔϏεΛࢭΊͣʹӡ༻͠ଓ͚Δ
    ͨΊͷ޻෉ʁ
    56
    Photo by Eric Bruton on Unsplash

    View Slide

  64. ෼ࢄτϨʔγϯάͱ Datadog
    57
    ϑϩϯτΤϯυ͔ΒͷϦΫΤετ͸ෳ਺ͷϚΠΫϩαʔϏεͰॲ
    ཧ͞ΕΔ
    ֤αʔϏε͸ෳ਺ΠϯελϯεͰ࣮ߦ͞ΕΔ
    ֤αʔϏεΠϯελϯεͷు͖ग़͢ϩάʹJE USBDF*E
    Λ෇͠ɼ
    ϦΫΤετશମͷॲཧͷྲྀΕΛ௥੻Ͱ͖ΔΑ͏ʹ͢Δ
    ͢΂ͯͷϩά͸%BUBEPHʹू໿͠ɼ&3303ϩάݕग़࣌͸
    4MBDLʹ

    USBDF*E෇͖ͷ63-Λྲྀ͢Α͏ʹ͍ͯ͠Δ

    View Slide

  65. traceId ͱ datadog
    58

    View Slide

  66. traceId ͱ datadog
    59

    View Slide

  67. ػೳτάϧ (Feature Toggle)
    60
    ػೳ͕༗ޮͰ͋Δ͔Ͳ͏͔Λࣔ͢ਅِ஋Λαʔόʔͷঢ়ଶ
    ͱͯ͠อ࣋͢Δɽ
    ৽ػೳ΍طଘػೳͷվળ͞ΕͨίʔυΛಈ࡞؀ڥʹσϓϩΠ
    ͭͭ͠ɼͦͷίʔυΛಈ࡞ͤ͞Δ͔Ͳ͏͔ΛUPHHMF͢Δɽ
    ࣮ߦ͞Ε͍ͯΔϓϩηεͷUPHHMFΛ੾Γସ͑ΒΕΔɽ
    දࣔσʔλͷσʔλιʔε੾Γସ͑΍ύϑΥʔϚϯεվળͳ
    ͲɼUPHHMFແͩ͠ͱσϓϩΠΛ൐Θͳ͍ͱલޙൺֱΛߦ͑
    ͳ͍มߋͷಋೖɼݕূͳͲʹར༻͢Δɽ
    'JOBHMF͕GFBUVSFUPHHMFػೳΛ༗͍ͯ͠ΔͷͰͦΕΛ
    ׆༻͍ͯ͠Δɽ

    View Slide

  68. ػೳτάϧ (Feature Toggle)
    61
    Toggle ͷฦΓ஋ʹΑͬͯڍಈ͢Δ࣮૷Λ୅͑Δ

    View Slide

  69. ػೳτάϧ (Feature Toggle)
    61
    Toggle ͷฦΓ஋ʹΑͬͯڍಈ͢Δ࣮૷Λ୅͑Δ
    ಉ͡USBJUΛ࣮૷ͨ͠
    ෳ਺ͷ࣮૷

    View Slide

  70. ػೳτάϧ (Feature Toggle)
    61
    Toggle ͷฦΓ஋ʹΑͬͯڍಈ͢Δ࣮૷Λ୅͑Δ
    5PHHMFJTA*OU#PPMFBOA

    View Slide

  71. ػೳτάϧ (Feature Toggle)
    61
    Toggle ͷฦΓ஋ʹΑͬͯڍಈ͢Δ࣮૷Λ୅͑Δ
    ࣮ࡍͷUPHHMFͷฦΓ஋ʹґͬͯ

    View Slide

  72. ػೳτάϧ (Feature Toggle)
    61
    Toggle ͷฦΓ஋ʹΑͬͯڍಈ͢Δ࣮૷Λ୅͑Δ
    ͲͪΒͷ࣮૷Λಈ͔͔ܾ͢ΊΔ

    View Slide

  73. ػೳτάϧ (Feature Toggle)
    62
    ઃఆϑΝΠϧ: ੾Γସׂ͑߹ΛࢦఆͰ͖Δ

    View Slide

  74. ݁߹ϦεΫ ΛݮΒ͢޻෉
    63
    "1*ͷޓ׵ੑطଘͷ"1*ͷޙํޓ׵ੑ͸ͳΔ΂่͘͞ͳ͍
    ઃܭͷ޻෉#SFBLJOH$IBOHFΑΓ͸৽"1*
    Ϗοάόϯ݁߹ϦϦʔεΛ͠ͳ͍େ͖ͳ৽ػೳ৽ϓϩμΫ
    τϦϦʔεͷࡍ΋ɼ࢖ΘΕͳ͍"1*͔ΒૣΊʹϦϦʔεΛ
    ͠ɼຊ൪ͱ։ൃ؀ڥͰͷϞδϡʔϧͷࠩҟΛখ͘͞อͭΑ͏
    ʹ͢Δ
    ЋϦϦʔεϑϩϯτΤϯυ؀ڥΛ௨ৗͷ΋ͷʹՃ͑ͯࣾ಺
    ݶఆͰΞΫηε؀ڥΛߏங͠ɼ৽ػೳΛࣾ಺ϝϯόʔ͕ઌߦ
    ͯ͠ӡ༻ͯ͠໰୊఺Λݟ͚ͭग़͢

    View Slide

  75. ࠓޙͷ՝୊
    64
    Photo by Hans-Peter Gauster on Unsplash

    View Slide

  76. େҬత CQRS తͳϦΞʔΩςΫνϟϦϯά
    65
    τϥσΟγϣφϧͳূ݊ձࣾʹ͸ʮϑϩϯτϛυϧόοΫΦ
    ϑΟεʯͱ͍͏৬຿ػೳͷ෼ྨ͕͋Δɽ
    ϑϩϯτऩӹΛ্͛Δ෦෼ɽ

    ωοτূ݊ͩͱސ٬͕஫จΛग़͠ɼऔҾΛߦ͏෦෼
    ϛυϧϑϩϯτͷ׆ಈͷ݁ՌͷϞχλϦϯά
    όοΫϑϩϯτͷ׆ಈͷ݁Ռͷࣄޙॲཧ ࣄ຿ɼצఆFUDʜ

    ϑϩϯτϛυϧόοΫ͝ͱʹγεςϜʹٻΊΒΕΔੑ֨͸ҟ
    ͳΔ
    ϑϩϯτऔҾओମͷίϚϯυΛड͚෇͚ͯॲཧΛ͢Δݎ࿚͔
    ͭߴεϧʔϓοτͰ͋Δ͜ͱɽऩӹྗɽ
    ϛυϧ෯޿͍σʔλͷҰ؏ੑͷ͋Δࢀর
    όοΫεέʔϥϏϦςΟ

    View Slide

  77. େҬత CQRS తͳϦΞʔΩςΫνϟϦϯά
    66
    '0-*0ͷαʔόʔαΠυγεςϜ͸ʮϑϩϯτϛυϧ
    όοΫΦϑΟεʯͷ૚෼͚Λҙࣝ͠ͳ͍··։ൃͨ݁͠
    Ռɼ͢΂ͯͷϨΠϠʹ؏௨ͨ͠ϚΠΫϩαʔϏε͕ଘࡏͯ͠
    ͍Δ
    ϑϩϯτγεςϜ͸$PNNBOE ϛυϧγεςϜ͸
    2VFSZɼόοΫγεςϜ͸ଞͱ͸ҟͳΔ೔࣍όονॲཧɼͱ
    ͍͏૚͝ͱͷੑ֨ʹԠͨ͡଄Γͷ࠷దԽͱϦΞʔΩςΫ
    νϟϦϯάΛਐΊ͍ͨ

    View Slide

  78. Ұ෦ॖୀӡ༻
    67
    ϑϩϯτΤϯυͰଟ਺ͷϚΠΫϩαʔϏεͷ੒ޭϨεϙϯεΛ͢
    ΂ͯू໿Ͱ͖ͳ͍ͱϫʔΫ͠ͳ͍έʔε͕͋Δɽ
    Ұ෦ͷαʔϏε͕μ΢ϯ͍ͯ͠Δͱ͖ɼͦͷαʔϏεʹ֘౰͢Δ
    ػೳͷΈϑϩϯτͰEJTBCMFʹͯ͠΋ଞͷػೳ͸໰୊ͳ͘ճΔ࢓
    ૊Έ͕΄͍͠ɽ͜Ε͕Ͱ͖ΔͱαʔΩοτɾϒϨΠΫ౳΋ࣗ৴Λ
    ࣋ͬͯऔΓ૊ΊΔɽ
    લड़ͨ͠ϦΞʔΩςΫνϟϦϯά΋ؚΊͨαʔϏεؒґଘͷ੔ཧ
    ΍ɼϑϩϯτΤϯυͷ࢓૊Έվम΋ؚΊͯऔΓ૊Ήඞཁ͕͋Δɽ

    View Slide

  79. ϨΠϠΞʔΩςΫνϟͷະདྷ͸…??
    68
    αʔϏε୯ମͷ࣮૷ΛݟΔͱ
    Ͳ͏ͯ͠΋ϘΠϥʔϓϨʔτ
    ͕ଟ͍
    ੜ࢈ੑΛ্͛ΔͨΊʹͲ͏͠
    Α͏ʜ
    ͢΂ͯͷαʔϏε͕͜ͷߏ੒
    Λ౿ऻ͢Δ΂͖͔΋ݕ౼ͷ༨
    ஍͋Γʜ͕ͩɼࢦ਑͸ະͩແ
    ͍
    EPNBJO
    BQQMJDBUJPO
    QSFTFOUBUJPO
    *OGSBTUSVDUVSF
    FOUSZQPJOU
    JEMJOUFSOBM
    JEMFYUFSOBM
    JEM

    View Slide

  80. ·ͱΊ
    69
    Photo by Kelly Sikkema on Unsplash

    View Slide

  81. ·ͱΊ: ౰ͨΓલͷ͜ͱͰ͕͢
    70
    ద੾ͳϨΠϠʔυΞʔΩςΫνϟΛ༻͍ͯϏδωεͷม
    Խʹڧ͍γεςϜΛ࡞Δ
    ϚΠΫϩαʔϏεͷڥքΛਖ਼͘͠ݟग़ͨ͢Ίʹɼࣗ෼ͨ
    ͕࣮ͪ૷͢ΔϏδωεྖҬͱ͔ͬ͠Γ޲͖߹͏
    ϚΠΫϩαʔϏεͷ҆ఆӡ༻ͱܧଓతͳਐԽͷͨΊͷٕ
    ज़൑அΛ͢Δ

    View Slide

  82. THANK YOU

    View Slide