30msの広告配信を支える レイテンシ短縮の技術
by
やーびー
×
Copy
Open
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Slide 1
Slide 1 text
30msの広告配信を支える レイテンシ短縮の技術 DMM.go #12 屋比久怜央
Slide 2
Slide 2 text
自己紹介 屋比久怜央 やびくれお 名前 開発統括本部 マーケティングテクノロジー部 所属 ビリヤード・リアル脱出ゲーム 趣味 2
Slide 3
Slide 3 text
3 こんな開発をしています
Slide 4
Slide 4 text
4 bytedance/sonic
Slide 5
Slide 5 text
5 bytedance/sonicパッケージ 広告配信に、bytedance/sonic パッケージを利用しています 本日の主役 出典: https://pkg.go.dev/github.com/bytedance/sonic
Slide 6
Slide 6 text
6 bytedance/sonic とは 高速なJSONシリアライザ つまり、高速に動作するencoding/json bytedance/sonicパッケージの特徴 { “key”: “value”, “name”: “yabiku” } type Hoge struct { Key string Name string } JSON 構造体
Slide 7
Slide 7 text
7 bytedance/sonic の使い方 sonic.Marshal()によるエンコード sonic.Unmarshal()によるデコード 基本的には encoding/jsonと全く同じ { “key”: “value”, “name”: “yabiku” } type Hoge struct { Key string Name string } JSON 構造体 sonic.Marshal() sonic.Unmarshal()
Slide 8
Slide 8 text
8 bytedance/sonicの速さを示すベンチマーク 出典: https://github.com/bytedance/sonic 公式が提供するベンチマーク
Slide 9
Slide 9 text
9 bytedance/sonic 速さの理由 汎用性故に抱えるオーバーヘッドがボトルネックになる encoding/jsonのパフォーマンス上の弱点 構造体に特化したアセンブリを生成して高速化する 解決策としての JITコンパイル
Slide 10
Slide 10 text
10 encoding/jsonのパフォーマンス上の弱点 パッケージとしては、任意の構造体に対応する必要がある 変換するまで構造体のフィールドがわからない reflectパッケージで構造体を読み取る時に メモリアロケーションとGCが頻発 動的な型解釈によるオーバーヘッド
Slide 11
Slide 11 text
11 encoding/jsonのパフォーマンス上の弱点 reflectが利用されている様子 出典: https://cs.opensource.google/go/go/+/refs/tags/go1.25.6:src/encoding/json/encode.go;l=439-466
Slide 12
Slide 12 text
12 解決策としてのJITコンパイル
Slide 13
Slide 13 text
13 JITコンパイルとは 事前に機械語を生成する通常のコンパイルに対し、実 行時に機械語を生成する形式のこと Just-In-Timeコンパイル 通常のコンパイル JITコンパイル ソースコード 機械語 実行中のソース 機械語 実行 環境 実行 環境
Slide 14
Slide 14 text
14 JITコンパイルの恩恵 実行環境に合わせて機械語が生成される 単一のソースコードを、異なる環境で使い回せる ソースコードがプラットフォームに依存しない 実行時のプロファイルや入力値に応じた最適化を行うことができる 実行環境を加味した最適化
Slide 15
Slide 15 text
15 解決策としての JITコンパイル 変換対象の構造体に特化したJITコンパイルを行う JITコンパイル JSONパーサ・シリアライザをJITコンパイルして高速化
Slide 16
Slide 16 text
16 bytedance/sonic はなぜ高速なのか - まとめ 構造体やJSONの構造に応じたJITコンパイルを行う encoding/jsonのパフォーマンス上の弱点を克服 異なるサイズのデータの混在に適応するためのSIMD 自作のasm2asmツールによる高度な最適化 ASTパーサーにおけるLazy Load そのほかにも ... 出典: https://github.com/bytedance/sonic/blob/main/docs/INTRODUCTION.md
Slide 17
Slide 17 text
17 bytedance/sonicの導入事例
Slide 18
Slide 18 text
18 広告配信基盤での bytedance/sonic利用 DMM.com社内で利用される内製の広告配信基盤 社員が登録した広告バナーを、DMMが管理するWebサイトに配信する 広告配信基盤とは DMMが管理するWebサイトに対して、低レイテンシでの広告 配信を実現する bytedance/sonicパッケージが果たす役割
Slide 19
Slide 19 text
19 広告配信基盤のアーキテクチャ 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ
Slide 20
Slide 20 text
20 配信までの大雑把な流れ 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿
Slide 21
Slide 21 text
21 配信までの大雑把な流れ 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿 広告データを 配信サーバに保存
Slide 22
Slide 22 text
22 配信までの大雑把な流れ 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿 広告データを 配信サーバに保存 広告を配信
Slide 23
Slide 23 text
23 もっと詳しく 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ
Slide 24
Slide 24 text
24 もっと詳しく 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿
Slide 25
Slide 25 text
25 もっと詳しく 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿 sonicによるJSON へのエンコード
Slide 26
Slide 26 text
26 もっと詳しく 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿 sonicによるJSON へのエンコード 文字列化された 配信の取り込み
Slide 27
Slide 27 text
27 もっと詳しく 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿 sonicによるJSON へのエンコード 文字列化された 配信の取り込み sonicによる デコード
Slide 28
Slide 28 text
28 もっと詳しく 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ 社員による 広告入稿 sonicによるJSON へのエンコード 文字列化された 配信の取り込み sonicによる デコード リクエストを受けて 動くのはここだけ
Slide 29
Slide 29 text
29 広告配信基盤の速さの秘訣 Cloud SQLに記録された広告情報を、Memorystoreを介して Cloud Runのメモリに保存している 事前に広告情報をメモリにロードしておく 配信サーバが動作するCloud Runの外に広告情報を取りに行かずに 高速に広告情報を返却する リクエストを受けたら、メモリの情報を返却
Slide 30
Slide 30 text
30 広告配信基盤の速さの秘訣 利用者 オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ Cloud SQL 広告データ
Slide 31
Slide 31 text
31 広告配信基盤の速さの秘訣 利用者 オンメモリキャッシュ Cloud Run 配信サーバ メモリ上のJSON Goの構造体 sonicによるデコード
Slide 32
Slide 32 text
32 速いのはわかったけど ... 配信情報が全てサーバのメモリに積まれている メモリに配信情報載せて大丈夫なの? コンテナ起動時にメモリが空だったりとか コンテナ終了時にデータが消えたりとか コンテナはスケールするけど大丈夫なの?
Slide 33
Slide 33 text
33 メモリに配信情報を載せて大丈夫なの? リクエストを受けてメモリから配信を返すということは 全ての配信情報がメモリに積まれており、その中から選んでいる 大量の配信情報によって、メモリが枯渇しないのか? 配信情報をJSON化する時に、文字列を圧縮などしない bytedance/sonicが提供するのは高速なシリアライズのみ
Slide 34
Slide 34 text
34 メモリに配信情報を載せて大丈夫なの? 出典: https://dmm-corp.com/figures/
Slide 35
Slide 35 text
35 メモリに配信情報を載せて大丈夫なの? DMM会員数やリクエスト量はまた別の話 社内用の広告配信基盤では、広告量が膨大にならない メモリの量は配信情報の量
Slide 36
Slide 36 text
36 速いのはわかったけど ... 配信情報が全てサーバのメモリに積まれている メモリに配信情報載せて大丈夫なの? コンテナ起動時にメモリが空だったりとか コンテナ終了時にデータが消えたりとか コンテナはスケールするけど大丈夫なの?
Slide 37
Slide 37 text
37 コンテナはスケールするけど大丈夫なの? プロセス起動時にキャッシュサーバを参照すれば良い コンテナ起動時にメモリが空にならないの? オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ
Slide 38
Slide 38 text
38 コンテナがスケールしても大丈夫 あくまでキャッシュサーバから取得した情報なので問題ない コンテナ終了時にメモリは揮発するけどいいの? オンメモリキャッシュ Cloud Run 配信サーバ Memorystore キャッシュ
Slide 39
Slide 39 text
39 速いのはわかったけど ... 配信情報が全てサーバのメモリに積まれている メモリに配信情報載せて大丈夫なの? コンテナ起動時にメモリが空だったりとか コンテナ終了時にデータが消えたりとか コンテナはスケールするけど大丈夫なの?
Slide 40
Slide 40 text
40 まとめ
Slide 41
Slide 41 text
41 ご清聴ありがとうございました ● bytedance/sonicは高速なJSONシリアライザ ● JITコンパイルにより、reflectのオーバーヘッドを削減 ● DMMの広告配信基盤は、レスポンスの高速化のために3層のデー タを保持するアーキテクチャ ● オンメモリキャッシュのシリアライズにsonicを利用し、高速な広告配 信を実現 まとめ