Slide 1

Slide 1 text

Session Title メルカードの常時ポイント還元 開発の裏側 Keita Suzuki Merpay Backend Engineer

Slide 2

Slide 2 text

Keita Suzuki / @keiitaj 2015年より株式会社Origamiに入社、スマートフォ ン決済サービスのコード決済機能や銀行連携の開 発に携わる。2020年2月、同社のメルカリグループ 参画により、株式会社メルペイへ入社。現在は、メ ルペイ全体のGrowthとメルカードの普及に向けた キャンペーン等のプロダクト開発を行う。 株式会社メルペイ Backend Engineer

Slide 3

Slide 3 text

Agenda メルカードの常時ポイント還元とは? 01 システム構成 02 Santaサービスのバックエンド開発 03 Growthの開発現場と、今後の展望 04

Slide 4

Slide 4 text

メルカードの 常時ポイント還元とは?

Slide 5

Slide 5 text

メルカードの常時ポイント還元とは?

Slide 6

Slide 6 text

主な機能 ● メルカードでお買い物した翌月の清算時にポイントを還元 ● メルカードを保持するお客さまに対し、メルカリ商品画面・決済通知・決済履 歴への付与予定ポイントを表示

Slide 7

Slide 7 text

主な機能 ● メルカードでお買い物した翌月の清算時にポイントを還元 ○ アプリから見えないところで非同期に処理 ● メルカードを保持するお客さまに対し、メルカリ商品画面・決済通知・決済履 歴への付与予定ポイントを表示 ○ アプリから見えるところで同期的に表示

Slide 8

Slide 8 text

主な機能 ● メルカードでお買い物した翌月の清算時にポイントを還元 ○ アプリから見えないところで非同期に処理 ● メルカードを保持するお客さまに対し、メルカリ商品画面・決済通知・決済履 歴への付与予定ポイントを表示 ○ アプリから見えるところで同期的に表示 Pub/Sub Subscriberの開発 APIの開発

Slide 9

Slide 9 text

主な機能 ポイント還元と、付与予定ポイント表示は、共通のロジックを持つ ● ご利用金額と還元率に応じてポイントを計算 ○ 変動するお客さまの還元率を決定 ● 還元条件を満たすかどうかの判定 ○ メルカードのステータス ■ 審査完了・初期設定済みが対象 ○ 決済加盟店の対象外判定 ■ 交通系を含む電子マネーへのチャージなどは対象外

Slide 10

Slide 10 text

システム構成

Slide 11

Slide 11 text

関連のマイクロサービス santa Kubernetes Engine Dependent microservices loyalty Kubernetes Engine defpay Kubernetes Engine payment Kubernetes Engine card Kubernetes Engine item-detail Kubernetes Engine payment-history Kubernetes Engine

Slide 12

Slide 12 text

関連のマイクロサービス Dependent microservices loyalty Kubernetes Engine defpay Kubernetes Engine payment Kubernetes Engine card Kubernetes Engine item-detail Kubernetes Engine payment-history Kubernetes Engine キャンペーンの管理・ポイント還元(本セッションの主役) santa Kubernetes Engine

Slide 13

Slide 13 text

関連のマイクロサービス Dependent microservices loyalty Kubernetes Engine defpay Kubernetes Engine payment Kubernetes Engine card Kubernetes Engine item-detail Kubernetes Engine payment-history Kubernetes Engine メルカード清算 お客さまのステージ管理 メルペイの決済 メルペイの決済履歴 santa Kubernetes Engine キャンペーンの管理・ポイント還元(本セッションの主役) メルカリの商品詳細 メルカードの発行・取引

Slide 14

Slide 14 text

関連のマイクロサービス Dependent microservices loyalty Kubernetes Engine defpay Kubernetes Engine payment Kubernetes Engine card Kubernetes Engine item-detail Kubernetes Engine payment-history Kubernetes Engine メルカード清算 お客さまのステージ管理 メルペイの決済 メルペイの決済履歴 santa Kubernetes Engine キャンペーンの管理・ポイント還元(本セッションの主役) メルカリの商品詳細 メルカードの発行・取引 gRPC APIやPub/Subで情報の受け渡し

Slide 15

Slide 15 text

関連のマイクロサービス Dependent microservices loyalty Kubernetes Engine defpay Kubernetes Engine payment Kubernetes Engine card Kubernetes Engine item-detail Kubernetes Engine payment-history Kubernetes Engine メルカード清算 お客さまのステージ管理 メルペイの決済 メルペイの決済履歴 santa Kubernetes Engine メルカリの商品詳細 メルカードの発行・取引 キャンペーンの管理・ポイント還元(本セッションの主役) gRPC APIやPub/Subで情報の受け渡し Growth Platform チームが開発の主担当

Slide 16

Slide 16 text

ポイント還元のシステム構成 kubernetes cluster Processing result of santa Give inserntive Pub/Sub Subscriber Pub/Sub Publisher defpay Kubernetes Engine Cloud Pub/Sub santa Kubernetes Engine payment Kubernetes Engine Dependent microservices Send notification notirication Kubernetes Engine card Kubernetes Engine loyalty Kubernetes Engine payment Kubernetes Engine gPRC gPRC

Slide 17

Slide 17 text

ポイント還元のシステム構成 kubernetes cluster Processing result of santa Give inserntive Pub/Sub Subscriber Pub/Sub Publisher defpay Kubernetes Engine Cloud Pub/Sub santa Kubernetes Engine payment Kubernetes Engine Dependent microservices Send notification notirication Kubernetes Engine card Kubernetes Engine loyalty Kubernetes Engine payment Kubernetes Engine gPRC gPRC ①メルカード請求の清算完了 ②清算済み請求情報を取得

Slide 18

Slide 18 text

ポイント還元のシステム構成 kubernetes cluster Processing result of santa Give inserntive Pub/Sub Subscriber Pub/Sub Publisher defpay Kubernetes Engine Cloud Pub/Sub santa Kubernetes Engine payment Kubernetes Engine Dependent microservices Send notification notirication Kubernetes Engine card Kubernetes Engine loyalty Kubernetes Engine payment Kubernetes Engine gPRC gPRC ①メルカード請求の清算完了 ②清算済み請求情報を取得 ③メルカードのステータス・決済加盟店情報を取得(還元対象判定のため) ④お客さまのステージを取得(還元率を決定するため)

Slide 19

Slide 19 text

ポイント還元のシステム構成 kubernetes cluster Processing result of santa Give inserntive Pub/Sub Subscriber Pub/Sub Publisher defpay Kubernetes Engine Cloud Pub/Sub santa Kubernetes Engine payment Kubernetes Engine Dependent microservices Send notification notirication Kubernetes Engine card Kubernetes Engine loyalty Kubernetes Engine payment Kubernetes Engine gPRC gPRC ①メルカード請求の清算完了 ②清算済み請求情報を取得 ③メルカードのステータス・決済加盟店情報を取得(還元対象判定のため) ④お客さまのステージを取得(還元率を決定するため) ⑥ポイントの付与と通知 ⑤還元対象の付与ポイント計算

Slide 20

Slide 20 text

付与予定ポイント表示のシステム構成 kubernetes cluster gRPC Server santa Kubernetes Engine gRPC Server item-detail Kubernetes Engine App(iOS, Android) API Gateway gateway-api Kubernetes Engine Dependent microservices gPRC gPRC card Kubernetes Engine loyalty Kubernetes Engine ①メルカリの商品金額を送信 (付与予定ポイントのリクエスト) gPRC

Slide 21

Slide 21 text

付与予定ポイント表示のシステム構成 kubernetes cluster gRPC Server santa Kubernetes Engine gRPC Server item-detail Kubernetes Engine App(iOS, Android) API Gateway gateway-api Kubernetes Engine Dependent microservices gPRC gPRC card Kubernetes Engine loyalty Kubernetes Engine ①メルカリの商品金額を送信 (付与予定ポイントのリクエスト) ②メルカードのステータスを取得 (還元対象判定のため) gPRC ③お客さまのステージを取得 (還元率を決定するため) ④ポイントを計算して付与予定ポイ ント・対象判定結果を返す

Slide 22

Slide 22 text

付与予定ポイント表示のシステム構成 kubernetes cluster gRPC Server santa Kubernetes Engine gRPC Server item-detail Kubernetes Engine App(iOS, Android) API Gateway gateway-api Kubernetes Engine Dependent microservices gPRC gPRC card Kubernetes Engine loyalty Kubernetes Engine ①メルカリの商品金額を送信 (付与予定ポイントのリクエスト) ②メルカードのステータスを取得 (還元対象判定のため) gPRC ③お客さまのステージを取得 (還元率を決定するため) ④ポイントを計算して付与予定ポイ ント・対象判定結果を返す ⑤還元対象者に付与予定ポイントを表示

Slide 23

Slide 23 text

Santaサービスの バックエンド開発

Slide 24

Slide 24 text

Cloud Spanner スキーマ CampaignID(PrimaryKey) キャンペーンID Name キャンペーン名称 StartAt キャンペーン開始日時 EndAt キャンペーン終了日時 UserFilters お客さまの還元対象判定フィルタ PaymentFilters 決済単位の還元対象判定フィルタ UpperLimit 還元上限 … Campaigns (Interleave: 親) CampaignStageRates (Interleave: 子) CampaignID(PrimaryKey) キャンペーンID Rate(PrimaryKey) ポイント還元率 StageRangeStart ステージ範囲の最小値 StageRangeEnd ステージ範囲の最大値 …

Slide 25

Slide 25 text

Cloud Spanner スキーマ Campaigns (Interleave: 親) CampaignStageRates (Interleave: 子) CampaignID Name StartAt EndAt UserFilters PaymentFilters UpperLimit aaa メルカード還元(メルカリでの購入) - - - - - CampaignID Rate StageRangeStart StageRangeEnd aaa 1.0 10 10 aaa 1.1 11 11 … … … … aaa 4.0 40 40

Slide 26

Slide 26 text

Cloud Spanner スキーマ ID(PrimaryKey) リワードID CampaignID キャンペーンID UserCustomerID お客さまのID PaymentID 決済ID Rate ポイント還元率 Amount ポイント還元額 … CampaignRewards

Slide 27

Slide 27 text

キャンペーンフィルタリング Campaigns CampaignID Name UserFilters PaymentFilters … aaa メルカード還元(メルカリでの購入) {mercard_status:[2,3]} {mercari_inner_payment:{}} … bbb メルカード還元(メルカリ以外のお買い物) {mercard_status:[2,3]} {mercari_outer_payment:{}, merchant:{shop_id:[xxx, xxx], Invert:true}} … UserFilters, PaymentFiltersにはJSON形式の文字列が格納される セットしたフィルタに応じて還元対象判定がチェックされる

Slide 28

Slide 28 text

キャンペーンフィルタリング Campaigns CampaignID Name UserFilters PaymentFilters … aaa メルカード還元(メルカリでの購入) {mercard_status:[2,3]} {mercari_inner_payment:{}} … bbb メルカード還元(メルカリ以外のお買い物) {mercard_status:[2,3]} {mercari_outer_payment:{}, merchant:{shop_id:[xxx, xxx], Invert:true}} … UserFilters, PaymentFiltersにはJSON形式の文字列が格納される セットしたフィルタに応じて還元対象判定がチェックされる メルカードステータス の判定

Slide 29

Slide 29 text

キャンペーンフィルタリング Campaigns CampaignID Name UserFilters PaymentFilters … aaa メルカード還元(メルカリでの購入) {mercard_status:[2,3]} {mercari_inner_payment:{}} … bbb メルカード還元(メルカリ以外のお買い物) {mercard_status:[2,3]} {mercari_outer_payment:{}, merchant:{shop_id:[xxx, xxx], Invert:true}} … UserFilters, PaymentFiltersにはJSON形式の文字列が格納される セットしたフィルタに応じて還元対象判定がチェックされる メルカードステータス の判定 メルカリ・メルカリ外と、 対象外加盟店の判定

Slide 30

Slide 30 text

ポイント還元のシーケンス

Slide 31

Slide 31 text

工夫したところ ポイントの還元率を、どちらのマイクロサービスで持つべきか?という議論が あった ● Loyaltyサービス ● Santaサービス Loyaltyを他のマイクロサービスに展開していく将来性を考え、 Loyaltyはお客さまのメルカリ行動実績によるステージアップ・ダウンと、ステー ジの管理のみを行う ステージに合わせた、お客さまへの対応は、各サービスに委ねる

Slide 32

Slide 32 text

工夫したところ ポイント還元(非同期処理)と、付与予定ポイント表示(同期処理)のユースケー ス。振る舞いはほぼ共通しているが、求められるSLOは異なる。 メルカリ商品詳細画面のRPSは高い リアルタイムの同期処理でLatencyが高まるのは致命的 ポイント計算のCalculatorはそれぞれ分けている ● 還元上限を考慮するCalculator ○ 過去の付与履歴をクエリするため負荷は高め、非同期処理のみで使 用 ● 還元上限を考慮しないCalculator ○ 同期処理で使用

Slide 33

Slide 33 text

工夫したところ 決済手段によって、加盟店IDが異なる場合があり、単一の加盟店IDでは判定 不可能 例)メルカリ上でのApple Pay(iD決済) メルカリとメルカリ以外で還元率が変わるため、メルカリ上のApple Payはメル カリで発生した決済として扱う 特定には、加盟店管理を行う他社パートナーさまから決済加盟店の情報を連 携いただく必要がある

Slide 34

Slide 34 text

Growthの開発現場と、 今後の展望

Slide 35

Slide 35 text

Growthの開発現場 メルカードの普及促進に向けたキャンペーン開催と追加開発

Slide 36

Slide 36 text

Growthの開発現場 サービスの運用改善 ● Loyaltyサービス ○ お客さま体験をより良くするためのステージ遷移ロジックの改善 ● Santaサービス ○ キャンペーンの引当金(付与予定ポイント)計算と、経理システムへの 連携を自動化 ○ 加盟店マスタサービスと連携し、決済手段ごと異なる加盟店IDを一つの マスタIDで判定

Slide 37

Slide 37 text

今後の展望 メルペイ単独ではなく、グループ全体のプロダクト・組織を横断し、連携を強化 メルカリグループの社内Growth基盤であるEGP(エンゲージメントプラット フォーム)を拡張し、システム統合を図る EGPに関しては、@Rupeshのセッション 「拡張性を備えたソフトウェア設計」を ご覧ください

Slide 38

Slide 38 text

No content