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

#KotlinFest 2024 : Kotlin sealed classを用いた、ユーザー...

#KotlinFest 2024 : Kotlin sealed classを用いた、ユーザーターゲティングDSL(専用言語)と実環境で秒間1,000万評価を行う処理系の事例紹介

“サービスの体験をパーソナライズし、興味のあるコンテンツを楽しんで貰うためには、
各種クリエイティブ(バナー・ポップアップ等)のターゲティング(by 年代、性別、OS、etc)が欠かせません。

最初は個別に実装する事が多いですが、露出面 n とターゲティング条件 m が増えた場合、O(n x m) の実装・メンテナンスコストがかかってしまい、共通化が必要となります。

今回の発表は、新規作成された共通 Platform 上における課題:『マーケターを初めとする全社員が、
 ユーザーの条件やその AND/OR/NOT の任意の組み合わせによるターゲティングを可能とする』を、
Kotlin で実装した YAML ベースのユーザーターゲティングDSL(独自言語)とその処理系によって解決した事例の紹介となります。

More Decks by Kazuki MATSUDA / 松田一樹

Other Decks in Programming

Transcript

  1.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO lαʔϏεͷମݧΛύʔιφϥΠζ͠ɺڵຯͷ͋ΔίϯςϯπΛָ͠ΜͰ໯͏ͨΊʹ͸ɺ ֤छΫϦΤΠςΟϒʢόφʔɾϙοϓΞοϓ౳ʣͷλʔήςΟϯάʢCZ೥୅ɺੑผɺ04ɺFUDʣ͕͔ܽͤ·ͤΜɻ ࠷ॳ͸ݸผʹ࣮૷͢Δࣄ͕ଟ͍Ͱ͕͢ɺ࿐ग़໘ O ͱλʔήςΟϯά৚݅ N ͕૿͑ͨ৔߹ɺ

    0 OYN ͷ࣮૷ɾϝϯςφϯείετ͕͔͔ͬͯ͠·͍ɺڞ௨Խ͕ඞཁͱͳΓ·͢ɻ ࠓճͷൃද͸ɺ৽ن࡞੒͞Εͨڞ௨ 1MBUGPSN ্ʹ͓͚Δ՝୊ɿ ʰϚʔέλʔΛॳΊͱ͢Δશࣾһ͕ɺ Ϣʔβʔͷ৚݅΍ͦͷ "/%03/05ͷ೚ҙͷ૊Έ߹ΘͤʹΑΔλʔήςΟϯάΛՄೳͱ͢ΔʱΛɺ ,PUMJOͰ࣮૷ͨ͠ :".-ϕʔεͷϢʔβʔλʔήςΟϯά%4-ʢಠࣗݴޠʣͱ ͦͷॲཧܥʹΑͬͯղܾͨ͠ࣄྫͷ঺հͱͳΓ·͢ɻ
  2.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO λʔήςΟϯάͱ͸ͭ·ΓͲ͏͍͏͜ͱ͔ r ͋ΔϚϯΨΞϓϦ։ൃͷݱ৔ ΞϓϦʹىಈ࣌ϙοϓΞοϓػೳ͕ཉ͍͠ Ͱ͢ΑͶ τοϓը໘ʹόφʔ΋ग़͍ͨ͠ΑͶ Θ͔Γ·͢

    όφʔ͸࡞඼ͷ޷ΈʢಡΜ͔ͩͲ͏͔ʣͰग़͠෼͚͍ͨ͠ͳ ࡞Γ·ͬͤ ىಈ࣌ϙοϓΞοϓΛಛఆͷϢʔβʔʢ$47 -JTUʣ ʹରͯ͠ͷΈग़͢Α͏ʹ͍ͨ͠ɻ ֦ு͠·͢ ϢʔβʔΛࢦఆʢ$47ʣͯ͠ 1VTI ௨஌ΛૹΔػೳ΋࡞Ζ͏ ͱΓ͋͑ͣ SZ ىಈ࣌ϙοϓΞοϓ΋࡞඼޷ΈࢦఆͰग़͍ͨ͠Μ͚ͩͲ ͦΖͦΖਏ͍ͧɻɻɻ
  3.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ͭ·ΓͲ͏͍͏͜ͱ͔ʁ Banner Popup その他A B C ...

    全表⽰ ✅ ✅ ✅ ✅ ✅ … 登録時期 ✅ ✅ ❌ ❌ ✅ … 課⾦履歴 ✅ ❌ ✅ ❌ ❌ … 閲覧履歴 ❌ ✅ ❌ ✅ ✅ … ID指定 ❌ ✅ ✅ ✅ ❌ … … … … … … … … 機能 ターゲティング条件
  4.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO Banner Popup その他A B C ... 全表⽰

    ✅ ❌ ❌ ✅ ❌ … 登録時期 ✅ ✅ ❌ ❌ ✅ … 課⾦履歴 ✅ ❌ ✅ ❌ ❌ … 閲覧履歴 ❌ ✅ ❌ ✅ ✅ … ID指定 ❌ ✅ ✅ ✅ ❌ … … … … … … … … 機能 ターゲティング条件 ͭ·ΓͲ͏͍͏͜ͱ͔ʁ • ਏ͘ͳ͖ͬͯͨɻ • αʔϏεͷ੒௕ͬͯ͜͏͍͏΋ͷʂʁ • ͋Δఔ౓ڞ௨Խ͓͚ͯ͠͹͜͏͸ͳΒΜ΍Ζ͏ɻ • ͜ͷλʔήςΟϯάॲཧ͸ॏ͍ͷͰ 5PQ 1BHF Ͱ͸࢖ͬͯཉ͘͠ͳ͍ FUD ͕ӡ༻ෛՙ εϐʔυ༏ઌʢʁʣͰɺ αʔϏε͕੒௕͢ΔͱͲ͏ͳΔͷ͔ɾɾɾʁ
  5.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO &OHJOFFSJOHGPS4DBMF • ݸผʹ࣮૷͍ͯ͠ΔͱλʔήςΟϯάͷ࣮૷ɾϝϯςφϯείετ͸ 𝑂 λʔήςΟϯάͷछྨ × 𝑂

    ػೳͷ਺ ~ 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ × 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ = 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ! αʔϏεͷ੒௕ʹରͯ͠৐ͷίετ͕͔͔Δɺͱ͍͏͜ͱɻ ͜ΕΛղܾ͢Δඞཁ͕͋ͬͨɻ ࠷ॳ͸ʰͱ͸͍͑ͳΜͱ͔ͳΔͰ͠ΐʱͷൣғ͕ͩͬͨʜʜ
  6.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 8)0 8& "3& • ͜ͷηογϣϯͰ঺հͤͯ͞௖͘ͷ͸ -*/&ϚϯΨ ͱ͍͏ɺ

    ࠃ಺ 5PQ4BMFTɺʹͳΔ೔΋͋Δ ΞϓϦͷαʔόʔαΠυࣄྫͱͳΓ·͢ • ೥Λ௒͑Δӡ༻ͷੵΈॏͶ • ߴτϥϑΟοΫ •  ສ 5BSHFUJOHTFD͕࣮ࡍʹඞཁ Apple: https://www.youtube.com/watch?v=aRKayW4LZCg
  7.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ϦϦʔε͔Β೥Λӽ͑ΔΞϓϦͷ λʔήςΟϯά͕ ?ͩͬͨ৔߹ͷίετ 𝑂 λʔήςΟϯά࣮૷ͷτʔλϧίετ ~ 𝑂

    ػೳͷ਺ ⋅ 𝑂 λʔήςΟϯάͷछྨ ~ 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ⋅ 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ = 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ! = 𝑂 11 ೥෼ͷϊ΢ϋ΢ͷੵΈॏͶ ! ೥͔Βͷ ೥ ೥  11年 ! ͔Βͷ ೥ ೥
  8.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO  ສTFD ͷλʔήςΟϯάͰ࣮ߦ • ඵؒ  ສ

    TFDͷ "1* $BMM ͕͋ΔΘ͚Ͱ͸ͳ͍ɻ • "1*$BMMͷதͰɺ༷ʑͳλʔήςΟϯά͕ߦΘΕ͍ͯΔ • ྫɿ-*/& ϚϯΨͷىಈ࣌εΫϦʔϯ • Ϣʔβʔొ࿥೔ʢ৽نʁطଘʁFUDʣຖʹɺը໘ߏ੒Λม͑Δ • όφʔɾ1PQVQ ͻͱͭͻͱͭΛݟͤΔɾݟͤͳ͍ • ֤छ "# 5FTU ౳ • ։ൃ׬ྃػೳͷ (SBEVBM 3PMMPVU
  9.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ߹ܭ 5BSHFUJOH ਺ r   TFD

    1,000万/sec とはどれくらいか? = 1回の処理に 1ms かかってしまうとすると 1スレッドで秒間1000回しかターゲティングできず、 1万スレッドが必要。
  10.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ඵؒ  ສճΛ௒͑Δ λʔήςΟϯάΛ࣮ݱ͢Δํ๏ • ٕज़ཁૉΛ "E5FDI

    ͔Βഈआ ˞ • 'VMMTDSBUDIͷ 1SJWBUF %.1 "VEJFODF؅ཧʣΛ ,PUMJO Ͱ։ൃɾӡ༻ • શͯͷ "1* ϦΫΤετʹରͯ͠ɺ αϒϛϦඵͰ 6TFSͷ "VEJFODF(SPVQ*% 'MBH4FU Λฦ͢ • ͜ͷ 'MBH 4FUʹରͯ͠ɺλʔήςΟϯάΛద༻ ※ https://en.wikipedia.org/wiki/Data_management_platform etc
  11.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 1MBUGPSN͕͋Ε͹͜͏ͳΔ Targeting Patform (PrivateDMP+α) 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ

    ! 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ + 𝑂 𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ ~ 𝑂(𝑆𝑒𝑟𝑣𝑖𝑐𝑒 𝐺𝑟𝑜𝑤𝑡ℎ)
  12.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ߟྀ͢΂͖ϙΠϯτ Š *0'SFF ཁ੥ • ʰ͜Ε͸৽نϢʔβʔʹग़͍ͨ͠ʱͱ ͍͏ͱ͖ʹɺग़͠෼͚ͷλΠϛϯάͰ

    ৽نϢʔβʔ͔Ͳ͏͔Λ %# ౳ʹ໰͍ ߹ΘͤΔࣄ͸Ͱ͖ͳ͍ 1,000万 ターゲティング /sec = 1回の処理に 1ms (1IO) かかってしまうと 1万スレッドが必要。 利⽤開始時期 バナー TargetingPlatform DB
  13.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO -*/&ϚϯΨʹ͓͚Δɺ,PUMJO ্Ͱͷ λʔήςΟϯάͷղ͖ํ  "1*ݺͼग़͠։࢝ͷλΠϛϯάͰɺ جຊ৘ใʢϢʔβʔ*%ͳͲʣʹՃ͑ͯɺ "VEJFODF(SPVQ*%

    ͱݺ͹ΕΔ 'MBH 4FU Λ %.1͔Βશͯऔಘ͓ͯ͘͠ NT ྫɿ6TFS" GMBH<    >  ΫϦΤΠςΟϒʢόφʔɾ1PQVQFUDʣͷϦετ͕ɺ λʔήςΟϯάͱڞʹ༩͑ΒΕΔɻ • ྫɿ͜ͷόφʔΛ GMBHͷϢʔβʔʹදࣔ  Ϣʔβʔຖʹద੾ͳϑΟϧλϦϯάΛίʔυͰߦ͏
  14.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO λʔήςΟϯάΛͲ͏දݱ͢Δ͔ʁ • "/%03/05ΛؚΉλʔήςΟϯάΛ ʰσʔλʱʢ஋ʣͱͯ͠දݱ͍ͨ͠ ʹ/PU-PHJD$PEF • ਓؒͱϓϩάϥϜ͕ޡղແ͘ಡΈॻ͖Ͱ͖Δදݱܗࣜʢ%4-

    ઐ༻ݴޠʣ͕ཉ͍͠ • Կނσʔλ  %4- ͔ʁ • %#1SPUPDPMʹ҆ఆͯ͠ӬଓԽ 4FSJBMJ[F ग़དྷΔํ๏͕ඞཁ • ਓ͕ؒ "/%03/05ͷ೚ҙͷ૊Έ߹ΘͤΛ $.4 ͔Βઃఆ͍ͨ͠ • ઃఆϑΝΠϧʢύϥϝʔλϑΝΠϧʣ্Ͱ΋׆༻͍ͨ͠
  15.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4- 4FS%F 1BSTFS ࣮૷ • લఏɿ%4- ͸

    :".- ϕʔεͱͯ͠ɺ "/%03/05 ͷ࿦ཧԋࢉࢠ͓Αͼ -FBG /PEF Ͱߏ੒͞ΕΔ • :".- ࠾༻ཧ༝ɿϋΠϥΠτͳͲΛطଘ &EJUPS .POBDP ʹཔΓ͍ͨ • ύʔε %FTFSJBMJ[F ӬଓԽ 4FSJBMJ[F Λ࣮૷͍ͨ͠ • ϕʔε͸ ljackson-dataformat-yaml”
  16.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO %4- 1BSTF ΛՄೳͱ͢Δ+BDLTPOͷ QPMZNPSQIJTN ରԠ • :".-.BQQFS

    ͰɺҎԼͷ༻ʹॻ͍͓ͯ͘ͱ ࠓճͷ %4- Λ ύʔεͰ͖ΔԼ४උ͕ग़དྷΔ • :".- /BUJWF ͷ 5ZQF 'JFME ΛແޮԽ FUD
  17.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "/%03/05ٴͼ -FBG $POEJUJPO Λ ࣔ͢ TFBMFEJOUFSGBDF EBUBDMBTT

    • ΫϥεΛ͜͏ఆٛ • 5BSHFUJOH ͱݴ͏֓೦ʢ*OUFSGBDFʣ͕͋ͬͯ "/%03/05 ΍֤छܕ͕ 4VC5ZQF
  18.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO "/%03/05ٴͼ -FBG $POEJUJPO Λ ࣔ͢ TFBMFEJOUFSGBDF EBUBDMBTT

    • ΫϥεΛ͜͏ఆٛ • 5BSHFUJOH ͱݴ͏֓೦ʢ*OUFSGBDFʣ͕͋ͬͯ "/%03/05 ΍֤छܕ͕ 4VC5ZQF
  19.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 1FSGPSNBODF •   5BSHFUJOHTFD PO.#1.4JOHMF$PSF •

    ࣮ࡍͷෳ਺αʔόʔɾෳ਺ $PSF ؀ ڥͰ͸ɺ΄΅θϩͱݟͳͤΔίετ • *0'SFFධՁ͸଎͍ test summary: Benchmark Mode Cnt Score Error Units MyBenchmark.complexTargeting thrpt 5 150221873.429 ± 21629093.823 ops/s MyBenchmark.simpleTargeting thrpt 5 253614332.192 ± 642978.132 ops/s
  20.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO 4FBMFEDMBTT $PNQJMFSΛར༻ͨ҆͠ શͳ %4- ֦ு • %4-ͷ

    -FBG5ZQF͕૿͑ͨ৔߹ɺ ,PUMJO$PNQJMFSʹ (VJEF ͞Ε ͯίϯύΠϧ͕௨Δ·ͰίʔυΛ ॻ͍͍͚ͯ͹࣮૷࿙Ε͕ͳ͍ • JT.BUDI5BSHFUJOH Λϝϯόؔ਺ʹ ͠ͳ͍ཧ༝ʁ • σʔλʹରͯ͠ 5BSHFUJOH Ҏ֎ʹ΋ ༷ʑͳॲཧΛ͢Δඞཁ͕͋Γɺݟ௨͠ Λ֬อ͔ͨͬͨ͠ɻ • ྫʣDPOWFSU&MBTUJDTFBSDI2VFSZ
  21.  ,PUMJO'FTU ˜-*/&%JHJUBM'SPOUJFS$PSQPSBUJPO ·ͱΊ • ೔ຊ 5PQ4BMFTʢʹͳΔ೔΋͋Δʣ ΞϓϦͷ 4FSWFS ͸

    ,PUMJOͰॻ͔Ε͍ͯΔ •  ສλʔήςΟϯάTFDΛ࣮ݱ͢Δ 1SJWBUF %.1 ౳ͷج൫΋ ,PUMJO Ͱॻ͚Δɻ • KBDLTPOEBUBCJOEZBNM Λར༻ͯ͠ :".- ্ͷ %4- Λ ,PUMJO ʹ .BQQJOH 1BSTF Ͱ͖Δ r 4FS%F • %4- &WBMVBUJPO ΋ ,PUMJO ͷ 4FBMFE $MBTT ͳΒ҆৺ɾ؆୯ r &WBM