at 2021.10.10. Kaigi on Rails _2021_ new
DJSDVJU_TXJUDI ͍ͪ࢝͘͞ΊΔHFNͮ͘Γ2021.10.10.Kaigi on Rails _2021_ new@makicamel
View Slide
w!NBLJDBNFMݪສقw3VCZͱϏʔϧɹɹͱ͓ञ͕͖w͖ͳ73ήʔϜࣗݾհ
࠷ۙࠔ͍ͬͯΔ͜ͱ͓ࣄͰ
ো͕ଟ͍
•ӨڹൣғௐࠪΛ͕ΜΖ͏•ϨϏϡʔΛ͕ΜΖ͏•ࣗಈςετͷՃɾϝϯςΛ͕ΜΖ͏•खಈςετΛ͕ΜΖ͏•ΤϥʔࢹΛ͕ΜΖ͏োΛىͨ͜͠ਓྨͷߟ͕͑ͪͳ͜ͱͬͱͬͱͬͱͬͱͬͱ
͕ΜΓͨ͘ͳ͍
•͕ΜΔͱϛεΔ•͕ΜΓݸਓʹґଘ•͕ΜΔͱർΕΔ•͕ΜΔӬԕʹܧଓͰ͖ͳ͍͕ΜΓͨ͘ͳ͍
ΈͰͳΜͱ͔͍ͨ͠
ɹো͕ଟ͍ΜͰ͢Α…😣ɹ90% ϛε͕ͳ͍͜ͱͷอূͦͦ͜͜Ͱ͖Δ͚Ͳ ɹ100% ϛε͕ͳ͍͜ͱͷอূͱͯߴίετɹϦϦʔεසΛ্͛Δͷ͕ͯ͘͠…😭ɹ͙͢ʹΓͤΔΑ͏ʹͨ͠ํ͕ ɹ݈શ͔͠Ε·ͤΜͶ
•ϦϦʔεिʹ 1 ճ˞ ˞োରԠΛআ͘
•ϦϦʔεिʹ 1 ճ•100ʙ200 Pull Requests•500ʙ1,000 commits•10Kʙ60K lines˞ϏοάόϯϦϦʔε ˞Ұ൪ݹ͘ػೳ͕ଟ͍ϞϊϦγοΫϦϙδτϦʹ͓͚Δɻଟ͘ͷଞϦϙδτϦͬͱԺ͔Ͱ͢ ˞োରԠΛআ͘˞
ϦϦʔείετ͕ߴͯ͘ো͕ଟ͘ɾେ͖͘ͳΓ͕ͪো͕ଟͯ͘ϦϦʔεසΛ্͛ΒΕͳ͍ϏοάόϯϦϦʔε
ͱ͍͏Θ͚Ͱ
ͭͬͨ͘[email protected] [email protected]
circuit_switch
circuit_switchΓ͍ͨ͜ͱɿϦϦʔεසΛ͋͛Δ ˞ϦϦʔεස͍͋͛ͨͰ͢
circuit_switchΓ͍ͨ͜ͱɿίετʹΓ͢
circuit_switchif CircuitSwitch.open?(close_if_reach_limit: false)do_something_experimentalelsecall_existing_codesend CircuitSwitch.report(if: unexpected_happen)
circuit_switchif CircuitSwitch.open?(close_if_reach_limit: false)do_something_experimentalelsecall_existing_codesend
circuit_switch•CircuitSwitch ͕։͍͍ͯΔ࣌ do_something_experimental ΛݺͿ•CircuitSwitch ͕ด͡ΒΕͨ࣌ call_existing_codes ΛݺͿif CircuitSwitch.open?(close_if_reach_limit: false)do_something_experimentalelsecall_existing_codesend
circuit_switch•CircuitSwitch ͷ։ด݅نఆ্ݶճʹ౸ୡ։์݅ͱҰகด݅ͱҰகৗ࣮࣌ߦʴڧ੍ด
circuit_switch•CircuitSwitch ͷ։ด݅if CircuitSwitch.open?(reach_limit: 100)do_something_experimentalelsecall_existing_codesendنఆ্ݶճʹ౸ୡ։์݅ͱҰகด݅ͱҰகৗ࣮࣌ߦʴڧ੍ด
circuit_switchif CircuitSwitch.open?(if: current_user.testing?)do_something_experimentalelsecall_existing_codesend•CircuitSwitch ͷ։ด݅نఆ্ݶճʹ౸ୡ։์݅ͱҰகด݅ͱҰகৗ࣮࣌ߦʴڧ੍ด
circuit_switchif CircuitSwitch.open?(close_if: Date.today > some_period)do_something_experimentalelsecall_existing_codesend•CircuitSwitch ͷ։ด݅نఆ্ݶճʹ౸ୡ։์݅ͱҰகด݅ͱҰகৗ࣮࣌ߦʴڧ੍ด
circuit_switchrake circuit_switch:terminate_to_run [/app/services/greetings_service:21 block in validate]•CircuitSwitch ͷ։ด݅if CircuitSwitch.open?(close_if_reach_limit: false)do_something_experimentalelsecall_existing_codesendنఆ্ݶճʹ౸ୡ։์݅ͱҰகด݅ͱҰகৗ࣮࣌ߦʴڧ੍ด
circuit_switch CircuitSwitch.report(if: unexpected_happen)•CircuitSwitch ͕։͍͍ͯΔ࣌ report ΛૹΔ•Slack Bugsnag ͳͲҙͷϨϙʔτπʔϧΛࢦఆ•։ด݅ open? ͱྨࣅͷ݅Λࢦఆ
circuit_switch•ґଘϥΠϒϥϦ•ActiveRecord•࣮ߦߦʢcallerʣɾCircuitSwitch ͷ։ดঢ়ଶΛ DB ʹอଘ•ActiveJob•DB ߋ৽ɾϨϙʔτ
circuit_switch•ίʔυϦʔμʔͷΈͲ͜Ζ
circuit_switch•ίʔυϦʔμʔͷΈͲ͜Ζ•ͳ͍
circuit_switch•ίʔυϦʔμʔͷΈͲ͜Ζ•ͳ͍•ͳ͍ͷ͕ΈͲ͜Ζʢʁʣ
ΈͲ͜Ζ•ԿมΘͬͨ͜ͱΛ͍ͬͯͳ͍•Rails ͷίʔυ͕ॻ͚ͨΒॻ͚Δ•ࠓ͙͢ॻ͖࢝ΊΒΕΔ
ΈͲ͜Ζ•;ͭ͏ͷ Rails ΞϓϦ͕ґଘ͍ͯ͠ΔϥΠϒϥϦʹґଘ•ࠓ͙͢ಋೖͰ͖Δ
ͱ͜ΖͰ͓ؾ͖͔ͮͱࢥ͍·͕͢
Inspired by•Feature Toggles•CircuitBreaker'FBUVSF5PHHMFTNBSUJOGPXMFSDPN IUUQTNBSUJOGPXMFSDPNBSUJDMFTGFBUVSFUPHHMFTIUNM$JSDVJU#SFBLFSNBSUJOGPXMFSDPN IUUQTNBSUJOGPXMFSDPNCMJLJ$JSDVJU#SFBLFSIUNM
Feature Toggles•৽ػೳΛಛఆϢʔβʹ҆શɾ͔ʹఏڙ͢ΔͨΊͷΈ•ؔ࿈ɿDark Launch•🙅 େن feature ϒϥϯν্Ͱͷ։ൃ 🙆 master(main) ϒϥϯνʹ߹ྲྀͨ͠։ൃ'FBUVSF5PHHMFTNBSUJOGPXMFSDPN IUUQTNBSUJOGPXMFSDPNBSUJDMFTGFBUVSFUPHHMFTIUNM
Feature Toggles•ΧφϦΞϦϦʔε•ϥϯμϜબग़ͷۃҰ෦ͷҰൠϢʔβʹػೳ։์༷ͯ͠ࢠݟ•A / B ςετ'FBUVSF5PHHMFTNBSUJOGPXMFSDPN IUUQTNBSUJOGPXMFSDPNBSUJDMFTGFBUVSFUPHHMFTIUNM
CircuitBreaker•αʔόʹಛఆճҎ্ͷো͕ൃੜͨ࣌͠ʹ ϦΫΤετΛड͚͚ͣʹΤϥʔΛฦ͢Έ•োͷ࿈తͳൃੜΛ͙•αʔό͕վળͨ͠ΒࣗಈͰ෮ؼ͢Δ$JSDVJU#SFBLFSNBSUJOGPXMFSDPN IUUQTNBSUJOGPXMFSDPNCMJLJ$JSDVJU#SFBLFSIUNM
Inspired by … ?
Inspired by … ?•ΠϯεύΠΞ͞Εͨͱ͍͏ʹΈ͕͠ΐ΅͍•τάϧͷཧʹ͕͋Δ•ϒϨʔΧʔΛམͱ͕݅ͨͩ͢ͷճ•ࣗಈ෮ؼ͠ͳ͍•DB ΞΫηεΛ͢ΔͷͰΦʔόʔϔου͕ੜ͡Δ
Ұूத•΄͍͠ͷʮίετʹΓͤΔʯΈ•ͱʹ͔͘ࠓ΄͍͠ ػೳ͚ͩΛ࣮ͯ͠ϦϦʔε
ॠൃྗ•ͱΓ͋͑ͣ΄͔ͬͨ͠•ϨϏϡʔɾௐࠪɾςετίετ͕૿େ͍ͯ͠Δঢ়گΛվળ͍ͨ͠•ݱͷࠓ͋Δ՝Λࠓ͙͢ղܾ͍ͨ͠•Γͳ͍ࣝɾٕज़ͨ͘͞Μ͋Δ•४උ͕Ͱ͖Δ·Ͱͭͱ͋ͬͱ͍͏ؒʹ݄͕ա͗Δ
ॠൃྗ•MVP•Minimum Viable Product•࣮༻࠷খݶͷ•ఏڙ͠ͳ͕Β։ൃ͢Δ
Βͳ͍ཧ༝•ͦ͏͔͠Εͳ͍•ͦ͏Ͱͳ͍͔͠Εͳ͍•OSS ʹ͓͚ͯ͠୭͔ͷʹཱ͔ͭ͠Εͳ͍•OSS ʹ͠ͳ͍ཧ༝ͳ͍ɹgem ʹ͠ͳ͍͍ͯ͘Μ͡Όͳ͍ʁ
՝ʹΞϓϩʔν͢Δ•ίʔυͷ͠͞ͱϥΠϒϥϦͷՁؔͳ͍ɹ͜Μͳ͠ΐ΅͍ίʔυΛੈʹग़͢ͳΜͯ…
·͍ͣͪ࢝͘͞ΊΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠