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

realtime_marketing_system

katsuyan
August 27, 2020

 realtime_marketing_system

katsuyan

August 27, 2020
Tweet

More Decks by katsuyan

Other Decks in Programming

Transcript

  1. © ZOZO Technologies, Inc. 株式会社ZOZOテクノロジーズ
 SRE部
 MA基盤 リーダー 田島 克哉


    2018新卒入社
 業務ではデータ基盤・配信基盤の開発運用を行っている
 好きな言語はClojure(得意ではない)
 
 2
  2. © ZOZO Technologies, Inc. 目次
 • ZOZOTOWNのリアルタイムマーケティングシステム
 ◦ リアルタイムマーケティングシステム(RTM)
 ◦

    どうしてリアルタイム
 ◦ RTMの処理全体の流れ
 • リアルタイムマーケティングシステムを支える技術
 ◦ 全体のアーキテクチャ概要
 ◦ 技術構成
 ◦ 処理の例
 • リプレイス計画
 • まとめ
 3
  3. © ZOZO Technologies, Inc. 配信システムの変遷
 
• 初期の配信システム
 ◦ 1日1回決まった時間に配信するバッチ配信
 •

    時間振り分け
 ◦ 同じメッセージを9時・12時・18時の3パターンで配信時間の振り分け
 ◦ 効果に差が出た
 • 最新のデータを使ってセグメント配信
 ◦ 最新のデータを使ってセグメント抽出し配信
 ◦ CVRの向上
 • RTMの導入(現在)
 ◦ 開封率・CTR・CVRの指標が全て向上(最大で開封率2倍、CVR5倍)
 
 
 7
  4. © ZOZO Technologies, Inc. イベント検知
 • イベントの種類
 ◦ ユーザの行動ログ
 ◦

    DBのデータ変更ログ
 • イベント検知
 ◦ 上記イベントの発生を検知する
 
 11
  5. © ZOZO Technologies, Inc. キャンペーン判定
 13 • キャンペーンとは
 ◦ どのようなイベントを検知したらどのようなお知らせをするかを定めたもの


    • 例
 ◦ イベント: 商品が値下がりした
 ◦ お知らせ: 商品をお気に入りしているユーザに対して値下がり通知を送る
 • キャンペーン判定
 ◦ イベントを元にどのキャンペーンを配信するか決定する

  6. © ZOZO Technologies, Inc. ユーザ抽出・メンバーフィルタリング
 • ユーザ抽出
 ◦ キャンペーンの対象となりうるユーザ一覧を取得する
 •

    メンバーフィルタリング
 ◦ 抽出したユーザに対して本当にキャンペーンを配信するかを判定する
 ◦ 判定は抽出したユーザ1人1人について検証する
 15
  7. © ZOZO Technologies, Inc. チャネル最適化
 • チャネル最適化とは
 ◦ ユーザに合わせて配信するチャネルを決める仕組み
 •

    例
 ◦ MAILへの反応は悪いがLINEにはよく反応するユーザに対してはLINEのみ配信
 • 配信チャネル
 ◦ MAIL
 ◦ LINE
 ◦ PUSH通知(未実装)
 ◦ アプリ内お知らせ(未実装)
 
 17
  8. © ZOZO Technologies, Inc. 時間選択・通数最適化
 • 時間選択
 ◦ ユーザが最もお知らせを参照する時間帯に配信を行う仕組み
 ◦

    もちろんキャンペーンによってはリアルタイムで配信を行う
 • 通数最適化
 ◦ ユーザにとって最も最適な通数は何件なのか判断しそれ以上の通知を行わない
 ◦ ユーザが配信をうるさいと感じオプトアウトしてしまうのを防止
 19
  9. © ZOZO Technologies, Inc. コンテンツ生成・配信処理
 • コンテンツ生成
 ◦ 実際にユーザに送る文言等を各チャネルのフォーマットに整形する
 ◦

    例えばLINEであれば、LINEに配信するメッセージと対応するJSON
 • 配信処理
 ◦ 生成したコンテンツを実際に配信する
 21 message: 値下げしたお気に入りアイテムがあります user_line_id: 12345 url: https://zozo.jp/ { "to":"12345", "messages":[ { "altText": "値下げしたお気に入りアイテムがあります", ・ ・ ・ ・ ・ ・
  10. © ZOZO Technologies, Inc. Tracker
 • Trackerの役割
 ◦ DBの変更データを検知してAnalyzerに連携する
 •

    差分データの取得方法
 ◦ SQL ServerのChange Trackingを利用
 ◦ Change Trackingは簡単に言うと変更があった行のPKを保持する機能
 ◦ 以下の様なクエリで差分を取得できる
 
 26 SELECT CT.id id, O.必要なカラム1, O.必要なカラム2 CASE WHEN O.id IS NULL THEN 1 ELSE 0 END deleted FROM CHANGETABLE(CHANGES dbo.order, 前回の取得したときのversion) AS CT LEFT OUTER JOIN dbo.order AS O ON CT.id = O.id
  11. © ZOZO Technologies, Inc. Analyzer
 • Analyzerの役割
 ◦ RTMのメインアプリケーション
 ◦

    「キャンペーン判定」から「配信処理」までを行うアプリケーション
 • 非機能要件
 ◦ 複雑なルール判定
 ◦ 動的なルール追加
 ◦ 高速な条件判定
 28
  12. © ZOZO Technologies, Inc. Analyzerの技術構成
 • 言語
 ◦ Java 8


    • フレームワーク
 ◦ JBoss EAP
 ◦ JBoss Data Grid
 ◦ Red Hat Decision Manager
 29
  13. © ZOZO Technologies, Inc. JBoss EAP
 • JBoss EAPとは
 ◦

    Red Hatが提供しているJava EE実装
 • JBossEAPの役割
 ◦ JBoss Data Grid/Red Hat Decision Managerを組み合わせて機能を実現する
 
 
 30
  14. © ZOZO Technologies, Inc. Red Hat Decision Manager
 • Red

    Hat Decision Managerとは
 ◦ ルールエンジン
 ◦ エクセルで記述したルールをコンパイルしてJavaのswitch文に展開できる
 ◦ ルールはアプリケーションの再起動なしに展開可能
 • Red Hat Decision Managerの役割
 ◦ 「複雑なルール判定」と「動的なルール追加」を実現
 
 
 31
  15. © ZOZO Technologies, Inc. Red Hat Decision Manager
 • ルール判定の動き


    ◦ CONDITIONの「$fact」はアプリケーションから渡される
 ◦ 3行目の$paramに同じ列の各値が埋め込まれてJavaの式に展開される
 ◦ 各CONDITIONがすべてTrueになった場合ACTIONが実行される
 ◦ $factに値をセットすることでアプリケーション側でセットした値を利用できる 
 • 例) デバッグユーザ以外除外ルール
 32
  16. © ZOZO Technologies, Inc. JBoss Data Grid(JDG)
 • JBoss Data

    Gridとは
 ◦ RTMの肝の技術
 ◦ かんたんに言うとインメモリな分散キャッシュデータストア
 ◦ 複数台のサーバー(ノード)でキャッシュを分散して保持する
 ◦ Key-Value形式でJavaのオブジェクトを直接保存する
 • JBoss Data Girdの役割
 ◦ 「高速な条件判定」を実現する
 33
  17. © ZOZO Technologies, Inc. JDGのEmbedded mode
 • Client modeとEmbedded mode


    ◦ JDGにはClient modeとEmbedded modeがある
 ◦ RTMではEmbedded modeを利用
 • Embedded modeとは
 ◦ Embedded modeではアプリケーションと同一JVM上にキャッシュを保持
 ◦ 以下の組み合わせでlocalメモリへのデータアクセスだけで完結できる
 
 34 ①分散実行
 ②キャッシュのローカリティ判定
  18. © ZOZO Technologies, Inc. 例:ユーザフィルタリングの処理
 JBoss Data Grid/Red Hat Decision

    Managerを利用した擬似コード
 36 int campaign_id = xxx; List<Integer> memberIds = [id1, id2, id3 ...]; AdvancedCache<Object, Object> memberCache = JdgUtil.lookupCache(CacheNames.MEMBER); DefaultExecutorService des = new DefaultExecutorService(memberCache); task = new DistributedMemberFilteringService(campaign_id, memberIds); des.submitEverywhere(task, memberIds) public class DistributedMemberFilteringService { public DistributedMemberFilteringService(List<Integer> memberIds) { this.campaign_id = campaign_id; this.memberIds = memberIds; } public void call() { List<Integer> localMemberIds = narrowDownToLocal(memberIds); List<Integer> offerMemberIds = new ArrayList<Integer>(); for(Integer memId : localMemberIds) { Member member = (Member)memberCache.get(memberId); MemberFilteringFact fact = new MemberFilteringFact(member); MemberFilterRule rule = new MemberFilterRule(fact); rule.fire(); if(!fact.isFiltered()) { offerMemberIds.add(memberId); } } 次の処理(offerMemberIds); } private List<Integer> narrowDownToLocal(List<Integer> memberIds) { List<Integer> localMemberIds = new ArrayList<Integer>(); AdvancedCache<Object, Object> memberCache = JdgUtil.lookupCache(CacheNames.MEMBER); JdgDistributionUtil localityChecker = new JdgDistributionUtil(memberCache); for (Integer memberId : memberIds) { if (localityChecker.isLocal(memberId)) { localMemberIds.add(memberId); } } return localMemberIds; } } memberIdsに含まれるmemberIdをkeyとして持つノード全てでtask.call()を実行 値のローカリティ判定 自ノードのキャッシュのみに絞り込み
  19. © ZOZO Technologies, Inc. 課題
 • 代表的な課題
 ◦ スケーリングの問題
 ◦

    リリースに時間がかかっている
 ◦ 分散キャッシュが難しい
 
 37
  20. © ZOZO Technologies, Inc. スケーリングの問題
 • RTMのスケーリングについて
 ◦ オートスケーリングには向いていない構成となっており行っていない
 ◦

    ピークに合わせたサーバー台数で常に稼働している
 
 • スケールイン時のデータのロスト
 ◦ キャッシュは指定したノード数でレプリケーション可能(RTMは2)
 ◦ レプリ数よりも多くのノードのプロセスが同時に止まるとデータがロストする
 
 
 38
  21. © ZOZO Technologies, Inc. リリースに時間がかかっている
 • アプリケーションとキャッシュが同一JVM上にある
 ◦ アプリケーションのリリースでJVMを停止するとキャッシュもロスト する


    • 現状のリリース方法
 ◦ 1台ずつキャッシュをリバランスしながらリリース(4時間)
 ◦ メンテナンスタイムを設けてダンプ&ロードを行う(1.5時間)
 • リリースに時間がかかることによる弊害
 ◦ リリース頻度が下がる
 ◦ ロールバックに時間がかかるためリリースを必要以上に慎重に行 う必要がある
 39
  22. © ZOZO Technologies, Inc. 分散キャッシュが難しい
 • 分散キャッシュの運用の難しさ
 ◦ 一般的なWebアプリケーションに比べて格段に複雑で 難易度が高い


    ◦ 実際に以前クラスターのスプリットブレイン発生
 • 知見があまり見つからない問題
 ◦ インターネット上にJDG関係の情報があまりない
 
 40 https://techblog.zozo.com/entry/jdg_splitbrain
  23. © ZOZO Technologies, Inc. リプレイス計画について
 43 • 現状の計画
 ◦ まだまだ構想の段階


    ◦ どのように進めていくかも決まっていない
 • 構想
 ◦ データストアの分離
 ▪ リリースの問題を解決
 ▪ パフォーマンスを担保し分離できるかが課題
 ◦ ジョブキュー型のアーキテクチャ
 ▪ 柔軟にスケーリングできるアーキテクチャ
 ▪ 高速なデータ処理
 ◦ リアルタイムデータ連携基盤の利用
 ▪ trackerの置き換え
 

  24. © ZOZO Technologies, Inc. まとめ
 • リアルタイムマーケティングシステム
 ◦ イベント検知から配信までをリアルタイムに行うシステム
 ◦

    RTMの導入により各種指標が向上した
 • リアルタイムマーケティングシステムの構成
 ◦ JBoss Data Gridを利用することで高速な判定処理を実現している
 • 現状の課題
 ◦ 現状のシステム構成では様々な問題があります
 • リプレイス計画について
 ◦ 現状の課題を解決し柔軟で扱いやすいシステムへのリプレイスを考えている
 44
  25. © ZOZO Technologies, Inc. 最後に
 • 以下のようなことを思っていたらぜひ一緒にリプレイスをしましょう!
 ◦ もっとこんな構成にするといいのではないか?
 ◦

    こんな技術を利用すればいいのではないか?
 ◦ こんな仕組みを入れたら面白いことができるのではないか?
 ◦ などなど
 
 45