Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

AuthorizationとProcessor 2

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

課題 3

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

Thank you!