Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Open SKT: メルペイ開発の裏側 / builderscon tokyo 2019 Op...
Search
kazegusuri
August 30, 2019
Technology
22
26k
Open SKT: メルペイ開発の裏側 / builderscon tokyo 2019 Open SKT
kazegusuri
August 30, 2019
Tweet
Share
More Decks by kazegusuri
See All by kazegusuri
go-sqlite3を使ってCloud Spannerエミュレーターを作ってみた / Cloud Spanner emulator with go-sqlite3
kazegusuri
5
6.4k
handy-spanner GCPUG
kazegusuri
4
1.7k
Keep watching and extending features of gRPC
kazegusuri
3
2.4k
Testing with microservices in merpay
kazegusuri
10
10k
Real World Mercari API Architecture
kazegusuri
1
6k
gRPC and REST with gRPC in practice
kazegusuri
19
7.6k
Fluentdで始めるPrometheus / Prometheus Tokyo Meetup #1
kazegusuri
1
1.7k
GRPCの実践と現状での利点欠点 / Go Conference 2016 Spring
kazegusuri
44
32k
OutputとBufferedOutputの間の何か
kazegusuri
2
3.1k
Other Decks in Technology
See All in Technology
[CV勉強会@関東 ECCV2024 読み会] オンラインマッピング x トラッキング MapTracker: Tracking with Strided Memory Fusion for Consistent Vector HD Mapping (Chen+, ECCV24)
abemii
0
220
dev 補講: プロダクトセキュリティ / Product security overview
wa6sn
1
2.3k
複雑なState管理からの脱却
sansantech
PRO
1
140
エンジニア人生の拡張性を高める 「探索型キャリア設計」の提案
tenshoku_draft
1
120
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
750
Terraform未経験の御様に対してどの ように導⼊を進めていったか
tkikuchi
2
430
The Role of Developer Relations in AI Product Success.
giftojabu1
0
120
AGIについてChatGPTに聞いてみた
blueb
0
130
Lambda10周年!Lambdaは何をもたらしたか
smt7174
2
110
インフラとバックエンドとフロントエンドをくまなく調べて遅いアプリを早くした件
tubone24
1
430
ドメイン名の終活について - JPAAWG 7th -
mikit
33
20k
Can We Measure Developer Productivity?
ewolff
1
150
Featured
See All Featured
Happy Clients
brianwarren
98
6.7k
Gamification - CAS2011
davidbonilla
80
5k
How To Stay Up To Date on Web Technology
chriscoyier
788
250k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Documentation Writing (for coders)
carmenintech
65
4.4k
Fashionably flexible responsive web design (full day workshop)
malarkey
405
65k
The Language of Interfaces
destraynor
154
24k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
27
840
Building Better People: How to give real-time feedback that sticks.
wjessup
364
19k
Building Flexible Design Systems
yeseniaperezcruz
327
38k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Transcript
Masahiro Sano @kazegusuri Open SKT: メルペイ開発の裏側 builderscon tokyo 2019
1
決済・金融サービス is hard 2 決済はお金のトランザクション管理が難しい そう思っていた時期が自分にもありました
今日のテーマ 3 あんしん・あんぜんのために 技術的に取り組んできたことを知ってもらう
@kazegusuri • Merpay Backend Engineer • Architect Team 2015/11 2017/01
2018/01 SRE & Platform Platform Payment & Architect 4
アジェンダ メルペイの概要 1 全体のアーキテクチャの概要 2 決済システムの一貫性管理 3 不正検知 4 開発フロー
5 5
メルペイの概要 6
2019年2月 非接触型サービス「iD」に対応 2019年4月 複数回のお買い物をあとからまとめて支払える 「メルペイあと払い」開始 2019年5月 ECサイトでも「メルペイ」が利用できる ネット決済提供開始 2019年3月 大手チェーンや中・小規模店舗で
QR・バーコード決済に対応 全国135万か所 (iOS/Android) iD コード払い あと払い ネット決済 メルペイの概要 7
メルペイの サービス規模 マイクロサービスアーキテクチャ 40以上のマイクロサービス 2019 3Qで 1444億円以上を取り扱う メルカリの決済基盤(USのメルカリ事業も含む数字 ) 200万人以上の利用者
(メルペイ「電子マネー」の登録を行ったユーザーの累計。 コード払いは除く ) 8
そもそもSKTって何? オンボーディングも兼ねた社員研修 各システムの具体的な処理の流れ メルカリ・メルペイのアーキテクチャ 開発体制や開発方法 メルペイの目標やポリシー 9
メルペイの開発で重要視していること インフラのように安定して信頼できるシステム サービス開発をメインにしない 10
全体のアーキテクチャ概要 11
アーキテクチャ API Gateway Authority API Service X API Service Y
Google Cloud Load Balancer Service A Service B Google Kubernetes Engine Service C Web Service Z Cloud Spanner Project A Cloud Spanner Cloud Pub/Sub Project B Project GKE 12
アーキテクチャ マイクロサービスの階層化 1マイクロサービス, 1 Namespace & 1 Project 共通のGKEクラスター 13
4階層のアーキテクチャ Backend Service API Gateway API Service Client Client アプリ、加盟店等のパートナー様
API Gateway 全てのリクエストがAPI Gatewayを通る 共通処理とルーティング API Service クライアントからのリクエストとレスポンスの責任を持つ 裏側にある複数のマイクロサービスのアグリゲーション Backend Service 機能のロジックを実現する 14
API Gateway Backend Service API Gateway API Service Client インターネットからのリクエストを安全に内部に届ける
• TLS終端 + DDoS対策 (CDN, Google Cloud Load Balancing) • Request/Response buffering + Timeout • AuthN/AuthZ (認証認可プラットフォーム) • アクセスログ (データプラットフォーム) Why • 外部からのアクセスが最も重要 • 適切に扱うのが難しいため共通で処理 15
API Service Backend Service API Gateway API Service Client
クライアントとのメッセージに責任を持つ • リクエストバリデーション • バックエンドマイクロサービスのアグリゲーション • クライアントの互換性、ABテスト • 必要十分なレスポンス Why • 外部からのアクセスが最も重要 • 適切に扱うのが難しいため共通で処理 16
Backend Service Backend Service API Gateway API Service Client
担当ドメインに特化した機能の提供 • クライアント(リクエスト元)のコンテキストに依存しない機能 • 内部の実装のみを意識する • リクエストの認可はクライアントのコンテキストに応じて行う Why • 開発をドメインで閉じて行えるように 17
決済システムの一貫性管理 18
決済サービスを中心とした決済システム 決済 銀行 残高 あと払い 会計 NFC コード払い ネット決済 メルカリ
精算 Account Account Account キャンペーン 管理ツール 19
分散システムにおけるトランザクション 難しい • システムの数や状態が増えると単純に行うのは難しい • アドホックにデータ補正(バッチ処理)も可能だが… • 既知の手法(2PC,XA)や、分散コーディネーションもある 多様なシステム構成 •
システム間で協調するのは難しい(チームが異なる) • 外部システムもある • 中央でのトランザクション管理の方向へ 20
トランザクション管理の課題 複雑な支払方法 • 複数の支払手段 (メルペイ残高, ポイント, コンビニ, ATM, キャリア決済...) •
支払い手段の組み合わせ(残高+ポイント, 残高+ポイント+コンビニ) • 今後も更に複雑化する可能性が高い エラー処理も含めたモデルの一般化が必須 • エラー処理を例外として扱わない • アドホックなエラー処理は複雑性が爆発的にあがる 21
共通モデル プリミティブな操作 • お金は加算と減算で操作できる • 加算は常に成功する • 減算は不可能なときがある(残高不足など) リトライと冪等性 •
どんなエラーがでても基本的にリトライする • 冪等性を担保して二重処理されないようにする • 継続不可能なときのみ処理をやめる 22
Try/Confirm/Cancel 減算のインターフェイス • いきなり操作を確定させると都合が悪いことがある • 全てのシステムで減算ができることを確認してから確定したい • Try: 減算が成功するかどうかの確認と確保 •
Confirm: 確保しておいたものを確定 • Cancel: 確保しておいたものを開放 23
Try/Confirm/Cancelの例 決済 残高 ポイント 1. Try(成功) 決済 残高 ポイント 2.
Try(成功) 決済 残高 ポイント 3. Confirm(成功) 3. Confirm(成功) 決済 残高 ポイント 1. Try(成功) 決済 残高 ポイント 2. Try(失敗) 決済 残高 ポイント 3. Cancel(成功) 全てのTryが成功 一部のTryが失敗(ロールバック) ※ お金の移動先は省略 24
状態遷移によるトランザクションコーディネーション 状態遷移モデル • 処理の種類によって何をどの順番で行うか確定できる • あらゆる処理(システム)は意図せず途中で落ちることがある • 処理単位で状態を定義してどこまで処理が進んだかを記憶 • 途中で落ちても再開するだけで良い
ロールバックも状態遷移で定義 • 途中で継続不可能(Tryが失敗)した場合も遷移先が異なるだけ • Cancelを行う状態を定義して一貫したモデルで扱う 25
状態遷移の例 Start Try 残高 Try ポイント Confirm 残高 Confirm ポイント
Succeed Cancel 残高 Failed ※ お金の移動先は省略 26
決済と会計 決済とは口座間のお金の移動 • 移動なので全体で見るとプラスマイナスゼロ • 決済サービスで一貫して管理 • 決済以外も含めて全てのお金を扱う操作が対象 会計とはお金の移動に意味をつけること •
お金の移動ログ + 意味 で集計 • 移動ログを決済サービスが会計サービスに集約 • 意味はビジネスに依存するので各マイクロサービスが付与 27
会計データの連携 決済 銀行 残高 あと払い 会計 NFC コード払い ネット決済 メルカリ
Account Account Account キャンペーン 管理ツール Balance Sheet Transaction Log Accounting Details 28
リコンサイル データの整合性を確認すること • 会計データが完全な状態だということを保証する • 各マイクロサービスと会計システム間 バランスシート • 会計上でAさんは◯年△月□日X時Y分Z秒時点でいくらもっているか •
各口座で実際にその時点の残高が正しいか確認する 29
会計データの連携 決済 銀行 残高 あと払い 会計 NFC コード払い ネット決済 メルカリ
Account Account Account キャンペーン 管理ツール Balance Sheet Accounting Reconcilation Transaction Reconcilation Balance Reconcilation 30
精算 不確定なデータから確定済みデータを作ること • パートナーの残高は決済ごとに常に変動するが未確定データ • 手数料計算や決済を特定のタイミングで確定させる必要がある • 確定することで支払い可能なお金になる 31
精算 決済 銀行 残高 あと払い 会計 NFC コード払い ネット決済 メルカリ
精算 Account Account Account キャンペーン 管理ツール settlement 32
不正検知 33
お金に関わる不正検知 不正検知のポイント • ログイン • 入金 • 出金 今までのメルカリ •
ログイン: アカウント保護のため注力 • 入金: 該当するものがない(不正取引は別途注力) • 出金: 売上金の振込が重要 ※ もちろん広い意味で不正対策はこれだけではありません 34
メルペイでのお金に関わる不正検知 (ニア)リアルタイムな不正検知が重要 • 店舗でのお金が利用可能になったことで問題発生までが短い (出金) • 入金方法の追加(銀行など) • 総合的なお金の流れの不正を検知する必要がある 本人確認が重要
• お客さまが誰なのかを正確に知る必要がある • 反社会的勢力の排除 • 犯罪収益移転防止法(犯収法)準拠の本人確認 35
AML・CFT AML・CFT • マネーロンダリング及びテロ資金供与対策 • 金融庁からガイドラインがでている 疑わしい「取引」を見つけ出す • トランザクションモニタリング •
「疑わしい取引」を検知・報告・対策できるようにする 疑わしい「人」を見つけ出す • 個々のお客様に対して本人確認とリスク評価を行う • リスクに応じて取引を停止したりする必要がある 36
トランザクションモニタリング • ルールベースと機械学習ベースの両方で行っている • 決済サービスの処理をPubSubで受け取っている ルールベース • Splunkを利用 • 即時利用停止や目視での停止
• 金融庁へのレポーティング 37
トランザクションモニタリング 決済 サービス B Bridge Cloud Pub/Sub サービス A Transaction
Check 管理ツール FSA Kinesis Data Firehose Splunk Transaction Log Suspend Suspend Report Result 38
開発フロー 39
開発フロー Design Doc Dev Test Readiness Check Release Ops •
フロー自体はメルカリと共通 • メルペイでは各フェイズで追加のルールを設けている • より厳しいルールが求められるため 40
Design Doc Design Doc Dev Test Readiness Check Release Ops
• 開発を行う前にドキュメントを書き、チーム間でレビューする • 新しいマイクロサービス、機能開発時に行う 目的 • 事前にリスクを洗い出す(セキュリティ, リーガル, 会計) • チーム間での情報共有 メルカリとの違い • アーキテクト, SRE, セキュリティ, 関連チームからのレビュー必須 41
Development Design Doc Dev Test Readiness Check Release Ops •
マイクロサービスの開発 • 特に制約は無く割と自由(もちろんコードレビューやテストは必須) メルカリとの違い • (あえていえば) コストをかけてもより安全よりに • 一貫性と例外処理は高い水準で要求 • 意識的な話が強いのでSLOでの考え方に寄せていくべき 42
Test Design Doc Dev Test Readiness Check Release Ops •
QA, セキュリティテスト, 負荷テスト 目的 • リリース前に複数の観点で問題がないかを確認する • リリース判断のための証跡を残す メルカリとの違い • 第三者がテスト結果を検証(説明)可能な状態にする 43
Test - QA テストの観点 • マイクロサービスのAPI視点でのテスト • クライアント視点でのテスト テスト方法 •
マニュアルテストと自動テスト • Postman から Go へ移行中 44
Test - 負荷テスト 実施と結果 • 負荷試験環境で実施する • 目標性能を出せるかどうか、スケールするかどうかを確認 • 目標性能を出すための環境構成を記録
見積もり • 新規機能はリリース前に負荷試験が必須 • 目標性能の見積もりとその数値の根拠を残す 45
Production Readiness Check (PRC) Design Doc Dev Test Readiness Check
Release Ops • プロダクションレベルの品質にするためのチェック項目 • SLOなどもここで定義 目的 • ベースラインの品質を保証するため メルカリとの違い • 大きなリリースでは経営判断も別途行う 46
SLO (Service Level Objective) • サービスの安定性の指標としてSLOを重視 • メルペイとしてSLOの期待を守ることを必須にしている • 期待が高すぎる場合はSLOを下げる、低すぎる場合はあげる
• 期待はあっているのにSLOを下回る場合は改善する 標準的なSLOの例 • API単位で99%のlantecyが xxx ms以内 • APIのエラー率が 0.1%以下 47
Release Design Doc Dev Test Readiness Check Release Ops •
リリース可能と判断されたイメージのみがデプロイ可能 • カナリアリリースによる段階的デプロイ 目的 • 意図しないものをリリースできないように • 万が一の問題の最小化 メルカリとの違い • 特になし 48
Operations Design Doc Dev Test Readiness Check Release Ops •
マイクロサービスの運用は全て開発チーム自身が行う • アラートを受けるのも開発チーム 目的 • 権限の最小化、権限の分離のため メルカリとの違い • 本番環境に直接アクセスできるのはSREのみ(audit有) 49
めざしていくもの 50
メルカリとメルペイの違い • 最大化したい価値が異なる • どちらもシステムをより安定化させたいのは同じ より高い信頼性 その上で機能がある メルカリ 守るべきものは守り 強くチャレンジする
メルペイ 51
業界全体のレベルをあげるために メルペイの事例を公開 • 透明性と信頼性の向上 • 他社が参考にできるように • 逆に他社の事例を参考にして発展させていきたい 各社が協力してレベルをあげていく必要がある •
一部の会社がしっかりできていれば良いという状況ではない • もちろんメルペイが他社より優れているわけではない 52
参考リンク • マイクロサービス ◦ Merpay Microservices on Microservices Platform (Tech
Blog) ◦ メルペイにおけるマイクロサービスの構築と運用 (CloudNative Days Tokyo 2019) • 決済システム ◦ マイクロサービスにおける決済トランザクション管理 (Tech Blog) ◦ メルペイにおけるお客さま残高の管理手法 (Tech Blog) • AML/CFT ◦ メルペイのAML/CFTシステムを支える技術 (Tech Blog) ◦ AMLチームがどのようにメルペイのデータを Splunkに集め活用しているか (Tech Blog) 53