Slide 1

Slide 1 text

Bonfire Backend #3 静的MPM決済を支える技術

Slide 2

Slide 2 text

About me ● susho (@susho0220) ● Backend Engineer ● Codepayment Team at Merpay ● Go歴4年くらい ● 2018年までYahooでオブジェクトストレージ Dragonの開発に従事

Slide 3

Slide 3 text

静的MPMとは マイクロサービスアーキテクチャ 静的MPMにおける不整合対策 01 02 03 3 Agenda

Slide 4

Slide 4 text

静的MPMとは

Slide 5

Slide 5 text

静的MPMとは ● 静的MPM (Merchant-Presented Mode) ○ 店舗提示型の紙などに印刷された固定の QRコード ● Pros ○ 店舗はQRコードを配置するだけで導入可能 ○ POSなどが不要のためコストが安い ● Cons ○ QRコードが改ざんされる恐れがある。 ■ 改ざん防止のためにステッカーに印刷したり、決済時に音を出したり、結果を通知した り... ※QRコードは(株)デンソーウェーブの登録商標です。

Slide 6

Slide 6 text

2019.06.27にリリース(https://jp.merpay.com/news/2019/06/qr/)

Slide 7

Slide 7 text

メルペイの静的MPMの仕様 ● 国際ブランド6社からなる技術団体EMVCoによって策定された共通規格であるEMVを採用。 ● QRコードのEncode/Decodeには、自社で開発した OSSライブラリを利用。 ○ mercari/go-emv-code ※EMV® is a registered trademark in the U.S. and other countries and an unregistered trademark elsewhere. The EMV trademark is owned by EMVCo, LLC.

Slide 8

Slide 8 text

マイクロサービスアーキテクチャ

Slide 9

Slide 9 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 10

Slide 10 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 11

Slide 11 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 12

Slide 12 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 13

Slide 13 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 14

Slide 14 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 認証トークン生成 トークン検証用鍵同期 Google Cloud Load Balancer 全Microservice はトークン検証用 の鍵から伝搬さ れた認証トークン を検証する QRコード解釈 決済処理

Slide 15

Slide 15 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 16

Slide 16 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 17

Slide 17 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成 QRコード解釈 決済処理

Slide 18

Slide 18 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 QRコード解釈 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成

Slide 19

Slide 19 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 QRコード解釈 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成

Slide 20

Slide 20 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 QRコード解釈 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成

Slide 21

Slide 21 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 QRコード解釈 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成

Slide 22

Slide 22 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 QRコード解釈 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成

Slide 23

Slide 23 text

StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner Service Notification Service Transaction Service Payment Service プロトコル変換 ルーティング 認証 etc... アグリゲーション 通知処理 決済共通処理 店舗情報取得 決済処理 QRコード解釈 決済処理 トークン検証用鍵同期 Google Cloud Load Balancer 認証トークン生成

Slide 24

Slide 24 text

決済シーケンス Mercari App Merpay API StaticMPM Service 4. QRコード解釈, 店舗情報取 得, セッショントークン生成 7. 購入画面表示 11. セッショントークン検 証, 決済処理, 通知処理 14. 完了画面表示 1. QRコード読み取り 2. セッション生成リクエスト 3. セッション生成リクエスト 5. 店舗情報, セッショントークン 6. 店舗情報, セッショントークン 8. 金額入力, 購入 9. 決済リクエスト 10. 決済リクエスト 12. 13.

Slide 25

Slide 25 text

StaticMPM Service ● 静的MPM決済のドメインに関する Microservice ● 機能詳細 ○ QRコード解釈 ■ 前述の mercari/go-emv-code を利用。 ■ 今後様々なQRコード仕様に対応する可能性があり、拡張性を高くするためバックエンド 側で処理する。 ○ セッショントークン管理 ■ アプリでQRコードを読み取った後、一定期間のみ決済可能とする仕組み。 ● 有効期限を設けることでお客さまの誤決済を防ぐ。 (e.g. QRコードを読み取った 後、画面を一定期間放置した場合は決済できないようにする。 ) ○ 決済処理 ■ 各Microservicesとやりとりして、決済処理に必要な店舗情報の取得、決済処理、決済 完了通知処理など、静的 MPMの決済ドメインに沿った各処理を実行する。 ● ここの設計をミスると容易に不整合が発生してしまうし難しい ... ● マイクロサービスにおける決済トランザクション管理

Slide 26

Slide 26 text

静的MPMにおける不整合対策

Slide 27

Slide 27 text

静的MPMによる不整合対策 ● 冪等性 ○ クライアントは同じリクエストを繰り返し呼ぶことができ、同じレスポンスが返ってくる。 ■ メルペイでは、クライアントは Idempotency KeyというUUIDをリクエストに付与する。 ● Write repair ○ 通信先のMicroserviceやネットワークに一時的な障害などがあった場合、クライアントは同じリ クエストでリトライすることで、不整合をオンデマンドに修復することができる。 ■ Timeouts & Retries (grpc_retryを利用) ● Asynchronous repair ○ Write repairで修復できなかった場合に、非同期で Microservices間の最終的な状態をチェック し、もし不整合が発生していた場合はあるべき状態へ修復する。 ■ バッチ処理による定期実行。 (TBD: Pub/Subによるイベント駆動な設計にして、よりス ケールするように修正する予定 )

Slide 28

Slide 28 text

Write repair StaticMPM Service Transaction Service Payment Service 決済リクエスト Idempotency key: xxx 決済リクエスト Idempotency key: yyy yyy生成、DBへトランザクションのステータスを Initialで 書き込み

Slide 29

Slide 29 text

Write repair StaticMPM Service Transaction Service Payment Service 決済リクエスト Idempotency key: xxx 決済リクエスト Idempotency key: yyy yyy生成、DBへトランザクションのステータスを Initialで 書き込み

Slide 30

Slide 30 text

Write repair StaticMPM Service Transaction Service Payment Service 決済リクエスト Idempotency key: xxx 決済リクエスト Idempotency key: yyy yyy生成、DBへトランザクションのステータスを Initialで 書き込み リトライ Idempotency key: xxx タイムアウト

Slide 31

Slide 31 text

Write repair StaticMPM Service Transaction Service Payment Service 決済リクエスト Idempotency key: xxx リトライ Idempotency key: xxx 決済リクエスト Idempotency key: yyy yyy生成、DBへトランザクションのステータスを Initialで 書き込み DBからyyy取得 タイムアウト

Slide 32

Slide 32 text

Write repair StaticMPM Service Transaction Service Payment Service 決済リクエスト Idempotency key: xxx リトライ Idempotency key: xxx 決済リクエスト Idempotency key: yyy 決済リクエスト Idempotency key: yyy タイムアウト yyy生成、DBへトランザクションのステータスを Initialで 書き込み DBへトランザクションのステータスを Authorizedで書き 込み DBからyyy取得

Slide 33

Slide 33 text

Asynchronous repair Transaction Service Payment Service 一定期間経ってもステータスが Initialなトランザク ションをDBから定期的にスキャン 対象のトランザクションの状態を取得 1. Authorizedなら、決済取り消しリクエストを 発行し、対象のトランザクションのステー タスをFailedにする 2. Not FoundやNot Authorizedなステータス なら、対象のトランザクションを Failedにす る

Slide 34

Slide 34 text

課題 ● これらの機能を各Microservicesのアプリケーションコードに実装しなければならない。 ● 通信元/先のネットワーク遅延や分断といった状態を再現してテストするのが難しい。 ○ iptablesで擬似的にパケット遅延を発生させたり ... ○ e.g.) Testing distributed systems in Go

Slide 35

Slide 35 text

試してみたいこと
 ● Envoy によるサービスメッシュの導入 
 ○ Timeouts & Retries 
 ○ Fault Injection
 ○ etc...


Slide 36

Slide 36 text

まとめ

Slide 37

Slide 37 text

まとめ ● mercari/go-emv-code を使うとEMV規格のQRコードのEncode/Decodeができるのでぜひ使ってみ てください。 ● サービスメッシュの登場により、 Microservices間の不整合対策の実装やテストなどやりやすくなって きていそうなので導入していきたい。

Slide 38

Slide 38 text

No content