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
6.8k
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
2.9k
PHPStanで始める継続的静的解析 #phperkaigi /php-static-analysis
hirak
13
50k
極める!メソッドチェーン #phpstudy / fluent-interface
hirak
8
2.5k
evalこそパワー #phpkansai / phpkansai2017
hirak
2
1.3k
PHPのエラーと例外再入門 / php-error-and-exception
hirak
19
18k
メルカリ JP Tech Side / mercari-jp-tech-side
hirak
7
1.7k
グローバル展開を支える量子的なサービス設計 #mercariday / mercariday2017-api
hirak
22
13k
Composerプラグインを作ってみよう /phpcon2016
hirak
5
14k
packagist.jpの紹介と新機能 /#phpblt
hirak
4
2.5k
Other Decks in Technology
See All in Technology
プロデザ! BY リクルートvol.17_『じゃらんnet』公式アプリの高速リニューアル事例を大公開
recruitengineers
PRO
5
110
滑空スポーツ講習会2023 航空安全講習会 第4回 日常整備に役立ちそうな雑情報 / JSA Safety Seminar 2023 glider maintenance
jsaseminar
0
110
We Fear Change, for DevOpsDays LA 2024
cote
PRO
0
130
最速思考でバクラク品質を! スタートアップのリアルな課題とQAの実践
nakanao
1
440
出張! #DevelopersIO IT技術ブログの中の人が語る勉強会 「【速報】AWSの生成AIサービスであるAmazon Bedrock がリリースされたので朝イチで触ってみた」について語る
oshanqq
0
290
イベント駆動コンテンツ (a.k.a Webアプリケーションの効率を再定義するBEAR.Sundayの分散キャッシングフレームワーク)
koriym
4
1.7k
Command-line interface tool design / PHPerKaigi 2024
k1low
4
1k
すべてが #Zenoh になる
takasehideki
0
100
Exadata Database Service on Dedicated Infrastructure(ExaDB-D) UI スクリーン・キャプチャ集
oracle4engineer
PRO
0
1.1k
スプリント内で試験を完了させるには?アジャイル・スクラム開発に参加したQAエンジニアの悩みと対策
cybozuinsideout
PRO
1
110
パフォーマンスを改善するには仕様変更が1番はやい
yamamotohiroya
12
4.6k
二刀流でWinActorを活用してみた話
tamai_63
0
120
Featured
See All Featured
Bash Introduction
62gerente
604
210k
Principles of Awesome APIs and How to Build Them.
keavy
119
16k
Unsuck your backbone
ammeep
660
56k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
225
51k
Infographics Made Easy
chrislema
237
17k
StorybookのUI Testing Handbookを読んだ
zakiyama
10
4.4k
A Modern Web Designer's Workflow
chriscoyier
689
190k
Building Your Own Lightsaber
phodgson
97
5.6k
It's Worth the Effort
3n
180
27k
What’s in a name? Adding method to the madness
productmarketing
PRO
14
2.5k
Practical Orchestrator
shlominoach
180
9.6k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
18
1.8k
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に圧倒的感謝 •
珉珉六本木店のチャーハン餃子 セット