Goで実装した UPSIDERの決済金額リミット機能

Goで実装した
UPSIDERの決済金額リミット機能
株式会社 UPSIDER
Miki Masumoto
1
Gopherは「Go」のマスコットキャラクター、原作者は Renee French さんです。以降のページも同様。
自己紹介
● Masumoto Miki
● 2022/1からUPSIDERにJOIN
○ Sler→フリーランス→UPSIDER
● Gopher歴は1年ほど
○ JavaとJavaScript/TypeScriptをよく書いてました
● 常にワーケーション中
2
UPSIDERについて
● 成長企業向けの法人カード、支払いプラットフォームを提供
● ビジネスの「お金」を呼吸感覚まで自在に
3
Today’s
goal
決済というクリティカルかつリアルタイム性が
求められるシステムで
Goをどう活用しているのかを知ってもらうこと
4
目次
● 決済システムの概要
● 決済金額リミットを扱う機能の紹介
● 実装のポイントとGoのコードサンプル
● Goで書いてよかったところ
5
カード決済の流れ
6
カード決済
システム
加盟店
オーソリ(承認要求)
クリアリング(売上確定)
◯◯円で決済します
OK/NG
◯◯円請求します
カード利用者
決済金額のリミット機能とは?
決済が飛んできた時にチェックされる金額上限
1.企業ごとの決済金額リミット
2.ユーザーごと1取引の決済金額リミット
3.ユーザーごとの月間決済金額リミット
毎月1日0時にリセット
4.ユーザーごとの日次決済金額リミット
毎日0時にリセット
ユーザごとのリミットはユーザが任意で設定可能
7
決済金額リミット関連の処理たち
● 決済金額のリミットを設定/解除する
○ WEB画面からの操作によって呼ばれる
● DBからのトータル決済額の読み込み・書き込み
○ オーソリ・クリアリングなどが飛んできた時に呼ばれる
● トータル金額のリセット
○ システム内部のバッチで呼ばれる
8
決済金額リミット関連のデータを扱うstruct
9
実装のポイント① 柔軟な金額リミット機能
10
実装のポイント① 柔軟な金額リミット機能
11
今後、もっと柔軟なリミット機能が欲しくなるかも
● 週ごと/期ごとにリミットを持たせたい... etc
● 毎月20日/15日など間隔は同じで特定日や時間にリセットしたい
実装のポイント① 柔軟な金額リミット機能
12
💡新しいリミットのタイプを実装したい
👉次回のリセットのタイミングを計算するロジックだけ作れば実装できる
実装のポイント① 柔軟な金額リミット機能
13
👉次回リセット日時(NextResetAt)を変えることで実現できる
💡既存のリミット間隔で特定の日付・時間にリセットしたい
● 20日にリセットされる月間リミット
7/1 8/1 9/1
リミットの設定をする
NextResetAt = 7/20
リセット処理が走る
NextResetAt = 8/20
LastResetAt = 7/20
7/17 7/20 8/20
実装のポイント② 安全なトータル金額のリセット
14
実装のポイント② 安全なトータル金額のリセット
15
トータル金額リセット時の懸念
● リセット時刻にリセットする処理が遅延/失敗したら?
● オーソリなどのリアルタイムで飛んでくる決済が同時に飛んできたら?
実装のポイント② 安全なトータル金額のリセット
16
💥ケース1:リセット処理がまだなのにオーソリが飛んできてしまった
単純な、トータル金額を0円にするリセット処理ではなぜダメなのか
00:00:00 00:00:01
23:59:59
トータル金額
0時にリセットされる1日あたりの決済金額リミットの例
10000円 13000円 0円
オーソリ
3000円
リセット処理の実行
本当の
トータル金額 10000円 3000円 3000円
合わない
実装のポイント② 安全なトータル金額のリセット
17
💥ケース2:日付が変わる直前にオーソリが飛んできて処理中にリセットが走った
単純な、トータル金額を0円にするリセット処理ではなぜダメなのか
00:00:00 00:00:01
23:59:59
トータル金額
0時にリセットされる1日あたりの決済金額リミットの例
10000円 0円 4000円
オーソリ 4000円(処理に時間がかかった)
リセット処理の実行
本当の
トータル金額 10000円 0円 0円
合わない
実装のポイント② 安全なトータル金額のリセット
18
リセット前後のトータル金額も保持し、取得時刻から使われるべきトータル金額を判断する
実装のポイント② 安全なトータル金額のリセット
19
トータル金額リセット処理は0にするのではなく、次の断面にスライドさせる
Goのよかったところ①
20
● 言語仕様がシンプルで既存コードのキャッチアップしやすい
処理の流れと分岐が追いやすい
Goのよかったところ②
21
● 抽象化の機能が限られているので、個別ケースの扱いに困ったり
過度な抽象化による難読コードを書くリスクを避けられる
抽象化していないことで
コードを追いやすい
似た振る舞いのstruct
Goのよかったところ③
22
● エラーハンドルが必ず入るのでバグに気付きやすい
いろんなところにif err
If errを書きながら不具合に気づく
Try catchのネストもない
Goのよかったところ④
23
● ほぼ標準ライブラリで開発が可能(特にテストで嬉しい)
テストカバレッジも自動で出してくれる🎉
標準ライブラリで
テーブル駆動テストが簡単に書ける
まとめ
24
📍 決済というクリティカルかつリアルタイム性が求められるシステムで
Goをどう活用しているのか?
💪 考えることが多い要件や仕様でもGoのシンプルな言語仕様を生かし
レビューしやすく見通しの良いコードを書くことによって
堅牢なシステム作りをしています
Thank you for
listening.
25
We are hiring!
@masumomo
@m_miki0108
1 of 25

Recommended

Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24 by
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24
Mercari JPのモノリスサービスをKubernetesに移行した話 PHP Conference 2022 9/24Shin Ohno
2.6K views33 slides
分散システムについて語らせてくれ by
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれKumazaki Hiroki
119.4K views45 slides
エンジニアの個人ブランディングと技術組織 by
エンジニアの個人ブランディングと技術組織エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織Takafumi ONAKA
23.3K views40 slides
君はyarn.lockをコミットしているか? by
君はyarn.lockをコミットしているか?君はyarn.lockをコミットしているか?
君はyarn.lockをコミットしているか?Teppei Sato
30.4K views25 slides
Docker Compose 徹底解説 by
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説Masahito Zembutsu
61.1K views123 slides
コンテナ未経験新人が学ぶコンテナ技術入門 by
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
140.3K views89 slides

More Related Content

What's hot

僕がつくった 70個のうちの48個のWebサービス達 by
僕がつくった 70個のうちの48個のWebサービス達僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達Yusuke Wada
18.8K views121 slides
入門!Jenkins by
入門!Jenkins入門!Jenkins
入門!JenkinsShuntaro Saiba
6.6K views84 slides
AWSのログ管理ベストプラクティス by
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティスAkihiro Kuwano
77.2K views57 slides
超実践 Cloud Spanner 設計講座 by
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座Samir Hammoudi
21.3K views26 slides
DockerとPodmanの比較 by
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
47.8K views37 slides
フロー効率性とリソース効率性について #xpjug by
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjugItsuki Kuroda
106.1K views62 slides

What's hot(20)

僕がつくった 70個のうちの48個のWebサービス達 by Yusuke Wada
僕がつくった 70個のうちの48個のWebサービス達僕がつくった 70個のうちの48個のWebサービス達
僕がつくった 70個のうちの48個のWebサービス達
Yusuke Wada18.8K views
AWSのログ管理ベストプラクティス by Akihiro Kuwano
AWSのログ管理ベストプラクティスAWSのログ管理ベストプラクティス
AWSのログ管理ベストプラクティス
Akihiro Kuwano77.2K views
超実践 Cloud Spanner 設計講座 by Samir Hammoudi
超実践 Cloud Spanner 設計講座超実践 Cloud Spanner 設計講座
超実践 Cloud Spanner 設計講座
Samir Hammoudi21.3K views
DockerとPodmanの比較 by Akihiro Suda
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
Akihiro Suda47.8K views
フロー効率性とリソース効率性について #xpjug by Itsuki Kuroda
フロー効率性とリソース効率性について #xpjugフロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda106.1K views
テストコードの DRY と DAMP by Yusuke Kagata
テストコードの DRY と DAMPテストコードの DRY と DAMP
テストコードの DRY と DAMP
Yusuke Kagata1.6K views
マイクロサービスにおける 結果整合性との戦い by ota42y
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y12.3K views
BuildKitによる高速でセキュアなイメージビルド by Akihiro Suda
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda42.6K views
目grep入門 +解説 by murachue
目grep入門 +解説目grep入門 +解説
目grep入門 +解説
murachue89.4K views
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善 by Ito Takayuki
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
Ito Takayuki528 views
イベント・ソーシングを知る by Shuhei Fujita
イベント・ソーシングを知るイベント・ソーシングを知る
イベント・ソーシングを知る
Shuhei Fujita31K views
DockerコンテナでGitを使う by Kazuhiro Suga
DockerコンテナでGitを使うDockerコンテナでGitを使う
DockerコンテナでGitを使う
Kazuhiro Suga18.8K views
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話) by Tokoroten Nakayama
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
事業の進展とデータマネジメント体制の進歩(+プレトタイプの話)
Tokoroten Nakayama9.4K views
本当は恐ろしい分散システムの話 by Kumazaki Hiroki
本当は恐ろしい分散システムの話本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki686.1K views
コンテナの作り方「Dockerは裏方で何をしているのか?」 by Masahito Zembutsu
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu30.8K views
世界一わかりやすいClean Architecture by Atsushi Nakamura
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura47.1K views
ChatGPT 人間のフィードバックから強化学習した対話AI by Shota Imai
ChatGPT 人間のフィードバックから強化学習した対話AIChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai106K views

Similar to Goで実装した UPSIDERの決済金額リミット機能

2020.02.14「雇用類似の働き方に係る論点整理等に関する検討会」フリーランス協会平田資料 by
2020.02.14「雇用類似の働き方に係る論点整理等に関する検討会」フリーランス協会平田資料2020.02.14「雇用類似の働き方に係る論点整理等に関する検討会」フリーランス協会平田資料
2020.02.14「雇用類似の働き方に係る論点整理等に関する検討会」フリーランス協会平田資料プロフェッショナル&パラレルキャリア・フリーランス協会
638 views36 slides
【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210 by
【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210
【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210Osamu Ise
2.8K views79 slides
ブレークスルーキャンプ By IMJ キックオフイベント by
ブレークスルーキャンプ By IMJ キックオフイベントブレークスルーキャンプ By IMJ キックオフイベント
ブレークスルーキャンプ By IMJ キックオフイベントブレークスルーパートナーズ 赤羽雄二
2.3K views75 slides
20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』 by
20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』
20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』Ryo RKTM
1.1K views32 slides
Dチーム_佐藤、浜野、三井、矢島、山根 by
Dチーム_佐藤、浜野、三井、矢島、山根Dチーム_佐藤、浜野、三井、矢島、山根
Dチーム_佐藤、浜野、三井、矢島、山根Jumpei Yamane
592 views18 slides

Similar to Goで実装した UPSIDERの決済金額リミット機能 (20)

【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210 by Osamu Ise
【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210
【Halo】スマホアプリ3つの法則 ボケてをアプリ化するときにやったこと121210
Osamu Ise2.8K views
20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』 by Ryo RKTM
20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』
20091010名古屋Ruby会議01 プログラマとプログラマでない人のための課題管理ツール『Redmine』
Ryo RKTM1.1K views
Dチーム_佐藤、浜野、三井、矢島、山根 by Jumpei Yamane
Dチーム_佐藤、浜野、三井、矢島、山根Dチーム_佐藤、浜野、三井、矢島、山根
Dチーム_佐藤、浜野、三井、矢島、山根
Jumpei Yamane592 views
【Drop wave】cedec2011『ネットワークゲーム時代に求められる、ゲームプランナーの基礎知識』 by モノビット エンジン
【Drop wave】cedec2011『ネットワークゲーム時代に求められる、ゲームプランナーの基礎知識』【Drop wave】cedec2011『ネットワークゲーム時代に求められる、ゲームプランナーの基礎知識』
【Drop wave】cedec2011『ネットワークゲーム時代に求められる、ゲームプランナーの基礎知識』
解剖!テレワーク普及の秘訣、導入ノウハウ、業績向上とのつながり by Tomohiro KIMURA
解剖!テレワーク普及の秘訣、導入ノウハウ、業績向上とのつながり解剖!テレワーク普及の秘訣、導入ノウハウ、業績向上とのつながり
解剖!テレワーク普及の秘訣、導入ノウハウ、業績向上とのつながり
Tomohiro KIMURA6.2K views
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06 by 俊仁 小林
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
大規模JSプロジェクト ロードオブナイツの管理手法紹介 2012-11-06
俊仁 小林5.2K views
「コンバージョン数を2倍にしてくれ」と言われた時の対処法 by Tsuyoshi Kaneko
「コンバージョン数を2倍にしてくれ」と言われた時の対処法 「コンバージョン数を2倍にしてくれ」と言われた時の対処法
「コンバージョン数を2倍にしてくれ」と言われた時の対処法
Tsuyoshi Kaneko10.8K views
ITでみんなを幸せに、ITで自分も幸せに by suno88
ITでみんなを幸せに、ITで自分も幸せにITでみんなを幸せに、ITで自分も幸せに
ITでみんなを幸せに、ITで自分も幸せに
suno88779 views
Hour of-code-2016冬-シンポジウム by Yuta Tonegawa
Hour of-code-2016冬-シンポジウムHour of-code-2016冬-シンポジウム
Hour of-code-2016冬-シンポジウム
Yuta Tonegawa1.1K views
第1回 継続率経営セミナー 公開資料 by pLucky
第1回 継続率経営セミナー 公開資料第1回 継続率経営セミナー 公開資料
第1回 継続率経営セミナー 公開資料
pLucky4.9K views
iOSアプリの広告による収益化 ~各アドネットワークの傾向、SmAddによる収益最大化~ by Koichiro Sumi
iOSアプリの広告による収益化 ~各アドネットワークの傾向、SmAddによる収益最大化~iOSアプリの広告による収益化 ~各アドネットワークの傾向、SmAddによる収益最大化~
iOSアプリの広告による収益化 ~各アドネットワークの傾向、SmAddによる収益最大化~
Koichiro Sumi7.1K views
Redmineをつかったスクラム開発のはじめの一歩 by kiita312
Redmineをつかったスクラム開発のはじめの一歩Redmineをつかったスクラム開発のはじめの一歩
Redmineをつかったスクラム開発のはじめの一歩
kiita31224.2K views
フリーランスエンジニアを半年間やってみた by Ohira Yukito
フリーランスエンジニアを半年間やってみたフリーランスエンジニアを半年間やってみた
フリーランスエンジニアを半年間やってみた
Ohira Yukito3.1K views

Recently uploaded

Windows 11 information that can be used at the development site by
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development siteAtomu Hidaka
80 views41 slides
The Things Stack説明資料 by The Things Industries by
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things IndustriesCRI Japan, Inc.
51 views29 slides
定例会スライド_キャチs 公開用.pdf by
定例会スライド_キャチs 公開用.pdf定例会スライド_キャチs 公開用.pdf
定例会スライド_キャチs 公開用.pdfKeio Robotics Association
97 views64 slides
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)NTT DATA Technology & Innovation
18 views38 slides
SNMPセキュリティ超入門 by
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門mkoda
301 views15 slides

Recently uploaded(11)

Windows 11 information that can be used at the development site by Atomu Hidaka
Windows 11 information that can be used at the development siteWindows 11 information that can be used at the development site
Windows 11 information that can be used at the development site
Atomu Hidaka80 views
The Things Stack説明資料 by The Things Industries by CRI Japan, Inc.
The Things Stack説明資料 by The Things IndustriesThe Things Stack説明資料 by The Things Industries
The Things Stack説明資料 by The Things Industries
CRI Japan, Inc.51 views
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料) by NTT DATA Technology & Innovation
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
速習! PostgreSQL専用HAソフトウェア: Patroni(PostgreSQL Conference Japan 2023 発表資料)
SNMPセキュリティ超入門 by mkoda
SNMPセキュリティ超入門SNMPセキュリティ超入門
SNMPセキュリティ超入門
mkoda301 views
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20... by NTT DATA Technology & Innovation
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
今、改めて考えるPostgreSQLプラットフォーム - マルチクラウドとポータビリティ -(PostgreSQL Conference Japan 20...
さくらのひやおろし2023 by 法林浩之
さくらのひやおろし2023さくらのひやおろし2023
さくらのひやおろし2023
法林浩之94 views
SSH応用編_20231129.pdf by icebreaker4
SSH応用編_20231129.pdfSSH応用編_20231129.pdf
SSH応用編_20231129.pdf
icebreaker4287 views

Goで実装した UPSIDERの決済金額リミット機能

Editor's Notes

  1. さて、先ほどの図で出てきたカード決済システムがUPSIDERではどんな構成になっているかみてみます。 弊社はマイクロサービスを採用していて、複数のサービスによって構成されています。 先ほどの話でてできた、オーソリとかクリアリングと呼ばれる電文は私たちの場合はVisaNetと呼ばれるVisaのネットワークから飛んできます。 そこからUPSIDERのゲートウェイやルータなどを介して、オーソリ、クリアリングなどの電文ごとのハンドラーに渡されます。 そこからさらに各ドメインを担当しているReaderやWriterと呼ばれるマイクロサービスたちを呼び出すといった流れです。 今回のメインテーマである決済金額のリミットの機能も、ユーザの利用金額を管理するサービスとして独立しています。 ではその決済金額のリミット機能の紹介に入っていきます。が、