Upgrade to Pro — share decks privately, control downloads, hide ads and more …

静的MPM決済を支える技術 / #yjbonfire

Eff335185b3defb426569def9f0a12a9?s=47 susho
July 24, 2019

静的MPM決済を支える技術 / #yjbonfire

Eff335185b3defb426569def9f0a12a9?s=128

susho

July 24, 2019
Tweet

More Decks by susho

Other Decks in Technology

Transcript

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

  2. About me • susho (@susho0220) • Backend Engineer • Codepayment

    Team at Merpay • Go歴4年くらい • 2018年までYahooでオブジェクトストレージ Dragonの開発に従事
  3. 静的MPMとは マイクロサービスアーキテクチャ 静的MPMにおける不整合対策 01 02 03 3 Agenda

  4. 静的MPMとは

  5. 静的MPMとは • 静的MPM (Merchant-Presented Mode) ◦ 店舗提示型の紙などに印刷された固定の QRコード • Pros

    ◦ 店舗はQRコードを配置するだけで導入可能 ◦ POSなどが不要のためコストが安い • Cons ◦ QRコードが改ざんされる恐れがある。 ▪ 改ざん防止のためにステッカーに印刷したり、決済時に音を出したり、結果を通知した り... ※QRコードは(株)デンソーウェーブの登録商標です。
  6. 2019.06.27にリリース(https://jp.merpay.com/news/2019/06/qr/)

  7. メルペイの静的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.
  8. マイクロサービスアーキテクチャ

  9. StaticMPM Service Overview Merpay Gateway Merpay API Authority Service Partner

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    得, セッショントークン生成 7. 購入画面表示 11. セッショントークン検 証, 決済処理, 通知処理 14. 完了画面表示 1. QRコード読み取り 2. セッション生成リクエスト 3. セッション生成リクエスト 5. 店舗情報, セッショントークン 6. 店舗情報, セッショントークン 8. 金額入力, 購入 9. 決済リクエスト 10. 決済リクエスト 12. 13.
  25. StaticMPM Service • 静的MPM決済のドメインに関する Microservice • 機能詳細 ◦ QRコード解釈 ▪

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

  27. 静的MPMによる不整合対策 • 冪等性 ◦ クライアントは同じリクエストを繰り返し呼ぶことができ、同じレスポンスが返ってくる。 ▪ メルペイでは、クライアントは Idempotency KeyというUUIDをリクエストに付与する。 •

    Write repair ◦ 通信先のMicroserviceやネットワークに一時的な障害などがあった場合、クライアントは同じリ クエストでリトライすることで、不整合をオンデマンドに修復することができる。 ▪ Timeouts & Retries (grpc_retryを利用) • Asynchronous repair ◦ Write repairで修復できなかった場合に、非同期で Microservices間の最終的な状態をチェック し、もし不整合が発生していた場合はあるべき状態へ修復する。 ▪ バッチ処理による定期実行。 (TBD: Pub/Subによるイベント駆動な設計にして、よりス ケールするように修正する予定 )
  28. Write repair StaticMPM Service Transaction Service Payment Service 決済リクエスト Idempotency

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

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

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

    key: xxx リトライ Idempotency key: xxx 決済リクエスト Idempotency key: yyy yyy生成、DBへトランザクションのステータスを Initialで 書き込み DBからyyy取得 タイムアウト
  32. 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取得
  33. Asynchronous repair Transaction Service Payment Service 一定期間経ってもステータスが Initialなトランザク ションをDBから定期的にスキャン 対象のトランザクションの状態を取得

    1. Authorizedなら、決済取り消しリクエストを 発行し、対象のトランザクションのステー タスをFailedにする 2. Not FoundやNot Authorizedなステータス なら、対象のトランザクションを Failedにす る
  34. 課題 • これらの機能を各Microservicesのアプリケーションコードに実装しなければならない。 • 通信元/先のネットワーク遅延や分断といった状態を再現してテストするのが難しい。 ◦ iptablesで擬似的にパケット遅延を発生させたり ... ◦ e.g.)

    Testing distributed systems in Go
  35. 試してみたいこと
 • Envoy によるサービスメッシュの導入 
 ◦ Timeouts & Retries 


    ◦ Fault Injection
 ◦ etc...

  36. まとめ

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

  38. None