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
iD決済を支える技術 / #merpay_techtalk
Search
Hiraku NAKANO
March 27, 2019
Technology
33
7k
iD決済を支える技術 / #merpay_techtalk
https://mercari.connpass.com/event/124342/
Hiraku NAKANO
March 27, 2019
Tweet
Share
More Decks by Hiraku NAKANO
See All by Hiraku NAKANO
github.com/mercari の今と昔 /github-mercari
hirak
8
3k
PHPStanで始める継続的静的解析 #phperkaigi /php-static-analysis
hirak
14
52k
極める!メソッドチェーン #phpstudy / fluent-interface
hirak
8
2.7k
evalこそパワー #phpkansai / phpkansai2017
hirak
2
1.5k
PHPのエラーと例外再入門 / php-error-and-exception
hirak
19
19k
メルカリ JP Tech Side / mercari-jp-tech-side
hirak
7
1.9k
グローバル展開を支える量子的なサービス設計 #mercariday / mercariday2017-api
hirak
22
13k
Composerプラグインを作ってみよう /phpcon2016
hirak
5
14k
packagist.jpの紹介と新機能 /#phpblt
hirak
4
2.7k
Other Decks in Technology
See All in Technology
OCI技術資料 : ファイル・ストレージ 概要
ocise
3
12k
Oracle Base Database Service:サービス概要のご紹介
oracle4engineer
PRO
1
16k
Formal Development of Operating Systems in Rust
riru
1
390
三菱電機で社内コミュニティを立ち上げた話
kurebayashi
1
300
#TRG24 / David Cuartielles / Post Open Source
tarugoconf
0
470
普通のエンジニアがLaravelコアチームメンバーになるまで
avosalmon
0
670
Copilotの力を実感!3ヶ月間の生成AI研修の試行錯誤&成功事例をご紹介。果たして得たものとは・・?
ktc_shiori
0
230
AI×医用画像の現状と可能性_2024年版/AI×medical_imaging_in_japan_2024
tdys13
1
1.2k
OPENLOGI Company Profile
hr01
0
58k
最近のSfM手法まとめ - COLMAP / GLOMAPを中心に -
kwchrk
8
1.8k
Alignment and Autonomy in Cybozu - 300人の開発組織でアラインメントと自律性を両立させるアジャイルな組織運営 / RSGT2025
ama_ch
1
1.9k
深層学習と3Dキャプチャ・3Dモデル生成(土木学会応用力学委員会 応用数理・AIセミナー)
pfn
PRO
0
420
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
137
6.7k
Reflections from 52 weeks, 52 projects
jeffersonlam
348
20k
Designing on Purpose - Digital PM Summit 2013
jponch
116
7k
How STYLIGHT went responsive
nonsquared
96
5.3k
Statistics for Hackers
jakevdp
797
220k
Building an army of robots
kneath
302
44k
Into the Great Unknown - MozCon
thekraken
34
1.6k
Scaling GitHub
holman
459
140k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Being A Developer After 40
akosma
89
590k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
26
1.9k
Unsuck your backbone
ammeep
669
57k
Transcript
@hiraku iD決済を支える技術(server side) ※「iD」は株式会社NTTドコモの商標です
@hiraku (中野 拓) • 2015年12月 メルカリにPHPエンジニアとしてJoin ◦ Composerを速くする趣味 • 2018年2月
メルペイに異動 ◦ 最初はPHPコードの改修をやってた ◦ 4月~ bank-service(銀行接続) ◦ 9月~ nfc-serviceほぼ専属に • 2019年2月 iD決済リリース!!
リリースした今なら言える ネタばらし色々
目次 1. iD決済(メルペイ電子マネー) 2. システム構成 3. フレームワーク談義 4. microservicesのつらいところ
iD決済(メルペイ電子マネー)
None
• メルカリの売上金を使って買い物できる • iOS→Apple Pay • Android→おサイフケータイ ◦ iDがauのスマホでも使えるという熱々 ポイント
• バックエンド側の開発がうちのチーム
NFC決済の特徴 • Pros ◦ 全国80万箇所+で使える!(iDとの提携) ◦ 決済体験のスムーズさ ◦ Apple Payを経由するとSuicaチャージやアプリ内決済にも
◦ 3大キャリア x iOS/Android 全部使える • Cons ◦ 加盟店側にNFCリーダーが必要 ◦ 加盟店側に決済手数料が… (※コード払いとの比較) ◦ スマホがFeliCa対応でないと使えない
NFC決済を使うまでの道のり 1. Virtual Cardを発行する a. クレカではなくプリペイドカードの扱い b. 発行自体は三井住友カード社のシステムで行う 2. Device-PANを発行して端末のチップに書き込む
1. レジ端末にピッとかざすと、店舗側のネットワークから経由して メルペイに通信が来る 2. 残高が足りていればOKを返して、決済が成功する
電子マネーのタイプ • サーバー管理型プリペイドのバーチャルカード(物理板はない) • メルペイ側で全てのvalue(売上金 or ポイント)を管理 ◦ 決済ごとにメルペイに通信して、相当額を「チャージ」して即座 に使っている
◦ 自動販売機やガソリンスタンドなど、店舗の端末がオフラインだ と使えない ◦ 逆にiPhone/Androidは機内モードやオフラインでもOK
システム構成
"メルペイがmicroservicesを採用し たのは、他に選択肢がなかったから" by @kazegusuri (merpay architect)
メルペイのシステムの前提 • 多くのシステムを同時に作る必要があった ◦ コード払い ◦ あと払い ◦ メルカリ内決済 ...etc
• microservicesを採用して、各チームで試行錯誤するしかなかった →NFC決済システムも、専用serviceとして作成することに
NFC決済を実現するために必要だったもの • 主な機能はSMCC社のシステムで実現できた • 登録系 1. メルカリ会員 ⇔ カード の管理
2. 端末プロビジョニングに必要なAPIをproxyして、ユーザー認証を 正しく実装する • 決済利用系 1. SMCC社から来る承認リクエストを受けて、即座に結果を返す
nfc-service merpay-gateway registration / provisioning nfc-serviceが不要な一部機能の実装 関係するmicroservices merpay-gateway nfc-api merpay-api
payment, balance, etc charge (決済利用) SMCC (カード発行& 管理) POS casher registration (登録) user_id ⇔ cardのDB保持 リクエストの翻訳 アクセス元の認証 mercari-api SMS認証 電話番号参照
nfc-serviceの中身 DB (Cloud Spanner) Kubernetes • コンテナイメージは一種類、Goのビルド結果が入ってる ◦ grpc-server +
Pub/Subのsubscriber ◦ batch • k8s Deployment ... grpc-server + subscriber ◦ Autoscalerも有効にしてある • k8s CronJob ... batch • k8s ConfigMap ... 他serviceのアドレスなどの設定 • k8s Secret ... 秘匿性の高い鍵など • DataDogでメトリクス収集、監視 Cloud Pub/Sub
nfc-serviceのk8s.yaml $ grep 'kind:' k8s.yaml kind: Deployment kind: ConfigMap kind:
Service kind: CronJob kind: CronJob kind: CronJob kind: CronJob kind: CronJob kind: CronJob kind: CronJob kind: CronJob kind: CronJob
バッチ…
バッチ度の高いkubernetesアプリケーション • カードのバッチ発行 ◦ リアルタイムには発行済のカードから割り当てるだけにする • 発行依頼→発行→取り込み (全部バッチ…) • 売上の日次確定処理
• microservice同士の不整合の検知と修復batch • etc... • etc... • でも何とかなってるのでKubernetesすごい
デプロイの関係 • 「バッチが動いてるときにデプロイして良いんだっけ?」 →CronJobはPodを生成して動きはじめるので、Deploymentを上書 きしても支障はない • その他のデプロイ時の細かい問題はSpinnakerが吸収している ◦ ConfigMapに自動でversion切るとか
フレームワーク談義
"フレームワークはプロジェクトの初 期の段階では便利ですが、フレーム ワークに付加された複雑さにより 長期の保守が難しくなります" プログラミング言語Go P223より
gRPCサーバーを作る必要があったので • google.golang.org/grpc を素朴に使って実装していく • interceptorを使って抽象化 ◦ Webフレームワークだとmiddlewareって呼ばれるような機構 ◦ 内製interceptorがいっぱいある
◦ 認証 ◦ ログ ◦ DataDog • ロガーは zap が実質標準
ソースツリー雰囲気 • cmd/server/main.go • grpc/server.go ... gRPCサーバーのinterceptor組み立て • grpc/charge/ ...
決済系のgRPCサービスコード • grpc/registration/ ... 登録系のgRPCサービスコード • usecase/ ... ドメインロジック本体色々 • model/ ... Entity. DBに記録される構造 • repository/ ... DB操作色々
困ったこと • grpc-serverは割と作法が固まってて悩みにくかった ◦ エラーコードがHTTPと違うのには未だ慣れないが… • batchとpubsubのsubscriberは、自己流… • batch系とserver系でコードの重複があるけど、うまく抽象化できて いない
microservicesのつらいところ
他serviceとの整合性
こういうタイムアウトが困る nfc payment 決済処理して nfc payment ...返事がない 打ち切ろう 実は成功して ました
不整合はどこにでも起きうる • nfcとpayment ◦ 「決済失敗したって返したけど、実は成功してました」 →クライアントが失敗を受けてリトライすると、 二重決済になる! • nfcとSMCCシステム •
etc... • microservicesはDBを共有しない = DBトランザクションが使えない
こうやって解決 nfc payment 決済処理して nfc payment ...返事がない 打ち切ろう 実は成功して ました
決済指示を 記録 打ち切りを 記録 nfc repairer payment側の最終状態を確認 不整合は取り消しを実行、自動修復
いわゆるジャーナリングと冪等性によるリトライ • 全ての処理は一意なidを振り、なるべく冪等になるように作る • いつでも気軽にリトライできるようにする • 不整合は別プロセスが復旧していく • 泥臭いけど、仕方ない •
これって、一般的なDB製品が備えているトランザクションの基礎技術 そのものだよね…? • 最終的に問題のない状態へ収束するように作る
まとめと総括
この一年どうだった? • 4月になるまでGoもk8sもガッ ツリ開発に使ったことなかった ◦ 手探りで進まない無力感 • チームメンバー、SREや Architectに圧倒的感謝 •
珉珉六本木店のチャーハン餃子 セット