Kyash TechTalk #2 - Serversideのシステム構成とアーキテクチャ にて発表した資料です。 https://kyash.connpass.com/event/244819/
Kyashでは入出金にまつわる様々な困難なポイントがあり、それをどのようなアプローチで対策したか紹介します。
以下スライド内リンクです
P38: - https://github.com/golang/go/issues/5597
ೖग़ۚυϝΠϯͷۤ࿑ͱɹղܾͷΞϓϩʔνKyash TechTalk #2 ServersideͷγεςϜߏͱΞʔΩςΫνϟ2022-04-18@convto
View Slide
Ԟଜ ༏࠸ (@convto)KyashͰओʹೖग़ۚʹ·ͭΘΔۀΛ୲ͯ͠·ͨ͠ϨΠϠΊͷٕज़҉߸ٕज़ʹڵຯ͋Γ·͢
͡Ίʹ• Kyash͍Ζ͍Ζͳ֎෦ఏܞઌͱଓͯ͠·͢ʂ• ೖۚʹߜͬͯΫϨΧ/ۜߦ/ίϯϏχATM/payeasy/etc…• ໘ന͕ͨ͘͞Μ͋Δ• ఏܞઌͱKyashͰͷ߹ੑͷ୲อͷߟྀͱ͔• ϕϯμ͕ͬͯΔݴޠ/FWʹΑͬͯ҉߸पΓͷॲཧͰGoͱ৯͍߹Θ͕ͤѱ͍έʔε͕͋ͬͨΓͱ͔• ఏܞઌͷ༷ʹΊͪΌΊͪΌڧ੍͍͕͋Δͱ͔
ಥવͰ͕͢͜͜ͰͰ͢
΄͛΄͛ۜߦͱ৽نଓ• ೖۚιʔεͱͯ͠৽͍ۜ͠ߦͱଓ͠·͢• ۜߦͱܖ༷ͯ͠ॻΛΒͬͨΒҎԼͷهࡌ͕• ʮߦͷHTTPϦΫΤετͷಉ࣌ଓ্ݶ1ʯ
΄͛΄͛ۜߦͱ৽نଓ• ೖۚιʔεͱͯ͠৽͍ۜ͠ߦͱଓ͠·͢• ۜߦͱܖ༷ͯ͠ॻΛΒͬͨΒҎԼͷهࡌ͕• ʮߦͷHTTPϦΫΤετͷಉ࣌ଓ্ݶ1ʯγʔέϯγϟϧʹϦΫΤετʁ
΄͛΄͛ۜߦͱ৽نଓ• ೖۚιʔεͱͯ͠৽͍ۜ͠ߦͱଓ͠·͢• ۜߦͱܖ༷ͯ͠ॻΛΒͬͨΒҎԼͷهࡌ͕• ʮߦͷHTTPϦΫΤετͷಉ࣌ଓ্ݶ1ʯૉʹΔͱ෩Ͷͨͱ͖ʹཹ͠ͳ͍͔γʔέϯγϟϧʹϦΫΤετʁ
΄͛΄͛ۜߦͱ৽نଓ• ೖۚιʔεͱͯ͠৽͍ۜ͠ߦͱଓ͠·͢• ۜߦͱܖ༷ͯ͠ॻΛΒͬͨΒҎԼͷهࡌ͕• ʮߦͷHTTPϦΫΤετͷಉ࣌ଓ্ݶ1ʯૉʹΔͱ෩Ͷͨͱ͖ʹཹ͠ͳ͍͔γʔέϯγϟϧʹϦΫΤετʁͲ͏͍͏ΈͰ࣮ݱ͢ΔʁΩϡʔʁlock֫ಘʁPros/Consʁ
͜Μͳͱ͖KyashͳΒͲ͏͢Δʁ
ͱ͍͏ͷ͕ؾʹͳΔํͥͻ࠷ޙ·Ͱฉ͍ͯͶ
ͱ͍͏ͷ͕ؾʹͳΔํͥͻ࠷ޙ·Ͱฉ͍ͯͶͱΓ͋͑ͣ͏͓ʙʙͱͳΔ
Contents1. ֎෦ϕϯμͱͷ߹ੑͷ୲อʹ͍ͭͯ• ߹ੑ͕ζϨΔύλʔϯͷհ• ߹ੑΛ߹ΘͤΔͨΊͷྗ2. ҉߸·ΘΓͷ͋Ε͜Ε• ϨΨγʔͳ҉߸ํ͕ࣜGoͰར༻Ͱ͖ͳ͍߹• ҉߸पΓͷ༷ͰؾΛ͚ͭΔ3. ༷ʹڧ੍͍͕͋Δ߹• ಉ࣌ଓ14.Kyashͷಛҟੑͱ໘ന͞
֎෦ͱͷ߹ੑͷ୲อʹ͍ͭͯ
ͦͦ֎෦ͱͷ߹ੑͬͯζϨΔΜͰ͔͢ʁ• ඇৗʹ೦ͳ͜ͱʹζϨ·͢• ͍͔ͭ͘ζϨΔύλʔϯΛհ͠·͢• ͦͷ্ͰͲͷΑ͏ʹରԠͯ͠Δ͔հ͠·͢
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏Δ
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏Δνϟʔδґཔ
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏ΔνϟʔδґཔνϟʔδֹۚΛϢʔβʔޱ࠲͔Βݮࢉ
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏ΔνϟʔδґཔνϟʔδֹۚΛϢʔβʔޱ࠲͔Βݮࢉ௨ৗϨεϙϯε͕ฦͬͯ͘Δ͕…
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏ΔνϟʔδґཔνϟʔδֹۚΛϢʔβʔޱ࠲͔ΒݮࢉϨεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁ
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏ΔνϟʔδґཔνϟʔδֹۚΛϢʔβʔޱ࠲͔ΒݮࢉͳΜ͔݁Ռؼͬͯ͜ͳ͔ͬͨͳ…ޭͯ͠Δ͔Θ͔ΒΜͷͰ͔ͬͯʹߴ૿ͤͳ͍ͳ...Ϩεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁ
ϕϯμ͕timeout͢Δύλʔϯ• ωοτϫʔΫ͕ෆ҆ఆͩͬͨΓ͢Δͱൃੜ͠͏Δ• Ҿ͖མͱ͞ΕͨͷʹKyashʹνϟʔδ͞Εͯͳ͍Μ͚ͩͲʂ͕͋Γ͑ΔνϟʔδґཔνϟʔδֹۚΛϢʔβʔޱ࠲͔ΒݮࢉϨεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁͳΜ͔݁Ռؼͬͯ͜ͳ͔ͬͨͳ…ޭͯ͠Δ͔Θ͔ΒΜͷͰ͔ͬͯʹߴ૿ͤͳ͍ͳ...
ίϯϙʔωϯτ͕ଟ͍ͱ͞Βʹ͍͜͠• ͨͱ͑ATMͰͷೖۚͩͱϢʔβͷૢ࡞ͱͯ͠ͷATMͱɺ͏ͻͱͭॲཧηϯλΈ͍ͨͳ֓೦͕͋Δ• ͷ͕૿͑Δͱ۠ؒͷ͚ͩյΕͨΒͲ͏ͳΔ͔ߟྀ͕ඞཁ※؆ུԽͨ͠Πϝʔδ
Α͏͜Εͬͯࢄtransaction͡ΌΜ• ͳΔ΄ͲͦΕ͍͠• ͔͠ͱͱผͷαʔϏεͳͷͰࢄΛආ͚Δ͜ͱ͕Ͱ͖ͳ͍• Ͱɺٯʹݴ͏ͱࢄtransactionจ຺ͷΞϓϩʔν͕͑ΔͷͰʁ• ͱ͓͍͕ͬͯͨ࣌΅͘ʹ͋Γ·ͨ͠• 2PCͱ͔جຊతʹϕϯμ͕αϙʔτͯ͠ͳ͍(͍Ζ͍Ζͳߟྀ͕͋Γ2PCࣗମ৻ॏͳݕ౼͕ඞཁ͚ͩͲɺͦͦબࢶʹͳ͍)• sagaύλʔϯΈ͍ͨͳ͋ͬͨΒิঈtransactionͰ݁Ռ߹ΛͱΔΞϓϩʔνɺۜߦ͍͍ͩͨ transactionͷଧফAPI͕ͳ͍ ͷͰબͳ͍
ͲΜͳͱ͖Ͱۚ༥ػؔͷঢ়ଶΛਖ਼ͱͯ͠ѻ͏• ۚ༥ػؔͷAPI߹ੑΛ୲อ͢ΔͨΊͷओಋݖΛͪ͜ΒͰ࣋ͭ͜ͱ͕͍͠(߹͕ଟ͍)• ͞·͟·ͳखஈͰऔҾใΛরձ͠ɺऔಘͰ͖ͨऔҾใʹঢ়ଶΛ߹ΘͤΔ͜ͱͰ݁Ռ߹ੑΛ୲อ
ύλʔϯͦͷ1timeoutͨ͠Βඇಉظʹরձ• timeoutൃੜ࣌ʹඇಉظͰ͢Έ͔ʹऔҾরձΛґཔ͢Δ• ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ·ͬͯͶʂͳͲࡉ͔͍͕݅ҟͳΔνϟʔδґཔtimeoutඇಉظΩϡʔ
ύλʔϯͦͷ1timeoutͨ͠Βඇಉظʹরձ• timeoutൃੜ࣌ʹඇಉظͰ͢Έ͔ʹऔҾরձΛґཔ͢Δ• ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ·ͬͯͶʂͳͲࡉ͔͍͕݅ҟͳΔνϟʔδґཔtimeoutඇಉظΩϡʔরձϝοηʔδΛenqueue
ύλʔϯͦͷ1timeoutͨ͠Βඇಉظʹরձ• timeoutൃੜ࣌ʹඇಉظͰ͢Έ͔ʹऔҾরձΛґཔ͢Δ• ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ·ͬͯͶʂͳͲࡉ͔͍͕݅ҟͳΔνϟʔδґཔtimeoutඇಉظΩϡʔরձϝοηʔδΛenqueuedequeueͯ͠ඇಉظʹরձ
ύλʔϯͦͷ1timeoutͨ͠Βඇಉظʹরձ• timeoutൃੜ࣌ʹඇಉظͰ͢Έ͔ʹऔҾরձΛґཔ͢Δ• ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ·ͬͯͶʂͳͲࡉ͔͍͕݅ҟͳΔνϟʔδґཔtimeoutඇಉظΩϡʔরձϝοηʔδΛenqueueऔҾরձ(ႈੑ͕͋Δ߹࠶νϟʔδ)To be continued …dequeueͯ͠ඇಉظʹরձ
ύλʔϯͦͷ1timeoutͨ͠Βඇಉظʹরձ• timeoutൃੜ࣌ʹඇಉظͰ͢Έ͔ʹऔҾরձΛґཔ͢Δ• ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ·ͬͯͶʂͳͲࡉ͔͍͕݅ҟͳΔ• ͜ͷऔҾরձͰtimeout͢Δ͜ͱ͋Δ• ͳΜͲ͔ϦτϥΠ͢Δ͕ɺۚ༥ػ͕ؔ࣌ؒαʔϏεμϯͳͲͷ߹෮چෆՄνϟʔδґཔtimeoutඇಉظΩϡʔরձϝοηʔδΛenqueueऔҾরձ(ႈੑ͕͋Δ߹࠶νϟʔδ)timeoutdequeueͯ͠ඇಉظʹরձ
ύλʔϯ2ޙ·ͱΊͯಥ߹• औҾࢀরͰղܾ͠ͳ͍ෆ߹͕͋ͬͨͱͯ͠ຖಥ߹ͯ͠ΕݕͰ͖Δ• ͜ͷ͜ͱΛϦίϯαΠϧͱ͍ͬͨΓ͠·͢νϟʔδґཔtimeout
ύλʔϯ2ޙ·ͱΊͯಥ߹• औҾࢀরͰղܾ͠ͳ͍ෆ߹͕͋ͬͨͱͯ͠ຖಥ߹ͯ͠ΕݕͰ͖Δ• ͜ͷ͜ͱΛϦίϯαΠϧͱ͍ͬͨΓ͠·͢νϟʔδґཔtimeoutɾɾɾYYYY/MM/DDͷऔҾશ෦ڭ͑ͯ
ύλʔϯ2ޙ·ͱΊͯಥ߹• औҾࢀরͰղܾ͠ͳ͍ෆ߹͕͋ͬͨͱͯ͠ຖಥ߹ͯ͠ΕݕͰ͖Δ• ͜ͷ͜ͱΛϦίϯαΠϧͱ͍ͬͨΓ͠·͢νϟʔδґཔtimeoutɾɾɾYYYY/MM/DDͷऔҾશ෦ڭ͑ͯ͜ΕͰ
ύλʔϯ2ޙ·ͱΊͯಥ߹• औҾࢀরͰղܾ͠ͳ͍ෆ߹͕͋ͬͨͱͯ͠ຖಥ߹ͯ͠ΕݕͰ͖Δ• ͜ͷ͜ͱΛϦίϯαΠϧͱ͍ͬͨΓ͠·͢νϟʔδґཔtimeoutɾɾɾYYYY/MM/DDͷऔҾશ෦ڭ͑ͯ͜ΕͰ,ZBTI͕Ѳͯ͠ΔऔҾใͱಥ߹Ͱ͖Δ
֎෦ͱͷ߹ੑͷ୲อ·ͱΊ• ߹ੑ͕ζϨΔύλʔϯී௨ʹ͋Δ• ֎෦APIͷ੍্ɺڧ͍Ұ؏ੑΛ୲อ͢Δͷ͍͠• ۚ༥ػؔͷऔҾใΛਖ਼ͱͯ͠ঢ়ଶΛ߹Θͤͯ݁Ռ߹ੑΛอূ͢Δ• ݁Ռෆఆ࣌ʹ͢Έ͔ʹऔҾࢀর• औҾࢀরͰ෮چͰ͖ͳ͚ΕϦίϯαΠϧͰݕ
҉߸ͷ͋Ε͜Ε
લఏ: GoͰجຊతʹ҆શͳ҉߸ͷΈαϙʔτ• GoͷඇৗʹΑ͍ੑ࣭ͱͯ͠ɺ҆શͰͳ͔ͬͨΓRFC্ඇਪͳ҉߸/ϋογϡͷΈ߹Θͤඪ४/४ඪ४ͷػೳͱͯ͠جຊతʹఏڙ͞Ε·ͤΜ• ҉߸ͷઐՈͰͳͯ͘બࢶʹҰఆ҆શͳ҉߸͔͠ͳ͍ͷͰ͋Δఔ҆৺Ͱ͖Δ
ͦ͏͍͏ํ͕Α͘Έ͑Δissuehttps://github.com/golang/go/issues/5597• ECBαϙʔτΛஅ͍ͬͯΔissue• ҙਤతʹআ֎ͯ͠ΔͰɺ҆શ͡Όͳ͍͠ɺඞཁͳΒࣗͰॻ͚ΔΖͱͷճ
ϕϯμ͕GoͰ͑ͳ͍҉߸Λཁٻ͖ͯͨ͠ͱ͖• Γ͕͖͋ͬͯ·ͨ͠Ͷ• ΄΅΄΅ͳ͍͚Ͳɺͨ·ʙʙʙʙʹʹͳΔ• ͜͏͍͏ࣄ͕ى͖Δഎܠ• ͦͦۚ༥ػؔͱ͔ྺ࢙͋ΔαʔϏεͳ߹͕ଟ͍(ੲ҆શͩͬͨܥ)• ϕϯμଆ͕৽ن։ൃͰɺར༻ͯ͠Δݴޠ/FW͕ྺ࢙͕ਂͯ͘ޙํޓ͕खް͍ͷͩͬͨΓ͢Δͱ;ͭ͏ʹબͪΌͬͨΓ͢Δ
• Γ͕͖͋ͬͯ·ͨ͠Ͷ• ΄΅΄΅ͳ͍͚Ͳɺͨ·ʙʙʙʙʹʹͳΔ• ͜͏͍͏ࣄ͕ى͖Δഎܠ• ͦͦۚ༥ػؔͱ͔ྺ࢙͋ΔαʔϏεͳ߹͕ଟ͍(ੲ҆શͩͬͨܥ)• ϕϯμଆ͕৽ن։ൃͰɺར༻ͯ͠Δݴޠ/FW͕ྺ࢙͕ਂͯ͘ޙํޓ͕खް͍ͷͩͬͨΓ͢Δͱ;ͭ͏ʹબͪΌͬͨΓ͢Δϕϯμ͕GoͰ͑ͳ͍҉߸Λཁٻ͖ͯͨ͠ͱ͖
جຊͪΌΜͱճආ͠·͢• ସͷ҉߸͕ఏڙ͞ΕͯͨΒͦͬͪΛબͿʂ(͓͓Αͦෳఏڙͯ͠Δ)• ସͷબࢶͳ͚ΕඇਪͰ͋Διʔε(RFCͱ͔)Λ͑ͯίϛϡχέʔγϣϯ͢Δ• աڈʹGoͰαϙʔτ͞Εͳ͍҉߸ͱϋογϡͷΈ߹Θͤʹ͍ͭͯɺϋογϡΞϧΰϦζϜΛม͑ͯΒͬͨ͜ͱ͋ΔΠϝʔδը૾
͓·͚: PKCS#5 Padding Θ͔ΒΜ͋Δ͋Δ• ϒϩοΫ҉߸(҉߸ར༻ϞʔυʹΑΔ͕)ೖྗͷbyte͕blockͷഒʹͳͬͯΔඞཁ͕͋Γ·͢• ͕͔ͪͬͨΒpaddingऔΔඞཁ͋Δ(ྫ: 8byte block Ͱ 20byte ͷೖྗ͖ͨΒpaddingͭΊͯ 24byte ʹ)• PKCS#5 Padding DESͷͨΊʹఆٛ͞Εͨ 8byte block ͷpadding (rfc1423#section-1.1)• PKCS#7 Padding ͦΕΛ֦ுͯ͠1~255byteͷՄมͳ block size ʹରԠͨ͠ͷ (rfc2315#section-10.3)• ྺ࢙తͳܦҢͰ͍͔ͭ͘ͷݴޠͰ PKCS5Padding() ͷ࣮͕ PKCS#7 Padding ʹͳ͍ͬͯΔΑ͏• PKCS#7 ͕ PKCS#5 ͷ༷Λશʹแͯ͠Δ͔Β͜Μͳ͔Μ͡ʹͳͬͨͷ͔ͳʁ͗͜͢͠Δ• ͦͷӨڹͰ༷ॻͰʮAESͰPKCS#5 Paddingͯ͠ͶʯΈ͍ͨͳཁٻ͕͞ΕΔ͜ͱ͕͋Γ·͢• ҉߸ΞϧΰϦζϜͷϒϩοΫαΠζͳͲ͔Βஅ͠Α͏
༷ʹڧ੍͍͕͋Δ߹
ಉ࣌ଓ1ΛͲ͏࣮ݱ͢Δ͔• ʮ͜ͷ੍͕ଥ͔ʯʹ͍ͭͯ৮Ε·ͤΜɻॆରࡁΈͳલఏ• ͍͔࣮ͭ͘ݱͷͨΊͷҊ͕͋ΓɺϝϦοτσϝϦοτ͕ҟͳΔ• ͦΕͧΕͷҊΛઆ໌͠ɺͲͷΑ͏ͳ͜ͱΛߟ͑ͯબఆ͔ͨ͠հ
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• FIFOΩϡʔΛͬͯಉ࣌ଓ1Λ࣮ݱ͢ΔҊνϟʔδΛλοϓ'*'0ΩϡʔDMJFOU
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• FIFOΩϡʔΛͬͯಉ࣌ଓ1Λ࣮ݱ͢ΔҊνϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔDMJFOU
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• FIFOΩϡʔΛͬͯಉ࣌ଓ1Λ࣮ݱ͢ΔҊνϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔ݁Ռ͍߹ΘͤͷͨΊͷrequest_idΛฦ٫DMJFOU
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• FIFOΩϡʔΛͬͯಉ࣌ଓ1Λ࣮ݱ͢ΔҊνϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔ݁Ռ͍߹ΘͤͷͨΊͷrequest_idΛฦ٫DMJFOUಉ࣌ଓ1Λ·Γͳ͕ΒϦΫΤετ
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• FIFOΩϡʔΛͬͯಉ࣌ଓ1Λ࣮ݱ͢ΔҊνϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔ݁Ռ͍߹ΘͤͷͨΊͷrequest_idΛฦ٫DMJFOUಉ࣌ଓ1Λ·Γͳ͕ΒϦΫΤετޭ or ࣦഊ݁ՌʹԠͯ͡ߴมಈ
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• FIFOΩϡʔΛͬͯಉ࣌ଓ1Λ࣮ݱ͢ΔҊνϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔ݁Ռ͍߹ΘͤͷͨΊͷrequest_idΛฦ٫DMJFOUɾɾɾ݁Ռ͍߹Θͤޭ or ࣦഊಉ࣌ଓ1Λ·Γͳ͕ΒϦΫΤετޭ or ࣦഊ݁ՌʹԠͯ͡ߴมಈ
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• Pros• औҾরձͷΞϓϩʔνʹۙ͘ͳ͡Έ͕͋Δ• ϦΫΤετ͕ཹͯ͠٧·ΔͷΩϡʔͳͷͰserverͷϓϩηε͕ٸ૿͠ͳ͍νϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔ݁Ռ͍߹ΘͤͷͨΊͷrequest_idΛฦ٫DMJFOUɾɾɾ݁Ռ͍߹Θͤޭ or ࣦഊಉ࣌ଓ1Λ·Γͳ͕ΒϦΫΤετޭ or ࣦഊ݁ՌʹԠͯ͡ߴมಈ
Ҋ1:FIFOΩϡʔΛ࣮ͬͯݱ• Cons• ਖ਼ৗܥͷνϟʔδ͕ඇಉظʹͳΔͷෳࡶ• ݱ࣮ʹ͔͜͜Βߋʹtimeoutͷߟྀ͕ඞཁ• timeout༻ͷऔҾরձͷܦ࿏ඇಉظͰ͋ͬͯɺ͚ͩͲͦΕϦΫΤετલʹFIFOΩϡʔʹ٧Ίͳ͍ͱ…ͱͳΔͱൃੜ࣌ʹͲ͜ʹใ͕͋Δ͔͍ͮΒ͍• ো࣌ͷௐࠪӡ༻͕େมͦ͏νϟʔδΛλοϓ'*'0ΩϡʔFIFOΩϡʔʹ٧ΊΔ݁Ռ͍߹ΘͤͷͨΊͷrequest_idΛฦ٫DMJFOUɾɾɾ݁Ռ͍߹Θͤޭ or ࣦഊಉ࣌ଓ1Λ·Γͳ͕ΒϦΫΤετtimeout݁ՌʹԠͯ͡ߴมಈ
Ҋ2:globalͳlockΛ࣮ͬͯݱ• ϦΫΤετલʹglobalͳlockΛͱΔ• ͦ͏͢ΔͱৗʹͩΕ͔ҰਓͷΈۚ༥ػؔϦΫΤετͰ͖ΔνϟʔδґཔDMJFOUMPDL֫ಘMPDL։์ޭ or ࣦഊνϟʔδґཔޭ or ࣦഊ
Ҋ2:globalͳlockΛ࣮ͬͯݱ• Pros• Έ͕γϯϓϧ• ྲྀΕ͕΄΅ଞͷۚ༥ػؔͱಉͳͷͰɺtimeoutͳͲൃੜͯ͠ॲཧ͕͍͍͢νϟʔδґཔDMJFOUMPDL֫ಘMPDL։์ޭ or ࣦഊνϟʔδґཔޭ or ࣦഊ
Ҋ2:globalͳlockΛ࣮ͬͯݱ• Cons• lock֫ಘ·ͪͷϓϩηε͕ཹ͢ΔڪΕ• ཹͨ͠ͱ͖lock֫ಘ͕ฏ͡Όͳ͍ͱӡѱͣͬ͘ͱॲཧ͞Εͳ͍Ϣʔβʔ͕ͰΔ͔ʁνϟʔδґཔDMJFOUMPDL֫ಘMPDL։์ޭ or ࣦഊνϟʔδґཔޭ or ࣦഊ
ҊΛൺֱ͢Δ؍• FIFOΩϡʔҊӡ༻ෛՙ͕ߴ͍• ͦΕʹରͯ͠global lockӡ༻ෛՙ͍• ͍ͬΆ͏Ͱglobal lockΛબ͢ΔͱϦΫΤετཹ࣌ʹlock֫ಘ·ͪϓϩηε͕૿͑ϝϞϦ༻ྔͳͲ͕ٸ૿͢Δ͔• ͱ͍͑ߴཧͱ͍͏ੑ্࣭ɺͰ͖ΕFIFOΩϡʔͰͳ͘ɺlock֫ಘͷҊͰਖ਼ৗܥಉظతͳॲཧʹ͍ͨ͠• global lockͷݒ೦Λ·ͱΊͯɺͦΕΛղܾͰ͖Δ͔ߟ͑ͯΈΔ• (ͳ͓ཧʹAWSͷ୲SAͷํʹ͝ڠྗ͍͖ͯͨͩ͠·ͨ͠ʂ͜ͷͰվΊͯײँΛ)
lockͷݒ೦ͦͷ1: ϨΠςϯγ͕Θ͔Βͳ͍• ։ൃஈ֊Ͱۚ༥ػؔͷҾ͖མͱ࣮͠ߦϨΠςϯγ͕Θ͔Βͳ͍ -> ࣮ࡍʹཹ͕ى͖Δ͔Ѳͮ͠Β͍• ֘ۚ༥ػؔͷνϟʔδ෩ར༻ͳͲ͍Ζ͍ΖؑΈ͓͓ͯΑͦ30req/min ͘Β͍ʹͳΓͦ͏• ϨΠςϯγΘ͔Βͳ͍͕ɺlockͱΔΞϓϩʔνͰ1req 2sec͘Β͍͔͔ͬͯύϯΫ͢Δ͜ͱͳ͍• ௨ৗ΄͔ͷۚ༥ػؔ95ύʔηϯλΠϧͰඦms͔ͩΒɺرత؍ଌͩͱ2~4ഒ͘Β͍ʹάϩʔε͓ͯͦ͠Β͘ͳ͍
lockͷݒ೦ͦͷ2: ϓϩηεͷཹ• ͖ͬ͞ͷࢼࢉͰͬ͘͟Γཹ͠ͳͦ͞͏ͳ͜ͱ͕Θ͔ͬͨ• ͱ͍͑༧ظͤ͵spike͋Γ͏Δɻͦ͏͍͏ͱ͖Ͳ͏͢Δʁ• མͪண͍ͯߟ͑Δͱɺlock֫ಘͪͰҰఆ࣌ؒͨͯΤϥʔΛฦͯ͠Ϣʔβʔʹ࠶ࢼߦΛ͏ͳ͕ͤظؒཹ͠ͳ͍• lock֫ಘͰ͖ͯͳ͍ͷͰۚ༥ػؔʹϦΫΤετͰ͖ͯͳ͍ɻͷͰ҆શʹࣦഊʹͰ͖Δ
Ҋ2:globalͳlockΛ࣮ͬͯݱ• Cons• lock֫ಘ·ͪͷϓϩηε͕ཹ͢ΔڪΕ• ཹͨ͠ͱ͖lock֫ಘ͕ฏ͡Όͳ͍ͱӡѱͣͬ͘ͱॲཧ͞Εͳ͍Ϣʔβʔ͕ͰΔ͔ʁ• -> ͓͓Αͦཹ͠ͳ͍ͩΖ͏ɺ͞Βʹlock֫ಘʹtimeoutΛઃ͚ΕΑΓ҆શʂνϟʔδґཔDMJFOUMPDL֫ಘMPDL։์ޭ or ࣦഊνϟʔδґཔޭ or ࣦഊ
੍͕ڧ͍ͱ͖ͷ·ͱΊ• Ͳ͏੍Λຬ͔ͨ͢ߟ͑Δ• ੍Λຬͨ͢खஈͷͳ͔ͰPros/ConsΛ·ͱΊΔ• Ͳ͏͍͏ॲཧ͕·͍͔͠ɺͦΕΛબͿͨΊʹͲ͏͍͏՝͕͋Δ͔ʹண͠ɺͦΕ͕ղফͰ͖Δ͔ߟ͑ͯΈΔ• ͱ͖ʹ֎෦ͷํͷҙݟฉ͍ͯΈΔͱ৽͍͠؍͕ग़͕ͯٞਐల͢Δ͔
Kyashͷಛҟੑͱ໘ന͞
֎෦ఏܞઌͱͷ࿈ܞ͕ଟͯ͘ߟྀ͕ଟ͍ʂ• ֎෦ϕϯμͱͷࢄtransactionͰ߹ੑ͕ٻΊΒΕΔ• ࢄtransactionࣗମͷ͠͞• Ξϯίϯτϩʔϥϒϧͳ༷• ͲͷΑ͏ͳΞϓϩʔν͕͑Δ͔֎෦ϕϯμʹΑͬͯҟͳΔ• ଟ͘ͷ੍ͱ͖߹͏• ڧ੍͍ͱग़͘Θ͢͜ͱগͳ͘ͳ͍
Ͱ໘ന͍ʂ• ۚ༥ͱ͍͏Β͠ʹ͔ܽͤͳ͍αʔϏεʹܞΘΕΔ• ੍ࠔ͞ʹ͖߹ͬͯղܾࡦΛݟग़͢ͷ໘ന͍• ੍ͷͳ͔ͰͲͷΑ͏ʹཁ݅Λຬ͔ͨ͢• ͦͷͳ͔Ͱ࠷େݶ৴པͰ͖ΔιϑτΣΞ࡞ΔͨΊʹͲ͏͢Δ͔• ͠ΜͲ͍ͱ͖͋Δ͚Ͳɺ͋·ΓܦݧͰ͖ͳ͍ࣄ͕ͨ͘͞ΜͰ͖Δ
ͱ͍͑՝ࢁੵΈͩΑ• ࠷େݶྗ͍ͯ͠Δ͚Ͳɺਖ਼ख͕Γͯͳ͍Ͱ͢• ΠέΠέͰυοΧϯυοΧϯΈ͍ͨͳײ͡Ͱͳ͍Ͱ͢• લड़ͷ௨Γ֎෦͔Βͷ੍͕ଟ͍ͷͰɺͦͷΈ͕͋Δ෦ଟ͍• λΠτͳεέδϡʔϧͰճͨ͠ϓϩδΣΫτͷෛ࠴ճऩͥΜͥΜͰ͖ͯͳ͍• Ϧιʔε͕Γͳͯ͘ࢢͷཁٻʹ͖͑Εͳ͍
ΈΜͳͰKyashΛΑ͍ͨ͘͠• ͖ͳαʔϏεͳͷͰ• ͋ͱ͖ͳϝϯόʔ͕ଟ͍ͷͰ• ࠓ͍ΔϝϯόʔͱؤுΔͷͪΖΜͰ͕͢ɺͬͱଟ͘ͷਓΛר͖ࠐΜͰΓ্͍͛ͨͱߟ͍͑ͯ·͢• KyashΛ͍͍ձࣾɺαʔϏεʹ͢ΔͨΊʹ͕Μ͍ͬͯ·͢ʂ• ҰॹʹΓ্͍͛ͨʂͱ͍͏ํ͍ͨΒͥͻ͓͠·͠ΐ͏ʙ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ