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

Goで実装するブランドネットワークとの接続ポイント

E10d51de51c08e913216385be87dc1ca?s=47 pongzu
August 04, 2022

 Goで実装するブランドネットワークとの接続ポイント

E10d51de51c08e913216385be87dc1ca?s=128

pongzu

August 04, 2022
Tweet

More Decks by pongzu

Other Decks in Technology

Transcript

  1. Goで実装するブランドネットワークとの接続ポイント Yu Tanaka Kanmu, Inc. Tech Meetup ~Goで作る決済サービス~ August 4,2022

  2. Copyright Kanmu, Inc. All right reserved. 2 田中 悠(ぽんず) @pongzu

    @_pongzu 自己紹介
  3. Copyright Kanmu, Inc. All right reserved. バンドルカードとPoolを作ってます 誰でも作れるVisaプリペイドカード 手元の資産形成に活用できるクレジットカード

  4. Copyright Kanmu, Inc. All right reserved. 4 バンドルカードのバックエンド AuthorizationとProcessor 課題

    課題へのアプローチ 1 2 3 目次 4
  5. バンドルカードのバックエンド 1

  6. Copyright Kanmu, Inc. All right reserved. バンドルカードのバックエンド 6 1 データ/お金の流れ

    Processor API  カンム 売上データ 購入OK/NG • カード作成 • カード利用履歴 • ユーザ情報 • チャージリクエスト 通知 売上データ 購入OK/NG
  7. Copyright Kanmu, Inc. All right reserved. バンドルカードのバックエンド 7 1 データ/お金の流れ

    Processor API  カンム 売上データ 購入OK/NG 通知 売上データ 購入OK/NG Go Go • カード作成 • カード利用履歴 • ユーザ情報 • チャージリクエスト
  8. AuthorizationとProcessor 2

  9. Copyright Kanmu, Inc. All right reserved. 売上データ 購入OK/NG 売上データ 購入OK/NG

    Processor Authorization AuthorizationとProcessor 2 • 決済をするとお店から売上データがVisaNetを経由して飛んでくる • 売上データはISO8583というプロトコルで定義された電文 ◦ https://speakerdeck.com/hiroakis/kurezitutokadofalsetong-xin-purotokoru-iso8583-tozhan-u • Processorは電文を受けて売上データを通して良いのか判断
  10. Copyright Kanmu, Inc. All right reserved. 売上データ OK/NG AuthorizationとProcessor 2

    Processor • Visa Serverに対してTCPのコネクションを張って電文を読む • ISO8583でフォーマットされた電文をParseする • Parseしたデータを見て決済を通すか判断する(オーソリ) • 結果を返却する電文を書き込む Visa Server Processor 売上データ OK/NG
  11. Copyright Kanmu, Inc. All right reserved. AuthorizationとProcessor 3 Processor •

    Visa Serverに対してTCPのコネクションを張って電文を読む • ISO8583でフォーマットされた電文をParseする • Parseしたデータを見て決済を通すか判断する(オーソリ) • 結果を返却する電文を書き込む 売上データ OK/NG Visa Server Processor 売上データ OK/NG
  12. Copyright Kanmu, Inc. All right reserved. AuthorizationとProcessor 2

  13. 課題 3

  14. Copyright Kanmu, Inc. All right reserved. • 大量のトラフィックに耐えれなくなった ◦ Processorが大量の決済データを捌ききれない場合、Visa

    Serverに滞 留した決済データはタイムアウトされる → サーバーの台数を増やせば解決? 3 課題
  15. Copyright Kanmu, Inc. All right reserved. 3 課題 • 大量のトラフィックに耐えれなくなった

    ◦ Processorが大量の決済データを捌ききれない場合、Visa Serverに滞 留した決済データはタイムアウトされる → サーバーの台数を増やせば解決? ◦ Visa Serverの制約で同時に張れるTCPコネクション数に上限がある
  16. Copyright Kanmu, Inc. All right reserved. 3 課題 → コネクション数は同じで裏側を非同期にするぞ!

    • 大量のトラフィックに耐えれなくなった ◦ Processorが大量の決済データを捌ききれない場合、Visa Serverに滞 留した決済データはタイムアウトされる → サーバーの台数を増やせば解決? ◦ Visa Serverの制約で同時に張れるTCPコネクション数に上限がある
  17. 課題へのアプローチ(多重化の実装) 3

  18. Copyright Kanmu, Inc. All right reserved. 4 多重化の実装(シングルスレッド) 1.Visa Serverへのコネクションをはる

    2.listen goroutineの起動 1.Visa Serverから生データ読み取り 2. 生データをparse 3. オーソリゼーション 4. Visa Serverへ書き込み SIGINTやSIGTERM を受けたらstopSigal を送信する main() listen() signal() stopSignal stopSignal
  19. Copyright Kanmu, Inc. All right reserved. 4 多重化の実装(マルチスレッドv1) 1.Visa Serverへのコネクションをはる

    2.listen goroutineの起動 各goroutineを起動する SIGINTやSIGTERM を受けたらstopSigal を送信する main() listen() signal() 1.Visa Serverから 生データ読み取り 2. 生データをparse Visa Serverへ書き込み fromVisa() toVisa() オーソリゼーション authorization()
  20. Copyright Kanmu, Inc. All right reserved. 4 多重化の実装(マルチスレッドv1) 1.Visa Serverへのコネクションをはる

    2.listen goroutineの起動 各goroutineを起動する SIGINTやSIGTERM を受けたらstopSigal を送信する main() listen() signal() stopSignal stopSignal stopSignal 1.Visa Serverから 生データ読み取り 2. 生データをparse Visa Serverへ書き込み fromVisa() toVisa() オーソリゼーション authorization() fromVisaChan toVisaChan
  21. Copyright Kanmu, Inc. All right reserved. 4 多重化の実装(マルチスレッドv1) 1.Visa Serverへのコネクションをはる

    2.listen goroutineの起動 各goroutineを起動する SIGINTやSIGTERM を受けたらstopSigal を送信する main() listen() signal() stopSignal stopSignal 1.Visa Serverから 生データ読み取り 2. 生データをparse Visa Serverへ書き込み fromVisa() toVisa() オーソリゼーション authorization() fromVisaChan toVisaChan stopSignal
  22. Copyright Kanmu, Inc. All right reserved. • stopシグナルを受けて全てのgoroutineを停止した場合未 処理のパケットを捨ててしまう可能性がある ▪

    担保されるべき順序とは? • Visa Serverからの読み込みの停止 • 全てのauthorizationの完了 • Visa Serverへの書き込みの完了 • Visa Serverへのコネクションを切る 4 多重化の実装(マルチスレッドv1の問題点)
  23. Copyright Kanmu, Inc. All right reserved. 4 多重化の実装(マルチスレッドv2) 1.stopSignalが届いたらVisa Serverへの読み取りを止める(わざとreadをtimeoutさせる)

    2.全てのauthorizationの完了を待つ 3.toVisa()に終了のシグナルを伝える 1.Visa Serverから 生データ読み取り 2. 生データをparse Visa Serverへ書き込み waitAuthorization() fromVisa() toVisa() fromVisaChan toVisaChan stopSignal (※厳密にはtoVisaChanをclose) オーソリゼーション authorization() stopSignal ※listen以下は同じなので省いてます 完了を待つ 読み込みを止める
  24. Copyright Kanmu, Inc. All right reserved. 意図的にコネクションをタイムアウトさせる 4 多重化の実装(小ネタ) https://go.googlesource.com/go/+/refs/tags/go1.14.5/src/net/http/http.go#25

    https://ymotongpoo.hatenablog.com/entry/2020/07/17/093000 を参照
  25. Thank you!