$30 off During Our Annual Pro Sale. View Details »

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

pongzu
August 04, 2022

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

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

    View Slide

  2. Copyright Kanmu, Inc. All right reserved. 2
    田中 悠(ぽんず)
    @pongzu
    @_pongzu
    自己紹介

    View Slide

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

    View Slide

  4. Copyright Kanmu, Inc. All right reserved. 4
    バンドルカードのバックエンド
    AuthorizationとProcessor
    課題
    課題へのアプローチ
    1
    2
    3
    目次
    4

    View Slide

  5. バンドルカードのバックエンド
    1

    View Slide

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

    View Slide

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

    View Slide

  8. AuthorizationとProcessor
    2

    View Slide

  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は電文を受けて売上データを通して良いのか判断

    View Slide

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

    View Slide

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

    View Slide

  12. Copyright Kanmu, Inc. All right reserved.
    AuthorizationとProcessor
    2

    View Slide

  13. 課題
    3

    View Slide

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

    View Slide

  15. Copyright Kanmu, Inc. All right reserved.
    3 課題
    ● 大量のトラフィックに耐えれなくなった
    ○ Processorが大量の決済データを捌ききれない場合、Visa Serverに滞
    留した決済データはタイムアウトされる
    → サーバーの台数を増やせば解決?
    ○ Visa Serverの制約で同時に張れるTCPコネクション数に上限がある

    View Slide

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

    View Slide

  17. 課題へのアプローチ(多重化の実装)
    3

    View Slide

  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

    View Slide

  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()

    View Slide

  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

    View Slide

  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

    View Slide

  22. Copyright Kanmu, Inc. All right reserved.
    ● stopシグナルを受けて全てのgoroutineを停止した場合未
    処理のパケットを捨ててしまう可能性がある
    ■ 担保されるべき順序とは?
    ● Visa Serverからの読み込みの停止
    ● 全てのauthorizationの完了
    ● Visa Serverへの書き込みの完了
    ● Visa Serverへのコネクションを切る
    4 多重化の実装(マルチスレッドv1の問題点)

    View Slide

  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以下は同じなので省いてます
    完了を待つ
    読み込みを止める

    View Slide

  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 を参照

    View Slide

  25. Thank you!

    View Slide