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

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

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

convto

April 18, 2022
Tweet

More Decks by convto

Other Decks in Technology

Transcript

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

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

    ϕϯμ͕࢖ͬͯΔݴޠ/FWʹΑͬͯ͸҉߸पΓͷॲཧͰGoͱ৯͍߹Θ͕ͤѱ͍ έʔε͕͋ͬͨΓͱ͔ • ఏܞઌͷ࢓༷ʹΊͪΌΊͪΌڧ੍͍໿͕͋Δͱ͔
  3. ΄͛΄͛ۜߦͱ ৽ن઀ଓ • ೖۚιʔεͱͯ͠৽͍ۜ͠ߦ ͱ઀ଓ͠·͢ • ۜߦͱܖ໿ͯ͠࢓༷ॻΛ΋Β ͬͨΒҎԼͷهࡌ͕ • ʮ౰ߦ΁ͷHTTPϦΫΤετͷ

    ಉ࣌઀ଓ਺্ݶ͸1ʯ ૉ๿ʹ΍Δͱ෩଎௓Ͷͨ ͱ͖ʹ଺ཹ͠ͳ͍͔ γʔέϯγϟϧʹϦΫΤετʁ Ͳ͏͍͏࢓૊ΈͰ࣮ݱ͢Δʁ Ωϡʔʁlock֫ಘʁPros/Cons͸ʁ
  4. Contents 1. ֎෦ϕϯμͱͷ੔߹ੑͷ୲อʹ͍ͭͯ • ੔߹ੑ͕ζϨΔύλʔϯͷ঺հ • ੔߹ੑΛ߹ΘͤΔͨΊͷ౒ྗ 2. ҉߸·ΘΓͷ͋Ε͜Ε •

    ϨΨγʔͳ҉߸ํ͕ࣜGoͰར༻Ͱ͖ͳ͍৔߹ • ҉߸पΓͷ࢓༷ͰؾΛ͚ͭΔ఺ 3. ࢓༷ʹڧ੍͍໿͕͋Δ৔߹ • ಉ࣌઀ଓ਺1 4.Kyashͷಛҟੑͱ໘ന͞
  5. ϕϯμ͕timeout ͢Δύλʔϯ • ωοτϫʔΫ͕ෆ҆ఆͩ ͬͨΓ͢Δͱൃੜ͠͏Δ • Ҿ͖མͱ͞ΕͨͷʹKyash ʹνϟʔδ͞Εͯͳ͍Μ ͚ͩͲʂ͕͋Γ͑Δ νϟʔδґཔ

    νϟʔδֹۚΛ Ϣʔβʔޱ࠲͔Βݮࢉ Ϩεϙϯε͕timeoutͨ͠ΒͲ͏ͳΔʁ ͳΜ͔݁Ռؼͬͯ͜ͳ͔ͬͨͳ… ੒ޭͯ͠Δ͔Θ͔ΒΜͷͰ ͔ͬͯʹ࢒ߴ૿΍ͤͳ͍ͳ...
  6. Α͏͸͜Εͬͯ෼ࢄtransaction͡ΌΜ • ͳΔ΄ͲͦΕ͸೉͍͠ • ͔͠΋΋ͱ΋ͱผͷαʔϏεͳͷͰ෼ࢄΛආ͚Δ͜ͱ͕Ͱ͖ͳ͍ • Ͱ΋ɺٯʹݴ͏ͱ෼ࢄtransactionจ຺ͷΞϓϩʔν͕࢖͑ΔͷͰ͸ʁ • ͱ͓΋͍ͬͯͨ࣌୅͕΅͘ʹ΋͋Γ·ͨ͠ •

    2PCͱ͔͸جຊతʹϕϯμ͕αϙʔτͯ͠ͳ͍(͍Ζ͍Ζͳߟྀ͕͋Γ2PCࣗମ৻ॏͳݕ౼ ͕ඞཁ͚ͩͲɺͦ΋ͦ΋બ୒ࢶʹͳ͍) • sagaύλʔϯΈ͍ͨͳ໰୊͋ͬͨΒิঈtransactionͰ݁Ռ੔߹ΛͱΔΞϓϩʔν΋ɺۜߦ ͸͍͍ͩͨ transactionͷଧফAPI͕ͳ͍ ͷͰબ΂ͳ͍
  7. ύλʔϯͦͷ1 timeoutͨ͠Β ඇಉظʹরձ • timeoutൃੜ࣌ʹඇಉظͰ͢Έ΍͔ʹऔ ҾরձΛґཔ͢Δ • ۚ༥ػؔʹΑͬͯऔҾরձ·ͰʹNඵ· ͬͯͶʂͳͲࡉ͔͍৚͕݅ҟͳΔ νϟʔδґཔ

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

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

    νϟʔδґཔ timeout ɾɾɾ YYYY/MM/DDͷऔҾશ෦ڭ͑ͯ ͜Ε΍Ͱ ,ZBTI͕೺Ѳͯ͠ΔऔҾ ৘ใͱಥ߹Ͱ͖Δ
  10. • ੝Γ͕͖͋ͬͯ·ͨ͠Ͷ • ΄΅΄΅ͳ͍͚Ͳɺͨ·ʙʙʙʙʹ໰୊ʹͳΔ • ͜͏͍͏ࣄ͕ى͖Δഎܠ • ͦ΋ͦ΋ۚ༥ػؔͱ͔͸ྺ࢙͋ΔαʔϏεͳ৔߹͕ଟ͍(ੲ͸҆શͩͬͨ ܥ) •

    ϕϯμଆ͕৽ن։ൃͰ΋ɺར༻ͯ͠Δݴޠ/FW͕ྺ࢙͕ਂͯ͘ޙํޓ׵͕ खް͍΋ͷͩͬͨΓ͢Δͱ;ͭ͏ʹબ΂ͪΌͬͨΓ͢Δ ϕϯμ͕GoͰ࢖͑ͳ͍҉߸Λཁٻ͖ͯͨ͠ͱ͖
  11. ͓·͚: 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ͯ͠ͶʯΈ͍ͨͳཁٻ͕͞ΕΔ͜ͱ͕͋Γ·͢ • ҉߸ΞϧΰϦζϜͷϒϩοΫαΠζͳͲ͔Β൑அ͠Α͏
  12. Ҋ1: FIFOΩϡʔΛ ࢖࣮ͬͯݱ • FIFOΩϡʔΛ࢖ͬͯಉ࣌ ઀ଓ਺1Λ࣮ݱ͢ΔҊ νϟʔδΛλοϓ '*'0Ωϡʔ FIFOΩϡʔʹ٧ΊΔ ݁Ռ໰͍߹ΘͤͷͨΊͷ

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

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

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

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

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

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

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

    Β͍ʹͳΓͦ͏ • ϨΠςϯγ͸Θ͔Βͳ͍͕ɺlockͱΔΞϓϩʔνͰ΋1req 2sec͘Β͍͔͔ͬͯ΋ ύϯΫ͢Δ͜ͱ͸ͳ͍ • ௨ৗ΄͔ͷۚ༥ػؔ͸95ύʔηϯλΠϧͰ਺ඦms͔ͩΒɺر๬త؍ଌͩͱ2~4ഒ ͘Β͍ʹάϩʔεͯ͠΋͓ͦΒ͘໰୊ͳ͍
  20. Ҋ2: globalͳlockΛ ࢖࣮ͬͯݱ • Cons • lock֫ಘ·ͪͷϓϩηε͕଺ཹ͢ΔڪΕ • ଺ཹͨ͠ͱ͖lock֫ಘ͕ฏ౳͡Όͳ͍ͱ ӡѱͣͬ͘ͱॲཧ͞Εͳ͍Ϣʔβʔ͕Ͱ

    Δ͔΋ʁ • -> ͓͓Αͦ଺ཹ͠ͳ͍ͩΖ͏ɺ͞Βʹ lock֫ಘʹtimeoutΛઃ͚Ε͹ΑΓ҆શʂ νϟʔδґཔ DMJFOU MPDL֫ಘ MPDL։์ ੒ޭ or ࣦഊ νϟʔδґཔ ੒ޭ or ࣦഊ