Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
じわじわとPerlからGoに移行しようとしている俺達のマイクロサービシーズの紹介 / The ...
Search
mackee
March 05, 2022
Programming
2
3k
じわじわとPerlからGoに移行しようとしている俺達のマイクロサービシーズの紹介 / The migrating to microservices in Go from Monolith in Perl
YAPC::Japan::Online 2022 Track B
mackee
March 05, 2022
Tweet
Share
More Decks by mackee
See All by mackee
perl for shell, awk and sed programmers
mackee
2
1.3k
今更GoのWebフレームワークを作ろうとしているワケ / Why am I trying to create a Go web framework now?
mackee
1
63
マイクロサービス化を利用した Goへの移行事例
mackee
0
100
PerlでつくるフルスクラッチWebAuthn/パスキー認証 / Demonstration of full-scratch WebAuthn/Passkey Authentication written in Perl
mackee
3
3.2k
SRE定例やその辺の取り組みをアプリケーションエンジニア目線で語る / "Observe" about SRE Meeting by Application Engineer
mackee
0
1.8k
TinyGoで使えるORM sqllaの 紹介とTinyGoで使えるようにするための工夫
mackee
0
1.1k
Go向けORM sqllaの紹介と JOINやUNIONを含んだクエリの扱い方
mackee
0
4.4k
デプロイ今昔物語 〜CGIからサーバーレスまで〜 / The deployment technics
mackee
10
12k
E2Eテストから負荷試験シナリオを作ってみた / Why do we make a scenario of load testing from E2E testing scenarios
mackee
3
5.4k
Other Decks in Programming
See All in Programming
『ドメイン駆動設計をはじめよう』のモデリングアプローチ
masuda220
PRO
8
540
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
4
1.5k
Jakarta EE meets AI
ivargrimstad
0
690
CSC509 Lecture 11
javiergs
PRO
0
180
WebフロントエンドにおけるGraphQL(あるいはバックエンドのAPI)との向き合い方 / #241106_plk_frontend
izumin5210
4
1.4k
Generative AI Use Cases JP (略称:GenU)奮闘記
hideg
1
300
Make Impossible States Impossibleを 意識してReactのPropsを設計しよう
ikumatadokoro
0
240
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
Compose 1.7のTextFieldはPOBox Plusで日本語変換できない
tomoya0x00
0
200
CSC509 Lecture 12
javiergs
PRO
0
160
Quine, Polyglot, 良いコード
qnighy
4
650
A Journey of Contribution and Collaboration in Open Source
ivargrimstad
0
1k
Featured
See All Featured
Designing Experiences People Love
moore
138
23k
Six Lessons from altMBA
skipperchong
27
3.5k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
364
24k
Making the Leap to Tech Lead
cromwellryan
133
8.9k
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
What’s in a name? Adding method to the madness
productmarketing
PRO
22
3.1k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
Why You Should Never Use an ORM
jnunemaker
PRO
54
9.1k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
169
50k
StorybookのUI Testing Handbookを読んだ
zakiyama
27
5.3k
Building an army of robots
kneath
302
43k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
16
2.1k
Transcript
͡Θ͡ΘͱPerl͔ΒGoʹ Ҡߦ͠Α͏ͱ͍ͯ͠Δ ԶͨͪͷϚΠΫϩαʔϏγʔζ YAPC::Japan::Online 2022 2022-03-05 Track B 13:40ʙ14:20 @macopy
a.k.a @mackee_w
͜ͷηογϣϯͷུ֓
1FSMೖֶࣜ͘ΜIUUQTQFSMFOUSBODFDPOOQBTTDPN 3FOÉF'SFODIIUUQTSFOFFGSFODICMPHTQPUDPN
(·ͩ)શ෦ஔ͖͍͑ͯͳ͍
None
Tonamelͷنײ -PCJ5PVSOBNFOU
ޙͷ5POBNFM ։ൃ։࢝ 5POBNFMʹ໊લ͕มߋ 1FSMͷߦߦ ͭͳ͗͜ΈͰएׯ૿Ճ 1FSMͷߦߦ (PϚΠΫϩαʔϏεº (Pͷߦߦ ͏ͪίʔυੜߦ
͜Ε·Ͱ2΄Ͳ͔͚ͯ ͡Θ͡ΘҠߦͭͭ͋͠Δ
ͦͷؒʹػೳ͕૿͑
େձ૿͍͑ͯ͘
͜ͷηογϣϯͰ ٞͷҰൠԽΛ͋͑ͯͤͣ TonamelͰͷࣄྫΛ͠·͢
ୈ1ষ: ͳͥϚΠΫϩαʔϏεʹ͢Δͷ͔ʁ ୈ2ষ: ॳΊͯͷαʔϏεׂ ୈ3ষ: ϚΠΫϩαʔϏεͨͪͷ࿈ܞํ๏
@macopy • ໘ന๏ਓΧϠοΫ eεϙʔπࣄۀ෦ TonamelαʔόαΠυςοΫϦʔυ • Perlେ͖ Go͖ • GGST༻Ωϟϥ:
ϥϜϨβϧ • ISUCON11 ༏উ ←NEW!
ୈ1ষ ͳͥϚΠΫϩαʔϏεʹ͢Δͷ͔ʁ
Ҡߦલͷߏ(ʙ2020-07) ͜ͷޙʹϚΠΫϩαʔϏεԽʹ߹ΘͤͯECSԽ
՝: PerlͰڊେGraphQLΛ ͘͞ͷՙ͕ॏ͍ • TonamelͰओͳAPIܗࣜͱͯ͠GraphQLΛ ࠾༻͍ͯ͠Δ • ڊେͳϨεϙϯεΛฦ͢ͱ͖ɺGraphQL.pm 0.47(2021-02ϦϦʔε)ҎલͰܕνΣοΫ ͕ϨεϙϯελΠϜͷ΄ͱΜͲΛΊ͍ͯͨ
• GraphQLΛ͍ଓ͚Δʹɺ͜ͷ͋ͨΓʹԿ Β͔ͷվળҊ͕ඞཁͩͬͨ
ݱࡏͷGraphQL.pm(>=0.47)σϑΥϧτͰ ࣮ߦ࣌ܕνΣοΫ͕Φϑʹͳ͍ͬͯΔ ࣌ʹͳ͍ͬͯͨGraphQL QueryͷϕϯνϚʔΫΛͬͯΈͨ(256ਓγϯάϧΤϦϛωʔγϣϯͷΫΤϦ) $ carton exec perl -Ilib tmp/graphql_benchmark.pl
bench 47bIg Benchmark: timing 10 iterations of default... default: 4 wallclock secs ( 3.22 usr + 0.08 sys = 3.30 CPU) @ 3.03/s (n=10) Rate default default 3.03/s — `local $ENV{PERL_STRICT} = 1;` ΛίʔυʹೖΕͯܕνΣοΫΛ༗ޮʹͯ͠ΈΔ(࣌͜ͷঢ়ଶͩͬͨ) $ carton exec perl -Ilib tmp/graphql_benchmark.pl bench 47bIg Benchmark: timing 10 iterations of default… default: 7 wallclock secs ( 6.57 usr + 0.07 sys = 6.64 CPU) @ 1.51/s (n=10) Rate default default 1.51/s --
͍͔ͭ͘ͷબࢶ • GraphQLΛ࠾༻͢Δ߹ • Perl ͷ··Ͱ GraphQL ΛߴԽ͢Δ • GraphQLΛίετΊʹฦͤΔϥΠϒϥϦ͕͋ΔݴޠʹΓ͑Δ
• ͦΕҎ֎Λ࠾༻͢Δ߹ • PerlͰѻ͑ΔൣғͷAPIతͳͷʹ͢Δ • XslateͰMPAʹΔ
GraphQLҎ֎ͷ՝: εέʔϦϯάੑ • ͕͋ΔτϥϑΟοΫͷରԠ • όοΫΤϯυDB͕Aurora MySQLͳͷͰɺखಈͰεέʔϧΞοϓ/Πϯ ͯ͠ෛՙʹରԠ͍ͯͨ͠ • =>
ӡ༻ͷख͕ؒ͠ΜͲ͍ͷͰɺࣗಈͰਫฏεέʔϧ͢Δσʔλε τΞʹҠߦ͍ͨ͠Ϟνϕʔγϣϯ • ྫ͑DynamoDBͱͳΔ͕ɺPerlͰDynamoDBΛѻ͏ϊϋ͕ͳ͍
ΠϕϯτʹΘΕΔαʔϏεͳͷͰ τϥϑΟοΫͷ͕େ͖͍
GraphQLҎ֎ͷ՝: ੩తܕ͕ͳ͍ݴޠ͕ਏ͍ • τʔφϝϯτදͷߏஙൺֱతෳࡶͳϓϩάϥϛϯάΛཁٻ͞ΕΔํ • εΠευϩʔͷOMW%, μϒϧΤϦϛͷഊऀαΠυͷஔͳͲ • ෳࡶͳϩδοΫΛΉͷʹܕ͕͋Δͱ”҆৺”͢Δ •
ͪΖΜςετඞཁ
ͱ͍͏Θ͚ͰGo͕͍͍ͨ • GraphQL => gqlgenͱ͍͏εΩʔϚϑΝʔετͰ੩తܕνΣοΫΛ ߦ͏ϥΠϒϥϦ • ਫฏεέʔϦϯάՄೳͳDBΛ͍͍ͨ => GoެࣜAWS
SDK͕͋ ΓɺDynamoDBΛѻ͏ͨΊͷϥούʔϥΠϒϥϦ͋Δ • ੩తܕ͕ͪΐ͏Ͳ͍͍ײ͡ʹଘࡏ͢Δ • ͳʹΑΓνʔϜϝϯόʔ͕աڈʹͬͨ͜ͱ͕͋ΔݴޠͰ͋Δ
Ͳ͏GoΛΈࠐΉ͔ʁ • શ෦Goʹ͢Δͱʁ • ࠓ·Ͱೖ͍ͬͯΔDBʹೖ͍ͬͯΔσʔλΛͲ͏͢Δͷ͔ • શ෦GoͰ࣮͠ऴΘΔ·Ͱ৽ن։ൃΛࢭΊΔͷ͔ • => ݁ߏ͍͠
• Ұ෦͚ͩGoʹ͍ͨ͠ • ͕ͩDBΛڞ༗ͨ͘͠ͳ͍ DynamoDBʹ͍ͨ͠
ϚΠΫϩαʔϏεׂ͢Δ
ҰൠతͳϚΠΫϩαʔϏεͷޮೳ • ݸʑͷΞϓϦέʔγϣϯͷΛখ͘͞อͯΔ • ΞδϦςΟ͕ߴ͘ͳΔ • ΞϓϦέʔγϣϯ͝ͱʹదͳΞʔΩςΫνϟΛબΔ • ؔ৺͝ͱʹνʔϜΛׂ͢Δ͜ͱ͕༰қʹͳΔ •
etc…
ϚΠΫϩαʔϏεΛΓ͔ͨͬͨͱ͍͏ΑΓ ͦΕҎ֎ͷྑ͍બࢶ͕ͳ͔ͬͨͷͰͬͨ • ϚΠΫϩαʔϏεΛબ͢Δͷʹ્͢Δཁૉ • νʔϜׂ͢Δ΄Ͳن͕େ͖͘ͳ͍ • ͚Ͳɺݱঢ়ͷΞʔΩςΫνϟͰղܾͰ͖ͳ͍՝͕͋Δ • ࠷ऴతʹϞδϡϥϞϊϦεʹ߹ମ͢ΔՄೳੑ͋Δͱࢥ͍ͬͯΔ
ͦͦϞδϡϥϞϊϦεͩͬͨͷͰ ׂ͔ͬͨ͢͠ • ઌਓ͕TonamelΛϞδϡϥϞ ϊϦεͰ࡞ͬͯ͘Ε͍ͯͨ • ׂ͢ΔͨΊͷػೳͷڥք͕ ͢Ͱʹଘࡏ͍ͯͨ͠
ͰͲ͏͍͔ͬͯ͘
ୈ2ষ ॳΊͯͷαʔϏεׂ
ॳखɺԿΛΓग़͔͢
͡ΊʹΓग़͢ͱྑ͍ͱ͞ΕΔαʔϏεͷ݅ • ͋ΔఔαʔϏε͕ʮڥք͚ͮΒΕͨίϯςΩετʯʹͦͬͯղ͞ Ε͍ͯΔલఏͰҎԼ • ଞͷίϯςΩετ͔Βͷґଘ͕গͳ͍ => ղ͍͢͠ • ϩʔϧόοΫ͕͍͢͠
=> ࡉ͔͘ϦϦʔεͰ͖Δ • ղʹΑΔརӹ͕େ͖͍
༏ઌॱҐ͚ݶ ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯΛࢀߟʹ
ͳͥτʔφϝϯτද͔ • GraphQLͷϨεϙϯελΠϜΛվળ͔ͨͬͨ͠ͷτʔφϝϯτද • => ղʹΑΔརӹ͕͋Δ • τʔφϝϯτදʹ͍ͭͯ৽ػೳ(μϒϧΤϦϛωʔγϣϯ)ͷ࣮͕༧ఆ͞Ε͍ͯͨ • =>
৽ػೳΛΔҰͱͯ͠ϚΠΫϩαʔϏεͷղ͕ߦ͑Δ • τʔφϝϯτද΄͔ͷαʔϏεʹґଘ͢ΔαʔϏεͳͷͰɺґଘ͞ΕΔଆͰ ͳ͍ • => ղͷ͢͠͞
্ͬͨͰ͜ͷஅͷৼΓฦΓ • ৽ػೳͷҰͱͯ͠ղΛߦ͏ͷ͋·ΓಘࡦͰͳ͍ • ϩʔϧόοΫ͕ͮ͠Β͘ͳΔ • ։ൃνʔϜ֎͔Βͷਐḿͷݟ͕ͨѱ͍ • ໌ࣔతʹػೳͷϚΠΫϩαʔϏεͷ࠶࣮Λ͍ͬͯΔͱ͍͏ ͷΛݴͬͨ΄͏͕ྑ͍
• ϦϦʔε͕ϏοάόϯʹͳΓ͕ͪ(͋Δఔ؇ࡦ͋Δ)
طଘͷϦΫΤετͱ ৽τʔφϝϯτදϦΫΤετͷ ͚ํ
GraphQLΤϯυϙΠϯτΛ͚Δ
ϢʔβʔใϔομʹJWTͰຒΊࠐΉ • ϞϊϦεͰड͚ͨϦΫΤετͷCookie͔ΒϦΫΤετϢʔβʔͷ ηογϣϯใΛऔΓग़͢ • ͜͜·Ͱैདྷ·Ͱ͋Δಈ࡞ • `X-Awesome-Authentication: <JWT>` ͷΑ͏ͳHTTPϔομʹJWTϊ
ܗͰೖΕΔ • ϓϩΩγͰBodyΛ͍ͬͨ͡ΓಡΜͩΓͨ͘͠ͳ͍
͞ΒʹύεΛ͚ͯ Ϣʔβ×େձͷݖݶใ༩
GraphQLͷύεΛେձ͝ͱʹ͚Δ ྫ: େձID=XXXXX ͷ߹ POST /new_awesome/graphql/XXXXX ͜ΕͰBodyΛಡ·ͳͯ͘ τʔφϝϯτදαʔϏε͕ΞΫηεϢʔβͷݖݶΛΕΔ
ͿͬͪΌ͚Δͱ͜Ε͓͢͢ΊͰͳ͍ • GraphQLΤϯυϙΠϯτ͕Ұݸʹ·ͱ·Δͷ͕͍͍ͱ͜ΖͷҰͭ • ΫϥΠΞϯταΠυෳݸʹ͔ΕΔͷରԠ͍ͯ͠ͳ͍͜ͱ͕ ଟ͍ • ͬͱ΄͔ʹΓํ͕͋ͬͨɺޙड़͢Δେ౷Ұʹ࣋ͪӽ͍ͯ͠Δ • ผղ:
ύʔεޙʹผͷAPIʹେձใ+ݖݶใ͍߹Θͤ + େձ αʔϏεΛઌʹ࡞Δ
ͰͲͷΑ͏ʹ ຊ൪ʹೖΕΔ͔
͓खܰʹαΠυΧʔʹͨ͠
αΠυΧʔʹ͢ΔϝϦοτɾσϝϦοτ • ϝϦοτ • Πϯϑϥ͕ෳࡶʹͳΒͳ͍, Ճ͢Δख͍ؒ҆ • εέʔϧΞτϞϊϦεͱҰॹʹ͢Δ => ෛՙ͕ಡΊͳ͍ͱ͖ʹศར
• σϝϦοτ • ECS Taskͷ10ίϯςφ੍ݶΛ͑Δ͜ͱग़དྷͳ͍ • αʔϏεͷधཁʹ߹ΘͤͯݸผʹεέʔϧΞτ͕ग़དྷͳ͍
ͯ͞ϦϦʔε… ͕ͩ💥Ϗοάόϯ💥Λආ͚͍ͨ
ϕετϓϥΫςΟε: 💥Ϗοάόϯ💥Λආ͚Δ • ͜ͷ߹ͷϏοάόϯͱ • ͍͖ͳΓ৽࣮ͨ͠ϚΠΫϩαʔϏεʹαʔϏεશମΛΓସ͑Δ • ϏοάόϯͷσϝϦοτ • Γ͕͠ࠔʹͳΔ
• ϦϦʔε୯Ґ͕େ͖͘ͳΔ => ݁ՌతʹσϦόϦʔ͕͘ͳΔ
τʔφϝϯτදαʔϏεͰߦͬͨ͜ͱ • Ұ෦ͷϢʔβʹݶఆػೳͱͯ͑͠ΔΑ ͏ʹఏڙ • ϑΟʔυόοΫΛΒ͍͍͢Ϣʔ βʹݶఆͯ͠ఏڙͰ͖Δ • େ͖ͳେձΛආ͚ͯఏڙ͢Δ •
چτʔφϝϯτදػೳฒߦͯ͠ఏڙ ͠ଓ͚Δ • ͕͋Εݹ͍ํΛͬͯΒ͏
β൛தʹߦͬͨ͜ͱ • ຊ൪ͰΤϥʔϩά͕ग़ͨΒ͙͢ʹ͢ • σʔλͿͬյΕܥ͍ʹগͳ͔ͬͨ(͋Δʹ͕͋ͬͨ) • ن͕େ͖ΊͷେձͰΘΕͯͨΒࢹ͍ͯ͠ΔϝτϦοΫΛݟΔ • DynamoDBΛॳΊ͍ͯͬͯͨͷͰෛՙ͕Θ͔Βͳ͔ͬͨͷ ͋Δ
• ༷ʑͯ͠େৎͦ͏ͳͷͰਖ਼ࣜϦϦʔε
͍Ζ͍Ζ͕͋ͬͨͨ͠ʂ
Ͱ͜Ε͚ͩͩͱͨͩͷ PolyglotߏͩΑͶ
ୈ3ষ ϚΠΫϩαʔϏε ͨͪͷ࿈ܞํ๏
τʔφϝϯτදαʔϏεҎ߱ͷ։ൃํ • GoΛؚΊͨpolyglotͰΕΔ͜ͱ͕Θ͔ͬͨͷͰҎԼͷํʹ͢Δ • ৽ػೳͯ͢ϚΠΫϩαʔϏεଆʹ࣮͢Δ • طଘػೳͷվमPerlϞϊϦεͷ࣮͕ۃʹૣ͍߹ͦͪΒ ʹ࣮͢Δɻͦ͏Ͱͳ͍߹ϚΠΫϩαʔϏεଆ
࣍ԿΛΓग़͢ͷ͔
༏ઌॱҐ͚ݶ
༏ઌॱҐ͚ݶ(Update൛)
εϙϯαʔػೳΛ࡞Δ͜ͱʹͳͬͨ
εϙϯαʔػೳͱ • େձϖʔδʹࠂΛࡌͤΒΕΔػೳ • ࠂओ࠵ஂମ͕ืूͯ͠ɺࠂ ओ͕ओ࠵ஂମʹ͓ۚΛ͏͜ͱͰࡌ ͤͯΒ͑Δ
ઃܭํ • εϙϯαʔαʔϏεͱܾࡁαʔϏεͷ2ͭʹׂ͢Δ • εϙϯαʔαʔϏεͷ => େձʹඥͮ͘εϙϯαʔͷཧ • ਃ༰ঝೝϑϩʔɺऔΓԼ͛ͳͲΛ͔ͭ͞ͲΔ •
εϙϯαʔ͕ԿΛͬͯਃ͞ΕΔ͔͋·Γؾʹ͠ͳ͍ • ܾࡁαʔϏε => StripeΛ༻͍ͨ͋Δਓ͔Β͋Δਓͷࢧ͍ͷཧ • Կͷࢧ͍͔ܾࡁαʔϏε͋·Γؾʹ͠ͳ͍
εϙϯαʔػೳͷσʔλͷྲྀΕ
͜͏ݴ͏ਤΛ࠷ॳʹॻ͘ͷ ͓͢͢Ίʂ
Domain Event • ৽τʔφϝϯτදαʔϏε࣮Ҏલ͔Β͋ΔඇಉظδϣϒΛҕৡ͢ΔͨΊ ͷػߏͱͯ͠Domain Eventͱݴ͏֓೦Λ༻ҙͨ͠ • ࣮ৄࡉతʹHTTPͰLambdaΛୟ͘ͱSQSʹΤϯΩϡʔ͞Εͯɺϝο ηʔδΛผͷLambda͕ىಈͯ͠ɺ֤ϚΠΫϩαʔϏεͷhandlerʹϝο ηʔδΛ৴͢Δ
• ϝοηʔδʮ◦◦͕ىͬͨ͜ʂʯͱ͍͏ײ͡Ͱpublish͞Ε͍ͯΔ • ʮ˓˓Λͯ͘͠Εʯͱ͍͏ײ͡Ͱͳ͍
େձ࡞࣌ͷϝοηʔδ৴ εϚʔτΤϯυϙΠϯτɾμϜύΠϓతͳࢥ
εϙϯαʔػೳͷͦͷଞ • σʔλετΞMySQL • τʔφϝϯτදαʔϏε΄ͲͷεέʔϧΞτੑೳ͍Βͳ͍ • ౿ΜͰͯࣾͰൺֱతѻ͑Δਓ͕ଟ͍MySQLΛ͏ • ΞʔΩςΫνϟActive Recordύλʔϯ
• τʔφϝϯτදαʔϏεClean Architecture
͜ΕͳΜͱ͔ϦϦʔεʂ
·ͱΊͱࠓޙͷల
ϚΠΫϩαʔϏεखஈͰ͋ΓతͰͳ͍ • TonamelʹͱͬͯϚΠΫϩαʔϏεҎԼͷ՝Λղܾ͢Δखஈ • ݱࡏͷαʔϏεΛࢭΊͣʹஞ࣍৽ػೳΛՃ͢Δ • ϞϊϦεଆͷ࠾༻ٕज़Ͱग़དྷͳ͔ͬͨ͜ͱΛॊೈʹಋೖ͢Δ • ࣌ظ͕དྷΕશ෦·ͨϞδϡϥϞϊϦε߹ମ͢Δͷݕ౼ •
νʔϜ͕ෳʹͳΔ͙Β͍େ͖͘ͳΔ͔Ͳ͏͔ • ࡞Δͷ͕ਖ਼͍͔͠Θ͔ΒΜॳظϞϊϦεͷ΄͏͕͍Ͱ͢ • ϞϊϦε͔ΒΓग़͢߹ɺਖ਼͘͠ಈ͘ͷ͕ͦ͜ʹ͋Δ͔Β࡞Δͷ͕ૣ͘ͳΔ
ࠓޙͷల • Apollo Federationͷಋೖ • PerlϞϊϦε, τʔφϝϯτද, εϙϯαʔ, ܾࡁͱͯ͢GraphQL ͕͔Ε͍ͯΔͷΛ౷߹͢ΔͨΊͷιϦϡʔγϣϯ
• ϞϊϦεʹ͋Δͯ͢ͷػೳΛϚΠΫϩαʔϏεׂ • ݱࡏҠ২࡞ۀதͷͷ͋Γ
Any Questions?
ࢀߟʹͨ͠ͷ • ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯSam Newman ஶ, ౡా ߒೋ ༁ • ͜ͷࢿྉΛ࡞Δࡍʹࢀরɻ͖ͬͯͨ͜ͱͷཧ͚આ໌ʹ༻͍
ͨɻ͜ͷຊͰΞϯνύλʔϯͱ͞Ε͍ͯΔ͜ͱɺTonamelͰ(ؾ ͔ͮͣʹ)ߦ͍ͬͯΔɻ
ิҨ ಠཱσϓϩΠՄೳੑ
ϚΠΫϩαʔϏεͰ͜Εͬͱ͍ͨ΄͏͕͍͍ ͧͬͯͭ • ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯͱ͍͏ຊʹॻ͔Ε͍ͯΔ ຊॻ͔ΒಘΒΕΔͷ͕͚ͭͩͩͱͨ͠Βɺ ͦΕʮϚΠΫϩαʔϏεʹಠཱσϓϩΠՄೳੑ ͷ֓೦Λ࣮֬ʹऔΓೖΕΑ͏ʯͱ͍͏͜ͱͩɻ
ಠཱσϓϩΠՄೳੑ 🤔
ಠཱσϓϩΠՄೳੑͱ • ʮ͋ΔϚΠΫϩαʔϏεʹର͢ΔมߋΛɺଞͷαʔϏεʹӨڹΛ༩͑ Δ͜ͱͳ͘ຊ൪ڥͰϓϩΠͰ͖Δͱݴ͏ߟ͑ํͩɻʯ • by ʮϞϊϦε͔ΒϚΠΫϩαʔϏεʯ • αʔϏεAΛมߋͨ͠ͱ͖ʹɺҰॹʹαʔϏεBมߋ͠ͳ͍ͱ͍͚ ͳ͍ʂͱ͍͏ͷಠཱ͍ͯ͠ͳ͍
• => ϚΠΫϩαʔϏεͰͳ͘”ࢄϞϊϦε”ͱ͍͏͜ͱʹ
ಠཱσϓϩΠՄೳੑͷద༻ • TonamelͰͦ͜·ͰશͳಠཱੑΛ୲อͰ͖͍ͯͳ͍ • τʔφϝϯτදαʔϏεPerlϞϊϦεͷαΠυΧʔલఏͷ࡞Γ • εϙϯαʔαʔϏεͱܾࡁαʔϏε΄ͱΜͲͷ௨৴͕Eventܦ༝ • ඇಉظΠϕϯτରԠ͢Δϋϯυϥʔ͕࣮͞Εͯͳ͚Εແࢹ͢ Δ͚ͩͳͷͰಠཱσϓϩΠՄೳੑ͕͋Δ
ಠཱσϓϩΠՄೳੑΛୡ͢ΔͨΊͷઓུ • αʔϏεؒͷґଘؔΛDAG(༗ඇ८ճάϥϑ)Ͱఆٛ • αʔϏεؒAPIʹඇޓ͕ൃੜ͢Δ߹ • ґଘ͞ΕΔଆޙํޓੑΛߟྀ͢Δ • deprecatedͳkeyΛҠߦظؒαϙʔτ͢ΔͳͲ •
ґଘ͢ΔଆޓੑΛߟྀͤͣ͏
αʔϏεؒґଘؔͷDAG
“جຊతʹ” ಉ࣌ʹߋ৽͕ඞཁͰ͋ͬͯ ґଘ͞ΕΔଆ͔ΒσϓϩΠ͢ΕOK σϓϩΠ͚Ε͍͍͚ΕͲݕূͳͲͷؔͰػೳ୯ҐͰσϓϩΠ͕ͪ͠
TonamelͷσϓϩΠϑϩʔ • લఏ: αʔόɾϑϩϯτΤϯυɾΠϯϑϥͯ͢ҰͭͷϨϙδτϦ (monorepo)Ͱཧ͍ͯ͠Δ • ϦϙδτϦ͕ࢄͯ͠ͳ͍ͷͰɺmasterϒϥϯνͰϩʔΧϧڥΛ ཱͯͨΒͦͷ··ຊ൪ՔಇͷαʔϏεͱΠίʔϧͷͷ͕ಘΒΕΔ • ͦΕͧΕͷαʔϏεಠཱͨ͠ECSαʔϏεσϓϩΠ͞ΕΔ
• σϓϩΠπʔϧkayac/ecspresso
monorepoͳͷͰ શ෦ͷαʔϏεΛͲʔΜͱΔͧʂ
ຖճશ෦ͷαʔϏεΛ σϓϩΠ͍ͯ͠Δͱ͍ʂ
ࢄϞϊϦεσϓϩΠ͕͘ͳΔ • σϓϩΠ͢Δͱ͖ʹͯ͢ͷαʔϏεΛ͋Δॱ൪ʹԊͬͯσϓϩΠ͠ ͳ͍ͱ͍͚ͳ͍ͱͳΔͱɺσϓϩΠʹඇৗʹ͕͔͔࣌ؒΔ • ϩʔϦϯάσϓϩΠͷ߹ Blue/Greenͷ߹ૣ͍͔ • σϓϩΠ͕͘ͳΔͱϩʔϧόοΫ͘ͳΔ͜ͱ͕ଟ͍͠ɺԿΑΓ ػೳͷσϦόϦʔʹ͕͔͔࣌ؒΓɺϦϦʔεϏοάόϯ͡Όͳ͍ͱ
͍ͬͨͳ͍Έ͍ͨʹͳͬͯྑ͘ͳ͍
େମͰಠཱσϓϩΠՄೳͳͷͰ ߋ৽͞ΕͨαʔϏε͚ͩͰϓϩΠͯ͠ ͋ͱσϓϩΠεΩοϓ͢Ε͍͍ͷ Ͱʁ
σϓϩΠεΩοϓઓུ • ECSʹ͏ίϯςφΠϝʔδͷߋ৽ΛɺʮαʔϏε͕ґଘ͢Δ repositoryͷಛఆͷσΟϨΫτϦ͕ߋ৽͞Ε͍ͯͨΒʯʹ͢Δ • ٖࣅతʹpolyrepoతͳcommit hashΛಘͯλάʹ͏ • ຊ൪ڥͱσϓϩΠ༧ఆͷcommit hashؒͰECS
Task Definitionͷࠩ ͕͋ΕσϓϩΠ͢Δ • ecspresso diff ΛͬͯdiffΛ֬ೝ
σϓϩΠͷ༷ࢠ