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

入出金ドメインの苦労話と解決へのアプローチ/funds in/out difficulties and solutions

66487f93d23ed4f64752cffbafdb938a?s=47 convto
April 18, 2022

入出金ドメインの苦労話と解決へのアプローチ/funds in/out difficulties and solutions

Kyash TechTalk #2 - Serversideのシステム構成とアーキテクチャ にて発表した資料です。
https://kyash.connpass.com/event/244819/

Kyashでは入出金にまつわる様々な困難なポイントがあり、それをどのようなアプローチで対策したか紹介します。

以下スライド内リンクです

P38:
- https://github.com/golang/go/issues/5597

66487f93d23ed4f64752cffbafdb938a?s=128

convto

April 18, 2022
Tweet

More Decks by convto

Other Decks in Technology

Transcript

  1. ೖग़ۚυϝΠϯͷۤ࿑࿩ͱɹ ղܾ΁ͷΞϓϩʔν Kyash TechTalk #2 ServersideͷγεςϜߏ੒ͱΞʔΩςΫνϟ 2022-04-18 @convto

  2. Ԟଜ ༏࠸ (@convto) KyashͰ͸ओʹೖग़ۚʹ·ͭΘΔۀ ຿Λ୲౰ͯ͠·ͨ͠ ϨΠϠ௿Ίͷٕज़΍҉߸ٕज़ʹڵຯ ͋Γ·͢

  3. ͸͡Ίʹ • Kyash͸͍Ζ͍Ζͳ֎෦ఏܞઌͱ઀ଓͯ͠·͢ʂ • ೖۚʹߜͬͯ΋ΫϨΧ/ۜߦ/ίϯϏχATM/payeasy/etc… • ໘ന࿩͕ͨ͘͞Μ͋Δ • ఏܞઌͱKyashͰͷ੔߹ੑͷ୲อͷߟྀͱ͔ •

    ϕϯμ͕࢖ͬͯΔݴޠ/FWʹΑͬͯ͸҉߸पΓͷॲཧͰGoͱ৯͍߹Θ͕ͤѱ͍ έʔε͕͋ͬͨΓͱ͔ • ఏܞઌͷ࢓༷ʹΊͪΌΊͪΌڧ੍͍໿͕͋Δͱ͔
  4. ͸͡Ίʹ • Kyash͸͍Ζ͍Ζͳ֎෦ఏܞઌͱ઀ଓͯ͠·͢ʂ • ೖۚʹߜͬͯ΋ΫϨΧ/ۜߦ/ίϯϏχATM/payeasy/etc… • ໘ന࿩͕ͨ͘͞Μ͋Δ • ఏܞઌͱKyashͰͷ੔߹ੑͷ୲อͷߟྀͱ͔ •

    ϕϯμ͕࢖ͬͯΔݴޠ/FWʹΑͬͯ͸҉߸पΓͷॲཧͰGoͱ৯͍߹Θ͕ͤѱ͍ έʔε͕͋ͬͨΓͱ͔ • ఏܞઌͷ࢓༷ʹΊͪΌΊͪΌڧ੍͍໿͕͋Δͱ͔
  5. ಥવͰ͕͢͜͜Ͱ໰୊Ͱ͢

  6. ΄͛΄͛ۜߦͱ ৽ن઀ଓ • ೖۚιʔεͱͯ͠৽͍ۜ͠ߦ ͱ઀ଓ͠·͢ • ۜߦͱܖ໿ͯ͠࢓༷ॻΛ΋Β ͬͨΒҎԼͷهࡌ͕ • ʮ౰ߦ΁ͷHTTPϦΫΤετͷ

    ಉ࣌઀ଓ਺্ݶ͸1ʯ
  7. ΄͛΄͛ۜߦͱ ৽ن઀ଓ • ೖۚιʔεͱͯ͠৽͍ۜ͠ߦ ͱ઀ଓ͠·͢ • ۜߦͱܖ໿ͯ͠࢓༷ॻΛ΋Β ͬͨΒҎԼͷهࡌ͕ • ʮ౰ߦ΁ͷHTTPϦΫΤετͷ

    ಉ࣌઀ଓ਺্ݶ͸1ʯ γʔέϯγϟϧʹϦΫΤετʁ
  8. ΄͛΄͛ۜߦͱ ৽ن઀ଓ • ೖۚιʔεͱͯ͠৽͍ۜ͠ߦ ͱ઀ଓ͠·͢ • ۜߦͱܖ໿ͯ͠࢓༷ॻΛ΋Β ͬͨΒҎԼͷهࡌ͕ • ʮ౰ߦ΁ͷHTTPϦΫΤετͷ

    ಉ࣌઀ଓ਺্ݶ͸1ʯ ૉ๿ʹ΍Δͱ෩଎௓Ͷͨ ͱ͖ʹ଺ཹ͠ͳ͍͔ γʔέϯγϟϧʹϦΫΤετʁ
  9. ΄͛΄͛ۜߦͱ ৽ن઀ଓ • ೖۚιʔεͱͯ͠৽͍ۜ͠ߦ ͱ઀ଓ͠·͢ • ۜߦͱܖ໿ͯ͠࢓༷ॻΛ΋Β ͬͨΒҎԼͷهࡌ͕ • ʮ౰ߦ΁ͷHTTPϦΫΤετͷ

    ಉ࣌઀ଓ਺্ݶ͸1ʯ ૉ๿ʹ΍Δͱ෩଎௓Ͷͨ ͱ͖ʹ଺ཹ͠ͳ͍͔ γʔέϯγϟϧʹϦΫΤετʁ Ͳ͏͍͏࢓૊ΈͰ࣮ݱ͢Δʁ Ωϡʔʁlock֫ಘʁPros/Cons͸ʁ
  10. ͜Μͳͱ͖KyashͳΒͲ͏͢Δʁ

  11. ͱ͍͏ͷ͕ؾʹͳΔํ͸ ͥͻ࠷ޙ·Ͱฉ͍ͯͶ

  12. ͱ͍͏ͷ͕ؾʹͳΔํ͸ ͥͻ࠷ޙ·Ͱฉ͍ͯͶ ͱΓ͋͑ͣ͏͓ʙʙͱ͸ͳΔ

  13. Contents 1. ֎෦ϕϯμͱͷ੔߹ੑͷ୲อʹ͍ͭͯ • ੔߹ੑ͕ζϨΔύλʔϯͷ঺հ • ੔߹ੑΛ߹ΘͤΔͨΊͷ౒ྗ 2. ҉߸·ΘΓͷ͋Ε͜Ε •

    ϨΨγʔͳ҉߸ํ͕ࣜGoͰར༻Ͱ͖ͳ͍৔߹ • ҉߸पΓͷ࢓༷ͰؾΛ͚ͭΔ఺ 3. ࢓༷ʹڧ੍͍໿͕͋Δ৔߹ • ಉ࣌઀ଓ਺1 4.Kyashͷಛҟੑͱ໘ന͞
  14. ֎෦ͱͷ੔߹ੑͷ୲อʹ͍ͭͯ

  15. ͦ΋ͦ΋֎෦ͱͷ੔߹ੑͬͯζϨΔΜͰ͔͢ʁ • ඇৗʹ࢒೦ͳ͜ͱʹζϨ·͢ • ͍͔ͭ͘ζϨΔύλʔϯΛ঺հ͠·͢ • ͦͷ্ͰͲͷΑ͏ʹରԠͯ͠Δ͔঺հ͠·͢

  16. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ

  17. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ νϟʔδґཔ

  18. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ νϟʔδґཔ νϟʔδֹۚΛ Ϣʔβʔޱ࠲͔Βݮࢉ

  19. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ νϟʔδґཔ νϟʔδֹۚΛ Ϣʔβʔޱ࠲͔Βݮࢉ ௨ৗ͸Ϩεϙϯε͕ฦͬͯ͘Δ͕…

  20. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ νϟʔδґཔ νϟʔδֹۚΛ Ϣʔβʔޱ࠲͔Βݮࢉ Ϩεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁ

  21. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ νϟʔδґཔ νϟʔδֹۚΛ Ϣʔβʔޱ࠲͔Βݮࢉ ͳΜ͔݁Ռؼͬͯ͜ͳ͔ͬͨͳ… ੒ޭͯ͠Δ͔Θ͔ΒΜͷͰ

    ͔ͬͯʹ࢒ߴ૿΍ͤͳ͍ͳ... Ϩεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁ
  22. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ • Ҿ͖མͱ͞ΕͨͷʹKyash ʹνϟʔδ͞Εͯͳ͍Μ ͚ͩͲʂ͕͋Γ͑Δ νϟʔδґཔ

    νϟʔδֹۚΛ Ϣʔβʔޱ࠲͔Βݮࢉ Ϩεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁ ͳΜ͔݁Ռؼͬͯ͜ͳ͔ͬͨͳ… ੒ޭͯ͠Δ͔Θ͔ΒΜͷͰ ͔ͬͯʹ࢒ߴ૿΍ͤͳ͍ͳ...
  23. ίϯϙʔωϯτ ͕ଟ͍ͱ͞Βʹ ΍΍͍͜͠ • ͨͱ͑͹ATMͰͷೖۚͩͱϢʔ βͷૢ࡞୺຤ͱͯ͠ͷATMͱɺ ΋͏ͻͱͭॲཧηϯλΈ͍ͨͳ ֓೦͕͋Δ • ΋ͷ͕૿͑Δͱ۠ؒͷ਺͚ͩյ

    ΕͨΒͲ͏ͳΔ͔ߟྀ͕ඞཁ ※؆ུԽͨ͠Πϝʔδ
  24. Α͏͸͜Εͬͯ෼ࢄtransaction͡ΌΜ • ͳΔ΄ͲͦΕ͸೉͍͠ • ͔͠΋΋ͱ΋ͱผͷαʔϏεͳͷͰ෼ࢄΛආ͚Δ͜ͱ͕Ͱ͖ͳ͍ • Ͱ΋ɺٯʹݴ͏ͱ෼ࢄtransactionจ຺ͷΞϓϩʔν͕࢖͑ΔͷͰ͸ʁ • ͱ͓΋͍ͬͯͨ࣌୅͕΅͘ʹ΋͋Γ·ͨ͠ •

    2PCͱ͔͸جຊతʹϕϯμ͕αϙʔτͯ͠ͳ͍(͍Ζ͍Ζͳߟྀ͕͋Γ2PCࣗମ৻ॏͳݕ౼ ͕ඞཁ͚ͩͲɺͦ΋ͦ΋બ୒ࢶʹͳ͍) • sagaύλʔϯΈ͍ͨͳ໰୊͋ͬͨΒิঈtransactionͰ݁Ռ੔߹ΛͱΔΞϓϩʔν΋ɺۜߦ ͸͍͍ͩͨ transactionͷଧফAPI͕ͳ͍ ͷͰબ΂ͳ͍
  25. ͲΜͳͱ͖Ͱ΋ۚ༥ػؔͷঢ়ଶΛਖ਼ͱͯ͠ѻ͏ • ۚ༥ػؔͷAPI͸੔߹ੑΛ୲อ͢ΔͨΊͷओಋݖΛͪ͜ΒͰ࣋ͭ͜ͱ ͕೉͍͠(৔߹͕ଟ͍) • ͞·͟·ͳखஈͰऔҾ৘ใΛরձ͠ɺऔಘͰ͖ͨऔҾ৘ใʹঢ়ଶΛ߹ ΘͤΔ͜ͱͰ݁Ռ੔߹ੑΛ୲อ

  26. ύλʔϯͦͷ1 timeoutͨ͠Β ඇಉظʹরձ • timeoutൃੜ࣌ʹඇಉظͰ͢Έ΍͔ʹऔ ҾরձΛґཔ͢Δ • ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ· ͬͯͶʂͳͲࡉ͔͍৚͕݅ҟͳΔ νϟʔδґཔ

    timeout ඇಉظΩϡʔ
  27. ύλʔϯͦͷ1 timeoutͨ͠Β ඇಉظʹরձ • timeoutൃੜ࣌ʹඇಉظͰ͢Έ΍͔ʹऔ ҾরձΛґཔ͢Δ • ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ· ͬͯͶʂͳͲࡉ͔͍৚͕݅ҟͳΔ νϟʔδґཔ

    timeout ඇಉظΩϡʔ রձϝοηʔδΛenqueue
  28. ύλʔϯͦͷ1 timeoutͨ͠Β ඇಉظʹরձ • timeoutൃੜ࣌ʹඇಉظͰ͢Έ΍͔ʹऔ ҾরձΛґཔ͢Δ • ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ· ͬͯͶʂͳͲࡉ͔͍৚͕݅ҟͳΔ νϟʔδґཔ

    timeout ඇಉظΩϡʔ রձϝοηʔδΛenqueue dequeueͯ͠ඇಉظʹরձ
  29. ύλʔϯͦͷ1 timeoutͨ͠Β ඇಉظʹরձ • timeoutൃੜ࣌ʹඇಉظͰ͢Έ΍͔ʹऔ ҾরձΛґཔ͢Δ • ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ· ͬͯͶʂͳͲࡉ͔͍৚͕݅ҟͳΔ νϟʔδґཔ

    timeout ඇಉظΩϡʔ রձϝοηʔδΛenqueue औҾরձ (ႈ౳ੑ͕͋Δ৔߹͸࠶νϟʔδ) To be continued … dequeueͯ͠ඇಉظʹরձ
  30. ύλʔϯͦͷ1 timeoutͨ͠Β ඇಉظʹরձ • timeoutൃੜ࣌ʹඇಉظͰ͢Έ΍͔ʹऔҾ রձΛґཔ͢Δ • ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ·ͬ ͯͶʂͳͲࡉ͔͍৚͕݅ҟͳΔ •

    ͜ͷऔҾরձͰtimeout͢Δ͜ͱ΋͋Δ • ͳΜͲ͔ϦτϥΠ͢Δ͕ɺۚ༥ػ͕ؔ௕࣌ ؒαʔϏεμ΢ϯͳͲͷ৔߹͸෮چෆՄ νϟʔδґཔ timeout ඇಉظΩϡʔ রձϝοηʔδΛenqueue औҾরձ (ႈ౳ੑ͕͋Δ৔߹͸࠶νϟʔδ) timeout dequeueͯ͠ඇಉظʹরձ
  31. ύλʔϯ2 ޙ೔·ͱΊͯ ಥ߹ • औҾࢀরͰղܾ͠ͳ͍ෆ ੔߹͕͋ͬͨͱͯ͠΋ຖ೔ ಥ߹ͯ͠Ε͹ݕ஌Ͱ͖Δ • ͜ͷ͜ͱΛϦίϯαΠϧͱ ͍ͬͨΓ͠·͢

    νϟʔδґཔ timeout
  32. ύλʔϯ2 ޙ೔·ͱΊͯ ಥ߹ • औҾࢀরͰղܾ͠ͳ͍ෆ ੔߹͕͋ͬͨͱͯ͠΋ຖ೔ ಥ߹ͯ͠Ε͹ݕ஌Ͱ͖Δ • ͜ͷ͜ͱΛϦίϯαΠϧͱ ͍ͬͨΓ͠·͢

    νϟʔδґཔ timeout ɾɾɾ YYYY/MM/DDͷऔҾશ෦ڭ͑ͯ
  33. ύλʔϯ2 ޙ೔·ͱΊͯ ಥ߹ • औҾࢀরͰղܾ͠ͳ͍ෆ ੔߹͕͋ͬͨͱͯ͠΋ຖ೔ ಥ߹ͯ͠Ε͹ݕ஌Ͱ͖Δ • ͜ͷ͜ͱΛϦίϯαΠϧͱ ͍ͬͨΓ͠·͢

    νϟʔδґཔ timeout ɾɾɾ YYYY/MM/DDͷऔҾશ෦ڭ͑ͯ ͜Ε΍Ͱ
  34. ύλʔϯ2 ޙ೔·ͱΊͯ ಥ߹ • औҾࢀরͰղܾ͠ͳ͍ෆ ੔߹͕͋ͬͨͱͯ͠΋ຖ೔ ಥ߹ͯ͠Ε͹ݕ஌Ͱ͖Δ • ͜ͷ͜ͱΛϦίϯαΠϧͱ ͍ͬͨΓ͠·͢

    νϟʔδґཔ timeout ɾɾɾ YYYY/MM/DDͷऔҾશ෦ڭ͑ͯ ͜Ε΍Ͱ ,ZBTI͕೺Ѳͯ͠ΔऔҾ ৘ใͱಥ߹Ͱ͖Δ
  35. ֎෦ͱͷ੔߹ੑͷ୲อ·ͱΊ • ੔߹ੑ͕ζϨΔύλʔϯ͸ී௨ʹ͋Δ • ֎෦APIͷ੍໿্ɺڧ͍Ұ؏ੑΛ୲อ͢Δͷ͸೉͍͠ • ۚ༥ػؔͷऔҾ৘ใΛਖ਼ͱͯ͠ঢ়ଶΛ߹Θͤͯ݁Ռ੔߹ੑΛอূ͢Δ • ݁Ռෆఆ࣌ʹ͢Έ΍͔ʹऔҾࢀর •

    औҾࢀরͰ෮چͰ͖ͳ͚Ε͹ϦίϯαΠϧͰݕ஌
  36. ҉߸ͷ͋Ε͜Ε

  37. લఏ: GoͰ͸جຊతʹ҆શͳ҉߸ͷΈαϙʔτ • GoͷඇৗʹΑ͍ੑ࣭ͱͯ͠ɺ҆શͰͳ͔ͬͨΓRFC্ඇਪ঑ͳ҉߸/ ϋογϡͷ૊Έ߹Θͤ͸ඪ४/४ඪ४ͷػೳͱͯ͠جຊతʹఏڙ͞Ε ·ͤΜ • ҉߸ͷઐ໳ՈͰͳͯ͘΋બ୒ࢶʹ͸Ұఆ҆શͳ҉߸͔͠ͳ͍ͷͰ͋Δ ఔ౓҆৺Ͱ͖Δ

  38. ͦ͏͍͏ํ਑͕ Α͘Έ͑Δissue https://github.com/golang/go/issues/5597 • ECBαϙʔτΛஅ͍ͬͯΔ issue • ҙਤతʹআ֎ͯ͠ΔͰɺ҆ શ͡Όͳ͍͠ɺඞཁͳΒࣗ ෼Ͱॻ͚Δ΍Ζͱͷճ౴

  39. ϕϯμ͕GoͰ࢖͑ͳ͍҉߸Λཁٻ͖ͯͨ͠ͱ͖ • ੝Γ͕͖͋ͬͯ·ͨ͠Ͷ • ΄΅΄΅ͳ͍͚Ͳɺͨ·ʙʙʙʙʹ໰୊ʹͳΔ • ͜͏͍͏ࣄ͕ى͖Δഎܠ • ͦ΋ͦ΋ۚ༥ػؔͱ͔͸ྺ࢙͋ΔαʔϏεͳ৔߹͕ଟ͍(ੲ͸҆શͩͬͨ ܥ)

    • ϕϯμଆ͕৽ن։ൃͰ΋ɺར༻ͯ͠Δݴޠ/FW͕ྺ࢙͕ਂͯ͘ޙํޓ׵͕ खް͍΋ͷͩͬͨΓ͢Δͱ;ͭ͏ʹબ΂ͪΌͬͨΓ͢Δ
  40. • ੝Γ͕͖͋ͬͯ·ͨ͠Ͷ • ΄΅΄΅ͳ͍͚Ͳɺͨ·ʙʙʙʙʹ໰୊ʹͳΔ • ͜͏͍͏ࣄ͕ى͖Δഎܠ • ͦ΋ͦ΋ۚ༥ػؔͱ͔͸ྺ࢙͋ΔαʔϏεͳ৔߹͕ଟ͍(ੲ͸҆શͩͬͨ ܥ) •

    ϕϯμଆ͕৽ن։ൃͰ΋ɺར༻ͯ͠Δݴޠ/FW͕ྺ࢙͕ਂͯ͘ޙํޓ׵͕ खް͍΋ͷͩͬͨΓ͢Δͱ;ͭ͏ʹબ΂ͪΌͬͨΓ͢Δ ϕϯμ͕GoͰ࢖͑ͳ͍҉߸Λཁٻ͖ͯͨ͠ͱ͖
  41. جຊ͸ͪΌΜͱ ճආ͠·͢ • ୅ସͷ҉߸͕ఏڙ͞ΕͯͨΒͦͬͪΛબ Ϳʂ(͓͓Αͦෳ਺ఏڙͯ͠Δ) • ୅ସͷબ୒ࢶ΋ͳ͚Ε͹ඇਪ঑Ͱ͋Δι ʔε(RFCͱ͔)Λ఻͑ͯίϛϡχέʔγϣ ϯ͢Δ •

    աڈʹGoͰαϙʔτ͞Εͳ͍҉߸ͱϋο γϡͷ૊Έ߹Θͤʹ͍ͭͯɺϋογϡΞ ϧΰϦζϜΛม͑ͯ΋Βͬͨ͜ͱ΋͋Δ Πϝʔδը૾
  42. ͓·͚: 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ͯ͠ͶʯΈ͍ͨͳཁٻ͕͞ΕΔ͜ͱ͕͋Γ·͢ • ҉߸ΞϧΰϦζϜͷϒϩοΫαΠζͳͲ͔Β൑அ͠Α͏
  43. ࢓༷ʹڧ੍͍໿͕͋Δ৔߹

  44. ΄͛΄͛ۜߦͱ ৽ن઀ଓ • ೖۚιʔεͱͯ͠৽͍ۜ͠ߦ ͱ઀ଓ͠·͢ • ۜߦͱܖ໿ͯ͠࢓༷ॻΛ΋Β ͬͨΒҎԼͷهࡌ͕ • ʮ౰ߦ΁ͷHTTPϦΫΤετͷ

    ಉ࣌઀ଓ਺্ݶ͸1ʯ
  45. ಉ࣌઀ଓ਺1ΛͲ͏࣮ݱ͢Δ͔ • ʮ͜ͷ੍໿͕ଥ౰͔ʯʹ͍ͭͯ͸৮Ε·ͤΜɻॆ෼ର࿩ࡁΈͳલఏ • ͍͔࣮ͭ͘ݱͷͨΊͷҊ͕͋ΓɺϝϦοτσϝϦοτ͕ҟͳΔ • ͦΕͧΕͷҊΛઆ໌͠ɺͲͷΑ͏ͳ͜ͱΛߟ͑ͯબఆ͔ͨ͠঺հ

  46. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ DMJFOU

  47. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ DMJFOU

  48. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ

    request_idΛฦ٫ DMJFOU
  49. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ

    request_idΛฦ٫ DMJFOU ಉ࣌઀ଓ1Λ·΋Γͳ͕Β ϦΫΤετ
  50. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ

    request_idΛฦ٫ DMJFOU ಉ࣌઀ଓ1Λ·΋Γͳ͕Β ϦΫΤετ ੒ޭ or ࣦഊ ݁ՌʹԠͯ͡ ࢒ߴมಈ
  51. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ

    request_idΛฦ٫ DMJFOU ɾɾɾ ݁Ռ໰͍߹Θͤ ੒ޭ or ࣦഊ ಉ࣌઀ଓ1Λ·΋Γͳ͕Β ϦΫΤετ ੒ޭ or ࣦഊ ݁ՌʹԠͯ͡ ࢒ߴมಈ
  52. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • Pros • औҾরձͷΞϓϩʔνʹۙ ͘ͳ͡Έ͕͋Δ • ϦΫΤετ͕଺ཹͯ͠΋٧

    ·Δͷ͸ΩϡʔͳͷͰserver ͷϓϩηε͕ٸ૿͠ͳ͍ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ request_idΛฦ٫ DMJFOU ɾɾɾ ݁Ռ໰͍߹Θͤ ੒ޭ or ࣦഊ ಉ࣌઀ଓ1Λ·΋Γͳ͕Β ϦΫΤετ ੒ޭ or ࣦഊ ݁ՌʹԠͯ͡ ࢒ߴมಈ
  53. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • Cons • ਖ਼ৗܥͷνϟʔδ͕ඇಉظʹͳΔͷ͸ෳࡶ • ݱ࣮ʹ͸͔͜͜Βߋʹtimeoutͷߟྀ͕ඞཁ •

    timeout༻ͷऔҾরձͷܦ࿏΋ඇಉظͰ͋ͬ ͯɺ͚ͩͲͦΕ΋ϦΫΤετલʹ͸FIFOΩ ϡʔʹ٧Ίͳ͍ͱ…ͱͳΔͱ໰୊ൃੜ࣌ʹ Ͳ͜ʹ৘ใ͕͋Δ͔௥͍ͮΒ͍ • ো֐࣌ͷௐࠪ΍ӡ༻͕େมͦ͏ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ request_idΛฦ٫ DMJFOU ɾɾɾ ݁Ռ໰͍߹Θͤ ੒ޭ or ࣦഊ ಉ࣌઀ଓ1Λ·΋Γͳ͕Β ϦΫΤετ timeout ݁ՌʹԠͯ͡ ࢒ߴมಈ
  54. Ҋ2: globalͳlockΛ ࢖࣮ͬͯݱ • ϦΫΤετલʹglobalͳ lockΛͱΔ • ͦ͏͢ΔͱৗʹͩΕ͔Ұ ਓͷΈۚ༥ػؔ΁ϦΫΤ ετͰ͖Δ

    νϟʔδґཔ DMJFOU MPDL֫ಘ MPDL։์ ੒ޭ or ࣦഊ νϟʔδґཔ ੒ޭ or ࣦഊ
  55. Ҋ2: globalͳlockΛ ࢖࣮ͬͯݱ • Pros • ࢓૊Έ͕γϯϓϧ • ྲྀΕ͕΄΅ଞͷۚ༥ػؔͱ ಉ౳ͳͷͰɺtimeoutͳͲ

    ൃੜͯ͠΋ॲཧ͕௥͍΍͢ ͍ νϟʔδґཔ DMJFOU MPDL֫ಘ MPDL։์ ੒ޭ or ࣦഊ νϟʔδґཔ ੒ޭ or ࣦഊ
  56. Ҋ2: globalͳlockΛ ࢖࣮ͬͯݱ • Cons • lock֫ಘ·ͪͷϓϩηε͕଺ཹ ͢ΔڪΕ • ଺ཹͨ͠ͱ͖lock֫ಘ͕ฏ౳͡

    Όͳ͍ͱӡѱͣͬ͘ͱॲཧ͞Ε ͳ͍Ϣʔβʔ͕ͰΔ͔΋ʁ νϟʔδґཔ DMJFOU MPDL֫ಘ MPDL։์ ੒ޭ or ࣦഊ νϟʔδґཔ ੒ޭ or ࣦഊ
  57. ҊΛൺֱ͢Δ؍఺ • FIFOΩϡʔҊ͸ӡ༻ෛՙ͕ߴ͍ • ͦΕʹରͯ͠global lock͸ӡ༻ෛՙ͸௿͍ • ͍ͬΆ͏Ͱglobal lockΛબ୒͢ΔͱϦΫΤετ଺ཹ࣌ʹlock֫ಘ·ͪϓϩηε͕૿͑ϝϞϦ ࢖༻ྔͳͲ͕ٸ૿͢Δ͔΋

    • ͱ͸͍͑࢒ߴ؅ཧͱ͍͏ੑ্࣭ɺͰ͖Ε͹FIFOΩϡʔͰͳ͘ɺlock֫ಘͷҊͰਖ਼ৗܥ͸ಉظ తͳॲཧʹ౗͍ͨ͠ • global lockͷݒ೦Λ·ͱΊͯɺͦΕΛղܾͰ͖Δ͔ߟ͑ͯΈΔ • (ͳ͓੔ཧʹ͸AWSͷ୲౰SAͷํʹ΋͝ڠྗ͍͖ͯͨͩ͠·ͨ͠ʂ͜ͷ৔ͰվΊͯײँΛ)
  58. lock΁ͷݒ೦ͦͷ1: ϨΠςϯγ͕Θ͔Βͳ͍ • ։ൃஈ֊Ͱ͸ۚ༥ػؔͷҾ͖མͱ࣮͠ߦϨΠςϯγ͕Θ͔Βͳ͍ -> ࣮ࡍʹ଺ཹ͕ ى͖Δ͔೺Ѳͮ͠Β͍ • ֘౰ۚ༥ػؔͷνϟʔδ෩଎͸ར༻཰ͳͲ͍Ζ͍ΖؑΈ͓͓ͯΑͦ30req/min ͘

    Β͍ʹͳΓͦ͏ • ϨΠςϯγ͸Θ͔Βͳ͍͕ɺlockͱΔΞϓϩʔνͰ΋1req 2sec͘Β͍͔͔ͬͯ΋ ύϯΫ͢Δ͜ͱ͸ͳ͍ • ௨ৗ΄͔ͷۚ༥ػؔ͸95ύʔηϯλΠϧͰ਺ඦms͔ͩΒɺر๬త؍ଌͩͱ2~4ഒ ͘Β͍ʹάϩʔεͯ͠΋͓ͦΒ͘໰୊ͳ͍
  59. lock΁ͷݒ೦ͦͷ2: ϓϩηεͷ଺ཹ • ͖ͬ͞ͷࢼࢉͰͬ͘͟Γ଺ཹ͠ͳͦ͞͏ͳ͜ͱ͕Θ͔ͬͨ • ͱ͸͍͑༧ظͤ͵spike͸͋Γ͏Δɻͦ͏͍͏ͱ͖͸Ͳ͏͢Δʁ • མͪண͍ͯߟ͑Δͱɺlock֫ಘ଴ͪͰҰఆ࣌ؒͨͯ͹ΤϥʔΛฦͯ͠ Ϣʔβʔʹ࠶ࢼߦΛ͏ͳ͕ͤ͹௕ظؒ଺ཹ͸͠ͳ͍ •

    lock֫ಘͰ͖ͯͳ͍ͷͰۚ༥ػؔʹ΋ϦΫΤετͰ͖ͯͳ͍ɻͷͰ҆ શʹࣦഊʹͰ͖Δ
  60. Ҋ2: globalͳlockΛ ࢖࣮ͬͯݱ • Cons • lock֫ಘ·ͪͷϓϩηε͕଺ཹ͢ΔڪΕ • ଺ཹͨ͠ͱ͖lock֫ಘ͕ฏ౳͡Όͳ͍ͱ ӡѱͣͬ͘ͱॲཧ͞Εͳ͍Ϣʔβʔ͕Ͱ

    Δ͔΋ʁ • -> ͓͓Αͦ଺ཹ͠ͳ͍ͩΖ͏ɺ͞Βʹ lock֫ಘʹtimeoutΛઃ͚Ε͹ΑΓ҆શʂ νϟʔδґཔ DMJFOU MPDL֫ಘ MPDL։์ ੒ޭ or ࣦഊ νϟʔδґཔ ੒ޭ or ࣦഊ
  61. ੍໿͕ڧ͍ͱ͖ͷ·ͱΊ • Ͳ͏੍໿Λຬ͔ͨ͢ߟ͑Δ • ੍໿Λຬͨ͢खஈͷͳ͔ͰPros/ConsΛ·ͱΊΔ • Ͳ͏͍͏ॲཧ͕๬·͍͔͠ɺͦΕΛબͿͨΊʹͲ͏͍͏՝୊఺͕͋Δ ͔ʹண໨͠ɺͦΕ͕ղফͰ͖Δ͔ߟ͑ͯΈΔ • ͱ͖ʹ͸֎෦ͷํͷҙݟ΋ฉ͍ͯΈΔͱ৽͍͠؍఺͕ग़ͯٞ࿦͕ਐల

    ͢Δ͔΋
  62. Kyashͷಛҟੑͱ໘ന͞

  63. ֎෦ఏܞઌͱͷ࿈ܞ͕ଟͯ͘ߟྀ͕ଟ͍ʂ • ֎෦ϕϯμͱͷ෼ࢄtransactionͰ੔߹ੑ͕ٻΊΒΕΔ • ෼ࢄtransactionࣗମͷ೉͠͞ • Ξϯίϯτϩʔϥϒϧͳ࢓༷ • ͲͷΑ͏ͳΞϓϩʔν͕࢖͑Δ͔͸֎෦ϕϯμʹΑͬͯҟͳΔ •

    ਺ଟ͘ͷ੍໿ͱ޲͖߹͏ • ڧ੍͍໿ͱग़͘Θ͢͜ͱ΋গͳ͘ͳ͍
  64. Ͱ΋໘ന͍ʂ • ۚ༥ͱ͍͏฻Β͠ʹ͔ܽͤͳ͍αʔϏεʹܞΘΕΔ • ੍໿΍ࠔ೉͞ʹ޲͖߹ͬͯղܾࡦΛݟग़͢ͷ͸໘ന͍ • ੍໿ͷͳ͔ͰͲͷΑ͏ʹཁ݅Λຬ͔ͨ͢ • ͦͷͳ͔Ͱ࠷େݶ৴པͰ͖Διϑτ΢ΣΞ࡞ΔͨΊʹ͸Ͳ͏͢Δ͔ •

    ͠ΜͲ͍ͱ͖΋͋Δ͚Ͳɺ͋·ΓܦݧͰ͖ͳ͍࢓ࣄ͕ͨ͘͞ΜͰ͖Δ
  65. ͱ͸͍͑՝୊͸ࢁੵΈͩΑ • ࠷େݶ౒ྗ͍ͯ͠Δ͚Ͳɺਖ਼௚ख͕଍Γͯͳ͍Ͱ͢ • ΠέΠέͰυοΧϯυοΧϯΈ͍ͨͳײ͡Ͱ΋ͳ͍Ͱ͢ • લड़ͷ௨Γ֎෦͔Βͷ੍໿͕ଟ͍ͷͰɺͦͷ࿪Έ͕͋Δ෦෼΋ଟ͍ • λΠτͳεέδϡʔϧͰճͨ͠ϓϩδΣΫτͷෛ࠴ճऩ΋ͥΜͥΜͰ ͖ͯͳ͍

    • Ϧιʔε͕଍Γͳͯ͘ࢢ৔ͷཁٻʹ౴͖͑Εͳ͍
  66. ΈΜͳͰKyashΛΑ͍ͨ͘͠ • ޷͖ͳαʔϏεͳͷͰ • ͋ͱ޷͖ͳϝϯόʔ͕ଟ͍ͷͰ • ࠓ͍ΔϝϯόʔͱؤுΔͷ͸΋ͪΖΜͰ͕͢ɺ΋ͬͱଟ͘ͷਓΛר͖ ࠐΜͰ੝Γ্͍͛ͨͱ΋ߟ͍͑ͯ·͢ • KyashΛ͍͍ձࣾɺαʔϏεʹ͢ΔͨΊʹ͕Μ͹͍ͬͯ·͢ʂ

    • Ұॹʹ੝Γ্͍͛ͨʂͱ͍͏ํ͍ͨΒͥͻ͓࿩͠·͠ΐ͏ʙ
  67. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ