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

500万ユーザーを支える残高の冪等性 / The idempotency of the balance for 5 million Merpay users

Fd1ded499f7831ddb01b0d23eb9b64c2?s=47 Kenshi Kamata
December 18, 2019

500万ユーザーを支える残高の冪等性 / The idempotency of the balance for 5 million Merpay users

Tech Talk vol.2 Backend Engineer 〜マイクロサービスの冪等性〜 (https://mercari.connpass.com/event/157009/) での発表資料

Fd1ded499f7831ddb01b0d23eb9b64c2?s=128

Kenshi Kamata

December 18, 2019
Tweet

Transcript

  1. knsh14
 500万ユーザーを支える残高の冪等性


  2. 鎌田健史(@knsh14)
 • Merpay Backend Engineer
 • Payment Platform team
 2

    自己紹介

  3. 残高を管理するマイクロサービス 01 残高を管理するAPIの冪等性 02 冪等性をもたせるときに考えること 03 3 アジェンダ


  4. 残高管理マイクロサービスの紹介
 4

  5. Open SKT から紹介
 • https://speakerdeck.com/kazegusuri/builderscon-tokyo-2019-open-s kt 
 • https://builderscon.io/tokyo/2019/session/c50caef7-a858-43c6-adc a-de4341094d4a

    
 • メルペイのアーキテクチャについての神解説
 
 5 残高管理マイクロサービスの紹介

  6. 残高管理サービス
 • https://speakerdeck.com/kazegusuri/builderscon-tokyo-2019-open-s kt?slide=17 
 • https://speakerdeck.com/kazegusuri/builderscon-tokyo-2019-open-s kt?slide=19 
 •

    決済のドメイン機能の一部を構成している
 6 残高管理マイクロサービスの紹介

  7. 残高管理マイクロサービス(Balance Service)の特徴
 • 使っているDBはCloud Spanner
 • 外部のサービスや他のマイクロサービスに依存してない
 • Delete 操作はなくて

    Read / Insert / Update のみ
 • かなりシンプルな存在
 7 残高管理マイクロサービスの紹介

  8. Balance Service の冪等性
 8

  9. 冪等性があるAPI
 01 02 お客様の残高を追加や消費 冪等性がないAPI
 お客様の現在の残高を取得 消費の履歴を取得 9 Balance Service

    の冪等性

  10. 冪等性があるAPI
 • ある取引は最初に成功した1度だけ処理される
 • 1度成功すれば同じリクエストを何回繰り返しても内部的には処理され ない
 • 何度リクエストしてもレスポンスは同じものが返ってくる
 • 何度でもリトライできる


    10 Balance Service の冪等性

  11. 冪等性があるAPI
 • リクエストの取引IDが保存されていれば既に行われた取引である
 • リクエスト内容をチェックして結果を返す
 ◦ 偶然同じ取引IDになっても弾けるように 11 Balance Service

    の冪等性

  12. 冪等性キーが同じ
 01 02 03 外部から指定される取引ID 残高の種類が同じ
 ポイント/メルペイ残高など
 操作する額が同じ
 ポイントがP〇〇 メルペイ残高が¥△△

    12 Balance Service の冪等性

  13. 冪等なレスポンス
 • レスポンスはDBから引ける情報で組み立てる
 • 取引IDから引ける情報
 ◦ 取引後の残高などは返さない 13 Balance Service

    の冪等性

  14. 冪等なAPIでのエラー
 • エラーはリクエストする側にリトライさせるか決める材料になる
 • リトライしても良いエラー
 ◦ タイムアウトなど • リトライしても意味がないエラー
 ◦

    そもそも残高不足など 14 Balance Service の冪等性

  15. 冪等性を持たせるときに考えること
 15

  16. 誰がどう使うのか?
 冪等になるためのリクエスト
 01 02 16 冪等性を持たせるときに考えること


  17. 誰がどう使うのか?
 • リクエストを投げる側の使い方1つで簡単に冪等性は壊れる
 • どういう情報でリクエストするのか、どうやってリトライするのか
 17 冪等性を持たせるときに考えること


  18. 冪等にするためのリクエスト
 • UUID 使っとけば OK やろ?みたいな話ではない
 • 自分のマイクロサービスをよく考えて決める
 18 冪等性を持たせるときに考えること


  19. 冪等性のための要素はドメイン次第
 Balance Serviceではリクエスト内容
 まで含めた情報で冪等になる
 自分だけでは冪等性は守れないので
 コミュニケーション大事
 01 02 03 19

    まとめ

  20. おわり
 20