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

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

pongzu
August 04, 2022

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

pongzu

August 04, 2022
Tweet

More Decks by pongzu

Other Decks in Technology

Transcript

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

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

    Processor API  カンム 売上データ 購入OK/NG 通知 売上データ 購入OK/NG Go Go • カード作成 • カード利用履歴 • ユーザ情報 • チャージリクエスト
  3. 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は電文を受けて売上データを通して良いのか判断
  4. Copyright Kanmu, Inc. All right reserved. 売上データ OK/NG AuthorizationとProcessor 2

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

    Visa Serverに対してTCPのコネクションを張って電文を読む • ISO8583でフォーマットされた電文をParseする • Parseしたデータを見て決済を通すか判断する(オーソリ) • 結果を返却する電文を書き込む 売上データ OK/NG Visa Server Processor 売上データ OK/NG
  6. Copyright Kanmu, Inc. All right reserved. • 大量のトラフィックに耐えれなくなった ◦ Processorが大量の決済データを捌ききれない場合、Visa

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

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

    • 大量のトラフィックに耐えれなくなった ◦ Processorが大量の決済データを捌ききれない場合、Visa Serverに滞 留した決済データはタイムアウトされる → サーバーの台数を増やせば解決? ◦ Visa Serverの制約で同時に張れるTCPコネクション数に上限がある
  9. 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
  10. 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()
  11. 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
  12. 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
  13. Copyright Kanmu, Inc. All right reserved. • stopシグナルを受けて全てのgoroutineを停止した場合未 処理のパケットを捨ててしまう可能性がある ▪

    担保されるべき順序とは? • Visa Serverからの読み込みの停止 • 全てのauthorizationの完了 • Visa Serverへの書き込みの完了 • Visa Serverへのコネクションを切る 4 多重化の実装(マルチスレッドv1の問題点)
  14. 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以下は同じなので省いてます 完了を待つ 読み込みを止める