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

メルコインにおけるシステム間のデータ分離を実現するための通信アーキテクチャ / Communication Architecture for Implementing Data Separation Between Systems at Mercoin

mercari
October 14, 2023

メルコインにおけるシステム間のデータ分離を実現するための通信アーキテクチャ / Communication Architecture for Implementing Data Separation Between Systems at Mercoin

メルコインでは、データプライバシーの観点からメルカリ・メルペイと異なるユーザーIDを用いています。しかし同時に、メルコインのシステムはメルカリ・メルペイのシステムに依存しており、ユーザーを特定してシステム間の通信を行う必要があります。これらの制約の中で私たちがどのようにシステム間通信のアーキテクチャを設計したのかについてお話しします。

When dealing with Mercoin, from the perspective of protecting data privacy, Mercoin uses different user IDs than Mercari or Merpay. At the same time, Mercoin’s system depends on Mercari and Merpay’s systems, and it’s necessary to specify the user in order to communicate between the different systems. In this session, we’ll talk about how we designed the system architecture for communicating between systems amid these restrictions.

------
Merpay & Mercoin Tech Fest 2023は3日間のオンライン技術カンファレンスです。
IT企業で働くソフトウェアエンジニアおよびメルペイ・メルコインの技術スタックに興味がある方々を対象に2023年8月22日(火)、23日(水)、24日(木)の3日間、開催します。 Merpay & Mercoin Tech Fest は事業との関わりから技術への興味を深め、プロダクトやサービスを支えるエンジニアリングを知ることができるお祭りです。

今年のテーマは「Unleash Fintech」。 メルペイ・メルコインのこれまでの技術的な取り組みはもちろん、メルカリグループのFintech事業における新たな挑戦をお伝えします。 セッションでは事業を支える組織・技術・課題などへの試行錯誤やアプローチなど多面的にご紹介予定です。

メルペイ・メルコインが今後どのようにUnleash(解放)していくのか、ぜひ見に来てください。

■イベント関連情報
- 公式ウェブサイト:https://events.merpay.com/techfest-2023/
- 申し込みページ:https://mercari.connpass.com/event/286670/
- Twitterハッシュタグ: #MerpayMercoinTechFest
■リンク集
- メルカリ・メルペイイベント一覧:https://mercari.connpass.com/
- メルカリキャリアサイト:https://careers.mercari.com/
- メルカリエンジニアリングブログ:https://engineering.mercari.com/blog/
- メルカリエンジニア向けTwitterアカウント:https://twitter.com/mercaridevjp
- 株式会社メルペイ:https://jp.merpay.com/

mercari

October 14, 2023
Tweet

More Decks by mercari

Other Decks in Technology

Transcript

  1. 内部用IDと外部用ID サービス サービス メルコイン メルカリ/メルペイ 内部用ID (UserID) 内部用ID (UserID) 外部用ID

    (PPID) 外部用ID (PPID) Mercari Engineering Portal: Applying OAuth 2.0 and OIDC to first-party services (https://engineering.mercari.com/en/blog/entry/20230130-applying-oauth-2-0-and-oidc-to-first-party-services/)
  2. 内部用IDと外部用ID サービス サービス メルコイン メルカリ/メルペイ Mercari/Merpay UserID Mercoin UserID Mercoin

    PPID Mercari/Merpay PPID Mercari Engineering Portal: Applying OAuth 2.0 and OIDC to first-party services (https://engineering.mercari.com/en/blog/entry/20230130-applying-oauth-2-0-and-oidc-to-first-party-services/)
  3. ID変換のステップ 1. メルコインのサービス側で Mercoin UserID を Mercoin PPID に 変換してリクエストを送る。

    2. メルカリ/メルペイのサービスでは、受け取った Mercoin PPID を Mercari UserID に変換して処理する。 3. 処理結果に含まれる Mercari UserID を Mercoin PPID に変換し てレスポンスを返す。 4. レスポンスを受け取ったメルコイン側のサービスは Mercoin PPID を Mercoin UserID に変換してから処理を行う。
  4. Protobuf メッセージに含まれるIDの変換 • Protobuf のメッセージとID変換の向きを渡すと ◦ メッセージの中に含まれるすべてのIDを変換して値を置き換える。 • 「どのフィールドに値が含まれるか」は Custom

    Option を使って proto ファ イルの中でアノテーションを行う。 func (c *ProtoMessageConverter) ConvertPPIDsToUserIDs( ctx context.Context, message proto.Message ) error func (c *ProtoMessageConverter) ConvertUserIDsToPPIDs( ...
  5. CustomOption によるアノテーション package microservice_a; message GetUserRequest { string user_id =

    1 [ (user_id.conversion).enable = true ]; } message GetUserResponse { string user_id = 1 [ (user_id.conversion).enable = true ]; string name = 2; int32 age = 3; ... } • IDを含むフィールドにアノテーションを行う。
  6. Protobuf の Custom Option 定義 package user_id; message IDConversion {

    bool enable = 1; } extend google.protobuf.FieldOptions { IDConversion conversion = 60000; }
  7. ID Provider ID Provider • UserID と PPID のマッピングを持つサービス。 ◦

    UserID と PPID を相互変換するAPIを提供する。 ◦ gRPC Interceptor と Gateway からこのAPIを利用する。
  8. Caller のID変換 gRPC Client Interceptor • gRPC Call 時に Request/Response

    を Modify するフィルタの ようなもの。 ◦ gRPC Client の初期化時にセットアップする。 • 以下の変換を行う ◦ リクエスト送信 : Caller UserID → Caller PPID ◦ レスポンス受信 : Caller PPID → Caller UserID
  9. Callee のID変換 Gateway • 外部からのリクエストの入り口となる既存サービス。 ◦ いわゆる API Gateway の実装。

    ◦ 内部のマイクロサービスへルーティングを行う。 • 以下の変換を行う。 ◦ リクエスト受信 : Caller PPID → Callee UserID ◦ レスポンス送信 : Callee UserID → Caller PPID
  10. Callee のID変換 Gateway なぜ Callee MS ではなく Gateway でID変換を行うのか •

    Caller PPID → Callee UserID への変換は各MSで行うのではな く、限られたコンポーネントで行いたい 。 ◦ 任意の PPID を自身の UserID に変換できるため権限を 悪用されると、外部の PPIDを持った攻撃者による紐付けが 可能になる。 • Callee に gRPC Server Interceptor を導入する手間がなくなる。
  11. 得られた開発者体験 開発者が行うこと 1. Caller Microserive への gRPC Client Interceptor の導入

    ◦ 一度だけセットアップすればよい。 2. Protobuf メッセージへのアノテーションの記述 ◦ 新規に通信を行う場合、既存の通信にIDフィールドを追加する場合に 記述する。 ID変換を意識することなく 内部通信と同じようにAPI呼び出しが可能
  12. Publisher 側のID変換 PubSub Pusher 元々の責務 • Cloud Pub/Sub の トピック

    からメッセージを Pull Subscription で 受け取り gRPC リクエストに変換する。 ◦ Gateway を介さず直接マイクロサービスにリクエストを送 る。 • Subscribe する Topic、Push 先などの設定は kubernetes の manifest として記述する。
  13. Publisher 側のID変換 PubSub Pusher システム連携のための拡張 • 受け取ったメッセージに含まれる IDを変換する。 ◦ Publisher

    UserID → Subscriber PPID ▪ 同期呼び出しの場合と違い、通信相手の PPID (Publisher PPID) に変換している。 • Gateway に対してリクエストを送信する。 Mercari Engineering Portal: Applying OAuth 2.0 and OIDC to first-party services (https://engineering.mercari.com/en/blog/entry/20230130-applying-oauth-2-0-and-oidc-to-first-party-services/)
  14. Subscriber 側のID変換 Gateway • 同期的なAPI呼び出しとまったく同じ処理を行う。 ◦ リクエスト受信 : Caller PPID

    → Callee UserID ◦ レスポンス送信 : Callee UserID → Caller PPID Mercari Engineering Portal: Applying OAuth 2.0 and OIDC to first-party services (https://engineering.mercari.com/en/blog/entry/20230130-applying-oauth-2-0-and-oidc-to-first-party-services/)
  15. gRPC Interceptor の実装が Go しかない 01 不具合調査時の Traceability 02 UserID

    以外のデータによる紐付けをどのように防ぐか 03 残っている課題