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

ZOZOを支えるリアルタイムデータ連携基盤の歴史とビジネス貢献 / History and B...

pokoyakazan
January 23, 2025
1.2k

ZOZOを支えるリアルタイムデータ連携基盤の歴史とビジネス貢献 / History and Business Contribution of the Real-Time Data

pokoyakazan

January 23, 2025
Tweet

Transcript

  1. © ZOZO, Inc. 株式会社ZOZO 技術本部データシステム部 データ基盤ブロック ブロック長 奥山 喬史 -

    2018年4月 ~ 2022年1月: カカクコム(データエンジニア) - 2022年2月 ~ : ZOZO(データエンジニア) - BigQueryで構築されたデータ基盤の運用保守 - 個人活動: - 「ぽこやかざん」という名前でラジオ投稿したり大喜利したり - 「下町モルモット」というコンビで漫才したり - テレビに出ました! - テレビ東京の「ぴったり にちようチャップリン」に出演 - 2024年12月14,21日放送: - 今年の賞レース覇者が大激突!!全日本ウルトラグランドチャンピオン大会 2
  2. © ZOZO, Inc. 3 目次 - サービス紹介 - ZOZOのデータ基盤におけるデータ処理システム -

    リアルタイムデータ連携基盤の紹介 - 概要 - 誕生の契機 - 仕組み - アーキテクチャの変遷 - リアルタイムデータ連携基盤のプラス情報 - BigQueryでのリアルタイムデータの利用方法 - realtimeビューから日次データを作成するように - データソースの拡充 - 今後の展望 - リアルタイムデータ基盤が生み出しているビジネス価値
  3. © ZOZO, Inc. https://zozo.jp/ 4 • ファッションEC • 1,600以上のショップ、9,000以上のブランドの取り扱い •

    常時102万点以上の商品アイテム数と毎日平均2,600点以上の新着 商品を掲載(2024年9月末時点) • ブランド古着のファッションゾーン「ZOZOUSED」や コスメ専門モール「ZOZOCOSME」、シューズ専門ゾーン 「ZOZOSHOES」、ラグジュアリー&デザイナーズゾーン 「ZOZOVILLA」を展開 • 即日配送サービス • ギフトラッピングサービス • ツケ払い など
  4. © ZOZO, Inc. 8 誕生の契機 ~ 2020年: データ基盤へのデータ同期は1日1回 ~ 数回のバッチで行う

    • 日次・月次のレポート作成等はこれで十分 2020年: リアルタイムデータの要望が増えてきた • 検索パーソナライズ(ユーザごとに商品をおすすめ順で表示): ◦ 「レコメンドしたのに商品が既に売り切れている」といった機会損失を防ぎたい • 配信基盤: ◦ 商品が残り1点になったタイミングで通知を行いたい リアルタイムに商品の在庫状況を連携する必要がある リアルタイムデータ連携基盤誕生
  5. © ZOZO, Inc. 9 仕組み 基本方針: • テーブルのレコードに INSERT, UPDATE,

    DELETE といった更新が走ったら BigQuery に同期 選択肢: • CDC (Change Data Capture): ◦ テーブルの変更履歴を追跡可能 ◦ 変更前後のレコードを保持 • Change Tracking: ◦ 取得できるのは更新の種類や更新バージョン、更新のあった主キーのみ ◦ 更新の種類: INSERT, UPDATE, DELETE
  6. © ZOZO, Inc. 10 仕組み 基本方針: • テーブルのレコードにINSERT, UPDATE, DELETEといった更新が走ったらBigQueryに同期

    選択肢: • CDC (Change Data Capture): ◦ テーブルの変更履歴を追跡可能 ◦ 変更前後のレコードを保持 • Change Tracking: ◦ 取得できるのは更新の種類や更新バージョン、更新のあった主キーのみ ◦ 更新の種類: INSERT, UPDATE, DELETE 当時CDCに対応していないSQL Serverもオンプレ環境に存在した
  7. © ZOZO, Inc. 11 仕組み declare @last_synchronization_version bigint; SET @last_synchronization_version

    = #{@前回更新したバージョン}; SELECT CONCAT('#{@tablename}','-',a.#{@primary_key.join(',').gsub(',', ',a.')},a.SYS_CHANGE_VERSION) as massage_unique_id, '#{@databasename}' as database_name, '#{@tablename}' as table_name, '#{@changetrack_interval}' as changetrack_interval, a.SYS_CHANGE_OPERATION as changetrack_type, a.SYS_CHANGE_VERSION as changetrack_ver, @last_synchronization_version as changetrack_last_sync_ver, #{columns} -- 変更後のレコードを取得 FROM CHANGETABLE(CHANGES #{@tablename}, @last_synchronization_version) AS a LEFT OUTER JOIN #{@tablename} AS b ON a.#{@primary_key} = b.#{@primary_key} Change Tracking 取得クエリ
  8. © ZOZO, Inc. 18 アーキテクチャの変遷 fluentdインスタンス2台構成 CONCAT('#{@tablename}','-',a.#{@primary_key.join(',').gsub(',', ',a.')},a.SYS_CHANGE_VERSION) as massage_unique_id,

    ↑fluentdのクエリのこの部分で重複排除用ID作成 SQL Server 各 fluentdから同一レコードが流れてくるためレコード単位でユ ニークとなるmessage_unique_idを使って重複排除
  9. © ZOZO, Inc. 24 BigQueryでのリアルタイムデータの利用方法 Change Trackingデータと日次データをMERGEしたrealtimeビューを用意 change_track_version primary_key change_track_type

    col1 col2 101 1 U aaa ggg 101 2 D NULL NULL 102 3 I eee fff primary_key col1 co2 1 aaa bbb 2 ccc ddd primary_key col1 co2 1 aaa ggg 3 eee fff Change Tracking 日次データ realtime ビュー primary_key col1 co2 1 aaa ggg 3 eee fff ≒ 数十秒のラグのみ 参照 データ利用者 SQL Server上のテーブル
  10. © ZOZO, Inc. 26 realtimeビューから日次データを作成するように change_track_version primary_key change_track_type col1 col2

    101 1 U aaa ggg 101 2 D NULL NULL 102 3 I eee fff primary_key col1 co2 1 aaa bbb 2 ccc ddd Change Tracking 日次データ realtime ビュー primary_key col1 co2 1 aaa ggg 3 eee fff
  11. © ZOZO, Inc. 27 realtimeビューから日次データを作成するように change_track_version primary_key change_track_type col1 col2

    101 1 U aaa ggg 101 2 D NULL NULL 102 3 I eee fff primary_key col1 co2 1 aaa bbb 2 ccc ddd primary_key col1 co2 1 aaa ggg 3 eee fff Change Tracking 日次データ realtime ビュー realtimeビューに対して日次でで SELECT * して日次テーブルとして作成 SELECT * して作成
  12. © ZOZO, Inc. 29 データソースの拡充 MySQLからもリアルタイムにデータを連携できるように • Google CloudのDatastreamという機能を使用 ◦

    CDCデータをリアルタイムに同期 ◦ データベース側でbinlogを有効化する必要あり ◦ https://cloud.google.com/datastream SQL Server
  13. © ZOZO, Inc. 30 今後の展望 • fluentdからfluentbitへの移行 ◦ 軽量アーキテクチャでfluentdと比較してリソース消費が少ない ◦

    → コスト削減 ◦ https://fluentbit.io • データソースの拡充(PostgreSQLなど) • Datastream from SQL Serverの検証
  14. © ZOZO, Inc. 32 検索システム INPUT: 商品情報のリアルタイムデータ 処理: 検索インデックス作成 OUTPUT:

    全文検索エンジン(Elastic Search) マスタテーブルへの商品登録や売り切れ等のステータス変更時、約10分以下のリードタイムで反映可能 ユーザ目線の価値: 検索エクスペリエンスの向上 • リアルタイムで更新されるデータを基に検索機能が動作する • → ユーザーが入力した条件に対して最新の検索結果を提供可能 ブランド目線の価値: 商品情報の即時反映 • 商品の価格や在庫、プロモーション情報が即時に更新される • → ユーザに正確な情報を提供可能
  15. © ZOZO, Inc. 33 推薦システム INPUT: 商品情報のリアルタイムデータ + ユーザの商品閲覧ログ(ログ収集基盤で取得) OUTPUT:

    商品詳細面おすすめアイテム枠 • ZOZOTOWN内の商品を押下した際の遷移先ページの下部にある枠のこと • おすすめアイテム枠では詳細面で表示されている商品に基づく推薦商品が表示される 推薦対象のアイテムの在庫がない場合、おすすめとして表示できない • → 「レコメンドした商品が既に売り切れている」といった機会損失を防ぎたい 推薦システムが導き出した推薦対象のアイテムと、 商品情報のリアルタイム情報を照らし合わせて表示対象のアイテムを決定 Scroll Scroll アプリ商品詳細面の例
  16. © ZOZO, Inc. 34 配信システム INPUT: 値下げ情報のリアルタイムデータ + ユーザの商品閲覧ログ(ログ収集基盤で取得) 処理:

    値下げした商品を過去に閲覧・お気に入り登録したユーザを抽出 OUTPUT: メール・LINE・PUSH通知といった配信 ZOZOTOWNの全商品・全ユーザで行っている 値下げ実施から通知までのラグは1分程度
  17. © ZOZO, Inc. 35 クレカ不正防止システム INPUT: 注文情報のリアルタイムデータ OUTPUT: 該当の注文が不正かどうかの予測値 「不正注文を検知した頃には商品が出荷されていた」といった事態を防ぎたい

    • (商品によっては)注文から出荷までは数時間しかない → 日次データでは間に合わないため、注文情報のリアルタイムデータが必要 ZOZOTOWNの不正対策への取り組み - ZOZO TECH BLOG: https://techblog.zozo.com/entry/zozotown-fraud-prevention
  18. © ZOZO, Inc. 36 その他 • 施策・プロダクトのリリース時に実績速報値を確認 ◦ 想定以上にポイント取得されていないか、などの異常値の観測 •

    リアルタイム受注実績レポート ◦ 当日の施策の効果や、意図しない悪影響などがある場合に素早く検知