SlideShare a Scribd company logo
ULS Powered by
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential
Logicadの秒間16万リクエストを処理する
リアルタイム広告配信における、gRPCの活用事例
2018/5/26
ウルシステムズ株式会社
http://www.ulsystems.co.jp
mailto:info@ulsystems.co.jp
Tel: 03-6220-1420 Fax: 03-6220-1402
#jjug_ccc #ccc_a7
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 1
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
アジェンダ
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 2
#jjug_ccc #ccc_a7自己紹介
磯田 浩靖
● 所属:ウルシステムズ株式会社
● 連絡先:hironobu.isoda@ulsystems.co.jp
● twitter:hiroisojp
● 最近の活動:スクラムマスター的な活動
吉井 弘明
● 所属:ウルシステムズ株式会社
● 連絡先:hiroaki.yoshii@ulsystems.co.jp
● 興味:スクラム、機械学習とか
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 3
#jjug_ccc #ccc_a7Logicadについて
● お客様
– ソネット・メディア・ネットワークス株式会社
● 主な事業内容
– DSP事業
● Logicad を提供
● RTBを活用した広告配信最適化
● 機械学習・人工知能を活用したDMPによる広告配信精度の向上
● プロジェクト支援概要
– DSP/RTBシステム開発支援
– VALIS-Engine(機械学習・人工知能)開発支援
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 4
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 5
#jjug_ccc #ccc_a7
● 広告配信はオークション形式で実施
RTB(リアルタイムビッディング)の概要
AD
WebサイトA に、XYZさんが来ました。
誰か広告を出したい方いませんか?
Webサイト
SSP
事業者
DSP3
DSP2
DSP1
3円
2円
1円
ID=XYZ
訪問通知
入札リクエスト
&レスポンス
本日お話する
のはココ
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 6
#jjug_ccc #ccc_a7
● 入札に勝つと広告を表示する権利を得ることができる
● 表示された広告に応じて売上が発生するビジネスモデル
RTB(リアルタイムビッディング)の概要
AD
WebサイトA に、XYZさんが来ました。
誰か広告を出したい方いませんか?
Webサイト
SSP
事業者
DSP3
DSP2
DSP1
3円
2円
1円
ID=XYZ
訪問通知
①広告配信
 リクエスト
本日お話する
のはココ
WIN
②広告配信レスポンス
③Webサイトに
 広告表示用の
 URLを設定
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 7
#jjug_ccc #ccc_a7
● タイムアウトが発生するとオークションに参加できない
性能要求を満たせないと会社の存続に関わる
AD
WebサイトA に、XYZさんが来ました。
誰か広告を出したい方いませんか?
Webサイト
SSP
事業者
DSP3
DSP2
DSP1
3円
2円
1円
ID=XYZ
訪問通知
入札リクエスト
&レスポンス
本日お話する
のはココ
タイムアウトが発生すると
他のDSPに権利をもっていかれて、
ビジネスとして成り立たない!
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 8
#jjug_ccc #ccc_a7
スループット向上
単位時間あたりの処理能力を高めて、
よりたくさん捌く
レイテンシの低減
要求〜結果が返ってくるまでの時間
をできるだけ短くする
Client Server
1回あたりの処理が
高速であること
同時にたくさん
捌くことができること
悩める性能要求
Client ServerClientClient
タイムアウトを減らして売上を確保するためには・・・
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 9
#jjug_ccc #ccc_a7
ネットワークレイテンシ
● ネットワークレイテンシ
● 入札処理のレイテンシ
– 最適な広告を選択する処理
オークションに関わるレイテンシ
入札処理のレイテンシ
SSP
事業者
DSP
最大 100ミリ秒
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 10
#jjug_ccc #ccc_a7ネットワークレイテンシ
● ネットワークレイテンシは一定ではない
65ミリ 100ミリ
ココから先は
タイムアウトになって
しまう
通信相手 往復時間
東京~東京 約1~2ミリ秒
東京~台湾 約65ミリ秒
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 11
#jjug_ccc #ccc_a7オークションのレイテンシ
● 入札処理が加わるとさらにタイムアウトは増える
65ミリ 100ミリ
入札処理が加わって
タイムアウトになった分
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 12
#jjug_ccc #ccc_a7入札処理のレイテンシは平均3ミリ秒!
● Logicadの入札処理は平均3ミリ秒!
– レイテンシを短くできればタイムアウトが減らせる
– 売上につながる
65ミリ 100ミリ
入札処理を短くすることが
できればもっとタイムアウトが
減らせる
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 13
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 14
#jjug_ccc #ccc_a7
・ユーザ情報
・広告予算消化情報
リアルタイムに扱う情報を格納
広告商品情報・・・
 画像URL 、サイズ、LPなど
レイテンシのためローカルに情報を保持
入札サーバ
Java8
Logicadのアーキテクチャ簡略図
SSP
nginx
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
X
X
X
X
・広告キャンペーン情報
事前定義、定期的にロードする
必要がある情報を格納
・アドフラウド情報
3rd Partyから提供された
情報を格納
Aerospike
(KVS)
AWS RDS
Redis
今回これらは
話のスコープ外
広告商品
情報
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 15
#jjug_ccc #ccc_a7
入札サーバ
Java8
gRPC採用前のLogicadにおけるアーキテクチャの課題
SSP
nginx
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
X
X
X
X
広告商品情報
レイテンシ・データモデルの都合上、
全サーバに同一広告商品情報を持つ
データ量が増→スケールアップが必要
ディスク拡張で乗り切る
システムの成長に伴って、広告商品情報の
一部が億オーダーの商品数となり、
各サーバで保持できるサイズを超える入札サーバ
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 16
#jjug_ccc #ccc_a7
・ユーザ情報
・広告予算消化情報
リアルタイムに扱う情報を格納
広告商品情報サーバ
入札サーバ
Java8
To-Be
SSP
nginx
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
X
X
X
X
・広告キャンペーン情報
事前定義、定期的にロードする
必要がある情報を格納
・アドフラウド情報
3rd Partyから提供された
情報を格納
Aerospike
(KVS)
RDS
Redis
現状のレイテンシ&
スループットの維持が必須
外部化が必須
広告商品
情報
広告商品
情報
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 17
#jjug_ccc #ccc_a7
レイテンシの低減
1. 広告商品情報サーバ接続処理による遅延がないこと
To-Be を実現する上での要件
広告商品情報
サーバ
入札サーバ
スループット向上
1. コネクション増加による処理数低下が起きないこと
2. ロードバランシングできること
ココの遅延
広告商品情報
サーバ
入札サーバ
ココの処理数
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 18
#jjug_ccc #ccc_a7
・ユーザ情報
・広告予算消化情報
リアルタイムに扱う情報を格納
広告商品情報サーバ
Java8
gRPC-Java
入札サーバ
Java8
gRPC-Java
gRPC採用後のLogicadのアーキテクチャ簡略図
SSP
nginx
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
X
X
X
X
・広告キャンペーン情報
事前定義、定期的にロードする
必要がある情報を格納
・アドフラウド情報
3rd Partyから提供された
情報を格納
Aerospike
(KVS)
RDS
Redis
今回はココを
gRPCで構築
広告商品
情報
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 19
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 20
#jjug_ccc #ccc_a7
# ソリューション レイテンシ スループット 検討結果
1
シングルスレッドで動作
するため、
スループットに影響あり
2
データがシャーディング
されており、
分散しているとレイテンシに
影響あり
3
後述
● 選定の候補
gRPCの選定
+ ローカルDB
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 21
#jjug_ccc #ccc_a7
● スループットの観点で不採用
– シングルスレッドで動作し複数の処理を並列で処理できない
Redisを採用しなかった理由
入札サーバ
入札サーバ
入札サーバ Command 1Command 2Command 3
1スレッドで順番に処理
= ブロッキングされて、スループットに影響
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 22
#jjug_ccc #ccc_a7
● レイテンシの観点で不採用
– データがシャーディングされているため複数回の通信が発生してしまう
Aerospikeを採用しなかった理由
入札サーバ
id=5,120,200 の
広告商品情報を取得する
Aerospike Cluster
Cluster1
id:1~99 の
データを格納
Cluster2
id:100~199 の
データを格納
Cluster3
id:200~299 の
データを格納
id=5
を取得 id=120
を取得
id=200
を取得
3回通信が必要
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 23
#jjug_ccc #ccc_a7
そこでgRPC
サーバ間通信で広告商品情報を
高速かつ同時に多数処理できる何かが必要!
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 24
#jjug_ccc #ccc_a7
● gRPC = Googleが開発した高速なRPCフレームワーク
– HTTP/2, Protocol Buffersを用いて高速化
● 採用事例
– Google, Netflix, Docker, Cisco etc
gRPCとは?
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 25
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 26
#jjug_ccc #ccc_a7
● HTTP/2
– バイナリフレーム
– ヘッダー圧縮
– 非 SSL
● Protocol Buffers
– データ圧縮
gRPCのよいところ
● HTTP/2
– 多重化
(マルチプレキシング)
● クライアントサイド
ロードバランシング
レイテンシの低減 スループット向上
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 27
#jjug_ccc #ccc_a7
● HTTP/2
– バイナリフレーム
– ヘッダー圧縮
– 非 SSL
● Protocol Buffers
– データ圧縮
gRPCのよいところ
レイテンシの低減 スループット向上
● HTTP/2
– 多重化
(マルチプレキシング)
● クライアントサイド
ロードバランシング
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 28
#jjug_ccc #ccc_a7
● バイナリフレームによる効率化で高速な通信ができる
– 受信側のTCPソケットのバッファをすばやく空にでき、
次のデータを高速にリクエストできる
– バイナリなのでヘッダーのデータサイズが小さい
レイテンシの低減:HTTP/2 バイナリフレーム
Network(IP)
Transport(TCP)
Session(TLS)[Optional]
POST: /upload
HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length:27
{“msg”: “Welcom to JJUG!”}
Application(HTTP/2)
Binary Framing
HEADERS Frame
DATA Frame
HTTP/1.1
HTTP/2
ヘッダーとボディはそ
れぞれフレームとして
扱われる
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 29
#jjug_ccc #ccc_a7
● ヘッダーをインデックス化(辞書化)することで、データ
サイズが小さくなる
レイテンシの低減:HTTP/2 ヘッダー圧縮
:method GET
:scheme https
:host example.com
:path /new_resource
accept image/jpeg
user-agent Mozilla/...
Req #1 Req #2
:method GET
:scheme https
:host example.com
:path /resource
accept image/jpeg
user-agent Mozilla/...
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 30
#jjug_ccc #ccc_a7
インデックス化後イメージ
● ヘッダーをインデックス化(辞書化)することで、データ
サイズが小さくなる
レイテンシの低減:HTTP/2 ヘッダー圧縮
index header value
2 :method GET
3 :method POST
7 :scheme https
・・ ・・・ ・・・
静的テーブル
頻出するものは事前
にインデックス化
されている
:method: GET
:scheme: https
:host: example.com
:path: /resource
accept: image/jpeg
user-agent: Mozilla/...
2
7
:host: example.com
:path: /resource
accept: image/jpeg
user-agent: Mozilla/...
インデックス化前イメージ
Req #1
:method GET
:scheme https
:host example.com
:path /resource
accept image/jpeg
user-agent Mozilla/...
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 31
#jjug_ccc #ccc_a7
動的テーブル
● ヘッダーをインデックス化(辞書化)することで、データ
サイズが小さくなる
レイテンシの低減:HTTP/2 ヘッダー圧縮
index header value
62 :host example.com
63 accept image/jpeg
64 user-agent Mozilla/...
index header value
2 :method GET
3 :method POST
7 :scheme https
・・ ・・・ ・・・
静的テーブル
インデックス化後イメージ
:method: GET
:scheme: https
:host: example.com
:path: /resource
accept: image/jpeg
user-agent: Mozilla/...
2
7
62
:path: /new_resource
63
64
インデックス化前イメージ
:method GET
:scheme https
:host example.com
:path /new_resource
accept image/jpeg
user-agent Mozilla/...
Req #2
Req#1での既出分が
インデックス化され、
次のReqでは
インデックス値を送信
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 32
#jjug_ccc #ccc_a7
● h2c を用いることでより一層の高速化が可能
– h2c = HTTP/2 over TCP = 平文による TLS を使わない通信
– 内部ネットワークのみであれば TLS を使わない通信を採用できる
– TLS のオーバーヘッドを削除できるため高速
レイテンシの低減:HTTP/2 非SSL
gRPC
Client
gRPC
Server
h2c(cleartext) request
response(s)
証明書のやりとり
暗号化・復号化に関わる
処理がないので高速
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 33
#jjug_ccc #ccc_a7
● gRPC-javaの場合、利用時にusePlainTextメソッドを
呼び出すだけでOK
レイテンシの低減:HTTP/2 非SSL
ManagedChannel channel = ManagedChannelBuilder
.forAddress(host, port)
.usePlainText(true)
.build();
GreeterBlockingStub blockingStub = GreeterGrpc.newBlockingStub(channel);
HelloRequest request = HelloRequest.newBuilder().setName(name).build();
HelloReply response = blockingStub.sayHello(request);
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 34
#jjug_ccc #ccc_a7
● HTTP/2
– 多重化
(マルチプレキシング)
● クライアントサイド
ロードバランシング
● HTTP/2
– バイナリフレーム
– ヘッダー圧縮
– 非 SSL
● Protocol Buffers
– データ圧縮
gRPCのよいところ
レイテンシの低減 スループット向上
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 35
#jjug_ccc #ccc_a7
● 1つのTCPコネクションで数万接続でも並列化が可能
– TCPコネクション中でストリームを用いて並列化
– ストリームはTCPのようなハンドシェイクが不要であるため、オーバーヘッドを
削減することが可能
スループット向上:HTTP/2 マルチプレキシング
Client Server
stream 3
HEADERS
stream 3
DATA
stream 1
DATA
・・・
stream 5
DATA
stream idでデータを
見分けることができる
途中に別のstreamが
挟まってもOK
stream 1
DATA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 36
#jjug_ccc #ccc_a7
● HTTP/2では並列処理でブロックされない
– stream idで見分けることができ、順序の意識が不要になる
前の処理が
完了しないと次
の処理を
行えない
スループット向上:HTTP/2 マルチプレキシング
HTTP/2
Client Server
HTTP/1.1 パイプライン
順番に処理する必要
があるため、
ブロッキングされる
ブロックされずに
処理できる
Client Server
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 37
#jjug_ccc #ccc_a7
● HTTP/2
– バイナリフレーム
– ヘッダー圧縮
– 非 SSL
● Protocol Buffers
– データ圧縮
gRPCのよいところ
レイテンシの低減 スループット向上
● HTTP/2
– 多重化
(マルチプレキシング)
● クライアントサイド
ロードバランシング
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 38
#jjug_ccc #ccc_a7
● Protocol Buffers
– Google 社製のシリアライザ
– IDLにより、言語に応じたメッセージオブジェクトが自動生成でき
– gRPC ではデフォルトで Protocol Buffers が使用できる
Protocol Buffers
message ProductMastersRequest {
int64 product_group_id = 1;
int32 product1_quantity_at_most = 2;
repeated int64 product1_ids = 3;
int32 product2_quantity_at_most = 4;
repeated int64 product2_ids = 5;
}
IDL
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 39
#jjug_ccc #ccc_a7
● データ圧縮効率が高い
– フィールド名をデータとして持たずに tag を使う
– 文字列より数値型を扱うように設計した方がより圧縮率が高まる
レイテンシの低減:Protocol Buffers データ圧縮効率
シリアライズ前
シリアライズ後
product_group_id = 1122
product1_quantity_at_most = 3
product1_ids = 103,999,101
product2_quantity_at_most = 4
product2_ids = 106,105,998,104
「72byte + フィールド名」のデータを
17 byte に圧縮
tag ≒ index
message ProductMastersRequest {
int64 product_group_id = 1;
int32 product1_quantity_at_most = 2;
repeated int64 product1_ids = 3;
int32 product2_quantity_at_most = 4;
repeated int64 product2_ids = 5;
}
IDL
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 40
#jjug_ccc #ccc_a7
● HTTP/2
– バイナリフレーム
– ヘッダー圧縮
– 非 SSL
● Protocol Buffers
– データ圧縮
gRPCのよいところ
レイテンシの低減 スループット向上
● HTTP/2
– 多重化
(マルチプレキシング)
● クライアントサイド
ロードバランシング
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 41
#jjug_ccc #ccc_a7
gRPC Client
● ロードバランシングの設定が容易
– 動的なgRPC サーバの追加・削除が容易
– DNSレコードを削除したサーバに自動的にリクエストが送られなくなる
– nginx など外部のロードバランサが不要で管理が楽
スループット向上:クライアントロードバランシング
Name Resolver
(DNS)
gRPC Client grpclb policy
gRPC Server gRPC Server gRPC Server
Load
Balancer
今回はここを拡張して、
動的なgRPCサーバの
追加に対応
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 42
#jjug_ccc #ccc_a7
● 現状のgRPC-java単独の仕組みでは動的なgRPCサーバの増減に対してうまく
機能しない
● 独自の仕組みや、他のロードバランシング機能を提供するライブラリとの組み合わ
せも考慮されているが、 Logicad では使われていないため不採用
1. grpc-eureka-java
2. grpc-consul
3. grpc-zookeeper
(注:これらはサードパーティのOSSです)
● 今回は定期的にサーバリストを更新する
NameResolverを作成して対応した
Tips:クライアントロードバランシング
RefreshableNameResolverProvider
nameResolverProvider = ...
ManagedChannel channel =
ManagedChannelBuilder
.forAddress(host, port)
.usePlainText(true)
.nameResolverFactory(nameResolverProvider)
.loadBalancerFactory(
RoundRobinLoadBalancerFactory
.getInstance()
)
.build();
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 43
#jjug_ccc #ccc_a7
import io.grpc.Attributes;
import io.grpc.NameResolver;
import io.grpc.NameResolverProvider;
import io.grpc.internal.DnsNameResolverProvider;
@Singleton
public class RefreshableNameResolverProvider extends
NameResolverProvider {
private static final int _priority = 5;
private final DnsNameResolverProvider _delegate =
new DnsNameResolverProvider();
private final MutableList<NameResolver> _resolvers = Lists.mutable.of();
@Override
public NameResolver newNameResolver(
final URI targetUri, final Attributes params) {
final NameResolver r = _delegate.newNameResolver(targetUri, params);
if (r != null) {
_resolvers.add(r);
}
return r;
}
● サーバリストを更新するNameResolverのサンプル
Tips:クライアントロードバランシング
@Override
public String getDefaultScheme() {
return _delegate.getDefaultScheme();
}
@Override
protected boolean isAvailable() {
return true;
}
@Override
protected int priority() {
return _priority;
}
public void refresh() {
for (final NameResolver r : _resolvers) {
r.refresh();
}
}
}
①複数のgRPCサーバ
の接続情報を登録
②API or 定期実行で
サーバリストを更新
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 44
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 45
#jjug_ccc #ccc_a7
レイテンシの低減
1. 広告商品情報サーバ接続処理による遅延がないこと
To-Be を実現する上での要件
広告商品情報
サーバ
入札サーバ
スループット向上
1. コネクション増加による処理数低下が起きないこと
2. ロードバランシングできること
ココの遅延
広告商品情報
サーバ
入札サーバ
ココの処理数
再掲
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 46
#jjug_ccc #ccc_a7
スループット向上
1. コネクション増加による処理数低下が起きないこと
2. ロードバランシングできること
● HTTP/2 による並列化
● クライアントサイドロードバランシング
レイテンシの低減
1. 広告商品情報サーバ接続処理による遅延がないこと
To-Be を実現する上での要件は達成できそうか?
● HTTP/2 による高速な通信
● Protocol Buffers によるデータ圧縮
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 47
#jjug_ccc #ccc_a7
● 1. 広告配信サーバのストレステスト
– 最大のスループット、Connection数の変化を測定
● 2. 負荷試験環境でのレイテンシ、スループットの測定
– 入札の一連の処理に関するレイテンシ、スループットを測定
ベンチマーク
ストレステスト
負荷試験環境での
レイテンシ、スループット測定
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 48
#jjug_ccc #ccc_a7
● gRPCでもJMeterを用いて負荷をかけることが可能
● JavaSamplerClientを実装したクラスを用意して任意のプロトコルをリ
クエストすることが可能
@Override
public SampleResult runTest(final JavaSamplerContext context) {
HelloRequest request = HelloRequest.newBuilder()
.setName(context.getParameter("param_name"))
.build();
final SampleResult result = new SampleResult();
result.setDataEncoding(StandardCharsets.UTF_8.toString());
result.setDataType(SampleResult.BINARY);
result.setSamplerData(StringUtils.EMPTY);
result.sampleStart();
client.sayHello(request);
result.sampleEnd();
result.setSuccessful(true);
result.setResponseCodeOK();
result.setResponseData(StringUtils.EMPTY,StandardCharsets.UTF_8.toString());
return result;
}
Tips:ストレステスト時の負荷のかけ方
public class GrpcHelloSampler extends AbstractJavaSamplerClient {
private GreeterBlockingStub client;
@Override
public void setupTest(final JavaSamplerContext context) {
super.setupTest(context);
JMeterVariables variables = JMeterContextService.getContext().getVariables();
String host = variables.get("grpc_host");
int port = Integer.parseInt(variables.get("grpc_port"));
GreeterBlockingStub stub = getClient(host, port);
this.client = stub;
}
①setupTestでgRPC
クライアントのインスタン
スを生成
②runTestでgRPC
クライアントを呼び出
して処理するだけ
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 49
#jjug_ccc #ccc_a7
● 環境
– サーバ
● 広告配信サーバ x 1台
– Java8
– メモリ128GB
– 8core/16thread
– NW
● 10GbE
● 扱う広告商品情報
– 件数:1億件
– サイズ:1.6TB
ベンチマーク(ストレステスト)
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 50
#jjug_ccc #ccc_a7
● スループット
– 比較的軽い処理の場合、秒間7万件程度
– データ量に応じて処理件数は変わるが秒間数万件の問題なく処理できる
ベンチマーク(ストレステスト)
30商品
高負荷
レアなデータ量
3商品
低負荷
ややありうる
データ量
秒間の処理件数
(10k=秒間1万件)
15商品
中負荷
通常のデータ量
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 51
#jjug_ccc #ccc_a7
● Connection
– データ量、スループットに関係なくConnection数は一定
– HTTP/2のマルチプレキシングにより少ないTCPコネクションで処理できる
ベンチマーク(ストレステスト)
Connection数は
スループットに比例せず一定
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 52
#jjug_ccc #ccc_a7
● 負荷試験環境
– サーバ
● 入札サーバ
– Java8
– メモリ30GB
– 14core/28thread x 2cpu
● 広告配信サーバ
– Java8
– メモリ128GB
– 8core/16thread
– NW
● 10GbE
● 扱う広告商品情報
– 件数:1億件
– サイズ:1.6TB
ベンチマーク(レイテンシ、スループット)
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 53
#jjug_ccc #ccc_a7
● gRPC対応前後で、レイテンシ・スループットは全体の僅か
1割程度の変化に収まった
○ gRPC 化前 : 広告商品情報を入札サーバに持たせた状態
○ gRPC 化後 : 入札サーバから広告商品情報サーバに外部化した状態
ベンチマーク(レイテンシ、スループット)
# 計測対象 レイテンシ(ミリ秒) スループット(秒間処理件数)
平均 50perc
entile
99perc
entile
1分間
平均
5分間
平均
15分間
平均
1 gRPC 化前 2.04 1.84 9.47 3,732 3,201 2,382
2 gRPC 化後 2.14 1.83 6.79 3,345 3,463 3,501
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 54
#jjug_ccc #ccc_a7
1. 自己紹介
2. Logicadについて
3. 今回のシステムと業界
4. 今回のシステムのアーキテクチャと背景
5. gRPCと他の選定候補
6. gRPCのよいところ
7. gRPCを実際に適用してみた結果
8. まとめ
9. QA
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 55
#jjug_ccc #ccc_a7
・ユーザ情報
・広告予算消化情報
リアルタイムに扱う情報を格納
広告商品情報サーバ
Java8
gRPC-Java
入札サーバ
Java8
gRPC-Java
まとめ
SSP
nginx
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
入札サーバ
X
X
X
X
・広告キャンペーン情報
事前定義、定期的にロードする
必要がある情報を格納
・アドフラウド情報
3rd Partyから提供された
情報を格納
Aerospike
(KVS)
RDS
Redis
今回はここをgRPCで構築
ローカル処理を外部化しても
0.1ミリ秒の遅延に収まった
広告商品
情報
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 56
#jjug_ccc #ccc_a7まとめ
● 億オーダーの商品情報を gRPC で扱っても
簡単に導入でき、なおかつ速い
● 性能要求の高いシステムでも gRPC おすすめ
# gRPC の特徴 導入結果
1 HTTP/2 : 高速な通信 数万のスループットでも同時に並列処理を実現
レイテンシの悪化によるタイムアウトはほぼ無し
レイテンシ・スループットのビジネス要求を達成
2 Protocol Buffers :
効率的なシリアライズ
3 ロードバランシング 簡単な拡張で動的なロードバランシングを実現
ULS
Copyright © 2011-2018 UL Systems, Inc. All rights reserved.
Proprietary & Confidential Powered by 57
#jjug_ccc #ccc_a7
お問い合わせ先
mailto: info@ulsystems.co.jp
https://www.ulsystems.co.jp/
Ad

More Related Content

What's hot (20)

JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
Narichika Kajihara
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
User storymapping in 10 minutes
User storymapping in 10 minutesUser storymapping in 10 minutes
User storymapping in 10 minutes
Yasunobu Kawaguchi
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
 
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
Hironobu Isoda
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
 
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム SakashoについてDeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
Makoto Haruyama
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 
JIRA / Confluence の 必須プラグインはこれだ
JIRA / Confluence の必須プラグインはこれだJIRA / Confluence の必須プラグインはこれだ
JIRA / Confluence の 必須プラグインはこれだ
Narichika Kajihara
 
分散システムについて語らせてくれ
分散システムについて語らせてくれ分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
 
シリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのかシリコンバレーの「何が」凄いのか
シリコンバレーの「何が」凄いのか
Atsushi Nakada
 
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
 
新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編新入社員のための大規模ゲーム開発入門 サーバサイド編
新入社員のための大規模ゲーム開発入門 サーバサイド編
infinite_loop
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
Hiroshi Tokumaru
 
Dockerからcontainerdへの移行
Dockerからcontainerdへの移行Dockerからcontainerdへの移行
Dockerからcontainerdへの移行
Akihiro Suda
 
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYOFINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
 
GraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ることGraphQLのsubscriptionで出来ること
GraphQLのsubscriptionで出来ること
Shingo Fukui
 
Redisの特徴と活用方法について
Redisの特徴と活用方法についてRedisの特徴と活用方法について
Redisの特徴と活用方法について
Yuji Otani
 
User storymapping in 10 minutes
User storymapping in 10 minutesUser storymapping in 10 minutes
User storymapping in 10 minutes
Yasunobu Kawaguchi
 
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
スマホゲームのチート手法とその対策 [DeNA TechCon 2019]
DeNA
 
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
 
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
OpenAPI 3.0でmicroserviceのAPI定義を試みてハマった話
Daichi Koike
 
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
200,000 Req/sec をさばく広告入札システムを支えるパフォーマンスチューニング術 #jjug_ccc #ccc_g6
Hironobu Isoda
 
何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門何となく勉強した気分になれるパーサ入門
何となく勉強した気分になれるパーサ入門
masayoshi takahashi
 
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム SakashoについてDeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
DeNAオリジナル ゲーム専用プラットフォーム Sakashoについて
Makoto Haruyama
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
KageShiron
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
Akihiro Suda
 

Similar to Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例 (20)

drecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battledrecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battle
Mitsuki Kenichi
 
HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方
Hiroshi Nakamura
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
Yosuke Hiraishi
 
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコシステムズ合同会社
 
130522 01
130522 01130522 01
130522 01
openrtm
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要
Chihiro Ito
 
Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用までPacketbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Satoyuki Tsukano
 
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
Drecom Co., Ltd.
 
ROBOMECH2023 RTミドルウェア講習会 第1部
ROBOMECH2023 RTミドルウェア講習会 第1部ROBOMECH2023 RTミドルウェア講習会 第1部
ROBOMECH2023 RTミドルウェア講習会 第1部
openrtm
 
NIFcLab Tech Laboratoryはじめます(もうすぐ)
NIFcLab Tech Laboratoryはじめます(もうすぐ)NIFcLab Tech Laboratoryはじめます(もうすぐ)
NIFcLab Tech Laboratoryはじめます(もうすぐ)
富士通クラウドテクノロジーズ株式会社
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
Takanori Suzuki
 
フロー技術によるネットワーク管理
フロー技術によるネットワーク管理フロー技術によるネットワーク管理
フロー技術によるネットワーク管理
Motonori Shindo
 
【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策
【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策
【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策
Juniper Networks (日本)
 
FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化
Kazunori Sato
 
Autonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーションAutonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーション
オラクルエンジニア通信
 
ソフトウェアが可能する新しいネッワークの 未来と提供する価値:ユースケース
ソフトウェアが可能する新しいネッワークの 未来と提供する価値:ユースケースソフトウェアが可能する新しいネッワークの 未来と提供する価値:ユースケース
ソフトウェアが可能する新しいネッワークの 未来と提供する価値:ユースケース
エクストリーム ネットワークス / Extreme Networks Japan
 
ICD/CPSY 201412
ICD/CPSY 201412ICD/CPSY 201412
ICD/CPSY 201412
Takefumi MIYOSHI
 
RTミドルウエア: OpenRTM-aist概要
RTミドルウエア: OpenRTM-aist概要 RTミドルウエア: OpenRTM-aist概要
RTミドルウエア: OpenRTM-aist概要
openrtm
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
Yosuke Mizutani
 
1.コース概要
1.コース概要1.コース概要
1.コース概要
openrtm
 
drecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battledrecomにおけるwinning the metrics battle
drecomにおけるwinning the metrics battle
Mitsuki Kenichi
 
HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方HSM用ミドルウェア Conduit Toolkitの概要と使い方
HSM用ミドルウェア Conduit Toolkitの概要と使い方
Hiroshi Nakamura
 
ドリコムのInfrastructure as code
ドリコムのInfrastructure as codeドリコムのInfrastructure as code
ドリコムのInfrastructure as code
Yosuke Hiraishi
 
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコ装置を使い倒す!組込み機能による可視化からセキュリティ強化
シスコシステムズ合同会社
 
130522 01
130522 01130522 01
130522 01
openrtm
 
Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要Oracle code one 2018 報告会概要
Oracle code one 2018 報告会概要
Chihiro Ito
 
Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用までPacketbeatの基礎から、IoTデバイス異常検知への応用まで
Packetbeatの基礎から、IoTデバイス異常検知への応用まで
Satoyuki Tsukano
 
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
CEDEC 2015 IoT向け汎用protocol MQTTのリアルタイムゲーム通信利用と実装、そして未来へ…
Drecom Co., Ltd.
 
ROBOMECH2023 RTミドルウェア講習会 第1部
ROBOMECH2023 RTミドルウェア講習会 第1部ROBOMECH2023 RTミドルウェア講習会 第1部
ROBOMECH2023 RTミドルウェア講習会 第1部
openrtm
 
マイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karateマイクロサービスにおけるテスト自動化 with Karate
マイクロサービスにおけるテスト自動化 with Karate
Takanori Suzuki
 
フロー技術によるネットワーク管理
フロー技術によるネットワーク管理フロー技術によるネットワーク管理
フロー技術によるネットワーク管理
Motonori Shindo
 
【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策
【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策
【Interop Tokyo 2015】最新セキュリティサーベイからみるトレンドと解決策
Juniper Networks (日本)
 
FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化FPGAによる大規模データ処理の高速化
FPGAによる大規模データ処理の高速化
Kazunori Sato
 
Autonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーションAutonomous を支える技術、Oracle Database 18c デモンストレーション
Autonomous を支える技術、Oracle Database 18c デモンストレーション
オラクルエンジニア通信
 
RTミドルウエア: OpenRTM-aist概要
RTミドルウエア: OpenRTM-aist概要 RTミドルウエア: OpenRTM-aist概要
RTミドルウエア: OpenRTM-aist概要
openrtm
 
アドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニングアドテク×Scala×パフォーマンスチューニング
アドテク×Scala×パフォーマンスチューニング
Yosuke Mizutani
 
1.コース概要
1.コース概要1.コース概要
1.コース概要
openrtm
 
Ad

Logicadの秒間16万リクエストをさばく広告入札システムにおける、gRPCの活用事例

  • 1. ULS Powered by Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Logicadの秒間16万リクエストを処理する リアルタイム広告配信における、gRPCの活用事例 2018/5/26 ウルシステムズ株式会社 http://www.ulsystems.co.jp mailto:[email protected] Tel: 03-6220-1420 Fax: 03-6220-1402 #jjug_ccc #ccc_a7
  • 2. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 1 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA アジェンダ
  • 3. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 2 #jjug_ccc #ccc_a7自己紹介 磯田 浩靖 ● 所属:ウルシステムズ株式会社 ● 連絡先:[email protected] ● twitter:hiroisojp ● 最近の活動:スクラムマスター的な活動 吉井 弘明 ● 所属:ウルシステムズ株式会社 ● 連絡先:[email protected] ● 興味:スクラム、機械学習とか
  • 4. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 3 #jjug_ccc #ccc_a7Logicadについて ● お客様 – ソネット・メディア・ネットワークス株式会社 ● 主な事業内容 – DSP事業 ● Logicad を提供 ● RTBを活用した広告配信最適化 ● 機械学習・人工知能を活用したDMPによる広告配信精度の向上 ● プロジェクト支援概要 – DSP/RTBシステム開発支援 – VALIS-Engine(機械学習・人工知能)開発支援
  • 5. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 4 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA
  • 6. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 5 #jjug_ccc #ccc_a7 ● 広告配信はオークション形式で実施 RTB(リアルタイムビッディング)の概要 AD WebサイトA に、XYZさんが来ました。 誰か広告を出したい方いませんか? Webサイト SSP 事業者 DSP3 DSP2 DSP1 3円 2円 1円 ID=XYZ 訪問通知 入札リクエスト &レスポンス 本日お話する のはココ
  • 7. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 6 #jjug_ccc #ccc_a7 ● 入札に勝つと広告を表示する権利を得ることができる ● 表示された広告に応じて売上が発生するビジネスモデル RTB(リアルタイムビッディング)の概要 AD WebサイトA に、XYZさんが来ました。 誰か広告を出したい方いませんか? Webサイト SSP 事業者 DSP3 DSP2 DSP1 3円 2円 1円 ID=XYZ 訪問通知 ①広告配信  リクエスト 本日お話する のはココ WIN ②広告配信レスポンス ③Webサイトに  広告表示用の  URLを設定
  • 8. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 7 #jjug_ccc #ccc_a7 ● タイムアウトが発生するとオークションに参加できない 性能要求を満たせないと会社の存続に関わる AD WebサイトA に、XYZさんが来ました。 誰か広告を出したい方いませんか? Webサイト SSP 事業者 DSP3 DSP2 DSP1 3円 2円 1円 ID=XYZ 訪問通知 入札リクエスト &レスポンス 本日お話する のはココ タイムアウトが発生すると 他のDSPに権利をもっていかれて、 ビジネスとして成り立たない!
  • 9. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 8 #jjug_ccc #ccc_a7 スループット向上 単位時間あたりの処理能力を高めて、 よりたくさん捌く レイテンシの低減 要求〜結果が返ってくるまでの時間 をできるだけ短くする Client Server 1回あたりの処理が 高速であること 同時にたくさん 捌くことができること 悩める性能要求 Client ServerClientClient タイムアウトを減らして売上を確保するためには・・・
  • 10. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 9 #jjug_ccc #ccc_a7 ネットワークレイテンシ ● ネットワークレイテンシ ● 入札処理のレイテンシ – 最適な広告を選択する処理 オークションに関わるレイテンシ 入札処理のレイテンシ SSP 事業者 DSP 最大 100ミリ秒
  • 11. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 10 #jjug_ccc #ccc_a7ネットワークレイテンシ ● ネットワークレイテンシは一定ではない 65ミリ 100ミリ ココから先は タイムアウトになって しまう 通信相手 往復時間 東京~東京 約1~2ミリ秒 東京~台湾 約65ミリ秒
  • 12. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 11 #jjug_ccc #ccc_a7オークションのレイテンシ ● 入札処理が加わるとさらにタイムアウトは増える 65ミリ 100ミリ 入札処理が加わって タイムアウトになった分
  • 13. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 12 #jjug_ccc #ccc_a7入札処理のレイテンシは平均3ミリ秒! ● Logicadの入札処理は平均3ミリ秒! – レイテンシを短くできればタイムアウトが減らせる – 売上につながる 65ミリ 100ミリ 入札処理を短くすることが できればもっとタイムアウトが 減らせる
  • 14. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 13 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA
  • 15. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 14 #jjug_ccc #ccc_a7 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 広告商品情報・・・  画像URL 、サイズ、LPなど レイテンシのためローカルに情報を保持 入札サーバ Java8 Logicadのアーキテクチャ簡略図 SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) AWS RDS Redis 今回これらは 話のスコープ外 広告商品 情報
  • 16. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 15 #jjug_ccc #ccc_a7 入札サーバ Java8 gRPC採用前のLogicadにおけるアーキテクチャの課題 SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X 広告商品情報 レイテンシ・データモデルの都合上、 全サーバに同一広告商品情報を持つ データ量が増→スケールアップが必要 ディスク拡張で乗り切る システムの成長に伴って、広告商品情報の 一部が億オーダーの商品数となり、 各サーバで保持できるサイズを超える入札サーバ
  • 17. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 16 #jjug_ccc #ccc_a7 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 広告商品情報サーバ 入札サーバ Java8 To-Be SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) RDS Redis 現状のレイテンシ& スループットの維持が必須 外部化が必須 広告商品 情報 広告商品 情報
  • 18. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 17 #jjug_ccc #ccc_a7 レイテンシの低減 1. 広告商品情報サーバ接続処理による遅延がないこと To-Be を実現する上での要件 広告商品情報 サーバ 入札サーバ スループット向上 1. コネクション増加による処理数低下が起きないこと 2. ロードバランシングできること ココの遅延 広告商品情報 サーバ 入札サーバ ココの処理数
  • 19. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 18 #jjug_ccc #ccc_a7 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 広告商品情報サーバ Java8 gRPC-Java 入札サーバ Java8 gRPC-Java gRPC採用後のLogicadのアーキテクチャ簡略図 SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) RDS Redis 今回はココを gRPCで構築 広告商品 情報
  • 20. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 19 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA
  • 21. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 20 #jjug_ccc #ccc_a7 # ソリューション レイテンシ スループット 検討結果 1 シングルスレッドで動作 するため、 スループットに影響あり 2 データがシャーディング されており、 分散しているとレイテンシに 影響あり 3 後述 ● 選定の候補 gRPCの選定 + ローカルDB
  • 22. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 21 #jjug_ccc #ccc_a7 ● スループットの観点で不採用 – シングルスレッドで動作し複数の処理を並列で処理できない Redisを採用しなかった理由 入札サーバ 入札サーバ 入札サーバ Command 1Command 2Command 3 1スレッドで順番に処理 = ブロッキングされて、スループットに影響
  • 23. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 22 #jjug_ccc #ccc_a7 ● レイテンシの観点で不採用 – データがシャーディングされているため複数回の通信が発生してしまう Aerospikeを採用しなかった理由 入札サーバ id=5,120,200 の 広告商品情報を取得する Aerospike Cluster Cluster1 id:1~99 の データを格納 Cluster2 id:100~199 の データを格納 Cluster3 id:200~299 の データを格納 id=5 を取得 id=120 を取得 id=200 を取得 3回通信が必要
  • 24. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 23 #jjug_ccc #ccc_a7 そこでgRPC サーバ間通信で広告商品情報を 高速かつ同時に多数処理できる何かが必要!
  • 25. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 24 #jjug_ccc #ccc_a7 ● gRPC = Googleが開発した高速なRPCフレームワーク – HTTP/2, Protocol Buffersを用いて高速化 ● 採用事例 – Google, Netflix, Docker, Cisco etc gRPCとは?
  • 26. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 25 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA
  • 27. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 26 #jjug_ccc #ccc_a7 ● HTTP/2 – バイナリフレーム – ヘッダー圧縮 – 非 SSL ● Protocol Buffers – データ圧縮 gRPCのよいところ ● HTTP/2 – 多重化 (マルチプレキシング) ● クライアントサイド ロードバランシング レイテンシの低減 スループット向上
  • 28. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 27 #jjug_ccc #ccc_a7 ● HTTP/2 – バイナリフレーム – ヘッダー圧縮 – 非 SSL ● Protocol Buffers – データ圧縮 gRPCのよいところ レイテンシの低減 スループット向上 ● HTTP/2 – 多重化 (マルチプレキシング) ● クライアントサイド ロードバランシング
  • 29. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 28 #jjug_ccc #ccc_a7 ● バイナリフレームによる効率化で高速な通信ができる – 受信側のTCPソケットのバッファをすばやく空にでき、 次のデータを高速にリクエストできる – バイナリなのでヘッダーのデータサイズが小さい レイテンシの低減:HTTP/2 バイナリフレーム Network(IP) Transport(TCP) Session(TLS)[Optional] POST: /upload HTTP/1.1 Host: www.example.com Content-Type: application/json Content-Length:27 {“msg”: “Welcom to JJUG!”} Application(HTTP/2) Binary Framing HEADERS Frame DATA Frame HTTP/1.1 HTTP/2 ヘッダーとボディはそ れぞれフレームとして 扱われる
  • 30. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 29 #jjug_ccc #ccc_a7 ● ヘッダーをインデックス化(辞書化)することで、データ サイズが小さくなる レイテンシの低減:HTTP/2 ヘッダー圧縮 :method GET :scheme https :host example.com :path /new_resource accept image/jpeg user-agent Mozilla/... Req #1 Req #2 :method GET :scheme https :host example.com :path /resource accept image/jpeg user-agent Mozilla/...
  • 31. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 30 #jjug_ccc #ccc_a7 インデックス化後イメージ ● ヘッダーをインデックス化(辞書化)することで、データ サイズが小さくなる レイテンシの低減:HTTP/2 ヘッダー圧縮 index header value 2 :method GET 3 :method POST 7 :scheme https ・・ ・・・ ・・・ 静的テーブル 頻出するものは事前 にインデックス化 されている :method: GET :scheme: https :host: example.com :path: /resource accept: image/jpeg user-agent: Mozilla/... 2 7 :host: example.com :path: /resource accept: image/jpeg user-agent: Mozilla/... インデックス化前イメージ Req #1 :method GET :scheme https :host example.com :path /resource accept image/jpeg user-agent Mozilla/...
  • 32. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 31 #jjug_ccc #ccc_a7 動的テーブル ● ヘッダーをインデックス化(辞書化)することで、データ サイズが小さくなる レイテンシの低減:HTTP/2 ヘッダー圧縮 index header value 62 :host example.com 63 accept image/jpeg 64 user-agent Mozilla/... index header value 2 :method GET 3 :method POST 7 :scheme https ・・ ・・・ ・・・ 静的テーブル インデックス化後イメージ :method: GET :scheme: https :host: example.com :path: /resource accept: image/jpeg user-agent: Mozilla/... 2 7 62 :path: /new_resource 63 64 インデックス化前イメージ :method GET :scheme https :host example.com :path /new_resource accept image/jpeg user-agent Mozilla/... Req #2 Req#1での既出分が インデックス化され、 次のReqでは インデックス値を送信
  • 33. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 32 #jjug_ccc #ccc_a7 ● h2c を用いることでより一層の高速化が可能 – h2c = HTTP/2 over TCP = 平文による TLS を使わない通信 – 内部ネットワークのみであれば TLS を使わない通信を採用できる – TLS のオーバーヘッドを削除できるため高速 レイテンシの低減:HTTP/2 非SSL gRPC Client gRPC Server h2c(cleartext) request response(s) 証明書のやりとり 暗号化・復号化に関わる 処理がないので高速
  • 34. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 33 #jjug_ccc #ccc_a7 ● gRPC-javaの場合、利用時にusePlainTextメソッドを 呼び出すだけでOK レイテンシの低減:HTTP/2 非SSL ManagedChannel channel = ManagedChannelBuilder .forAddress(host, port) .usePlainText(true) .build(); GreeterBlockingStub blockingStub = GreeterGrpc.newBlockingStub(channel); HelloRequest request = HelloRequest.newBuilder().setName(name).build(); HelloReply response = blockingStub.sayHello(request);
  • 35. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 34 #jjug_ccc #ccc_a7 ● HTTP/2 – 多重化 (マルチプレキシング) ● クライアントサイド ロードバランシング ● HTTP/2 – バイナリフレーム – ヘッダー圧縮 – 非 SSL ● Protocol Buffers – データ圧縮 gRPCのよいところ レイテンシの低減 スループット向上
  • 36. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 35 #jjug_ccc #ccc_a7 ● 1つのTCPコネクションで数万接続でも並列化が可能 – TCPコネクション中でストリームを用いて並列化 – ストリームはTCPのようなハンドシェイクが不要であるため、オーバーヘッドを 削減することが可能 スループット向上:HTTP/2 マルチプレキシング Client Server stream 3 HEADERS stream 3 DATA stream 1 DATA ・・・ stream 5 DATA stream idでデータを 見分けることができる 途中に別のstreamが 挟まってもOK stream 1 DATA
  • 37. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 36 #jjug_ccc #ccc_a7 ● HTTP/2では並列処理でブロックされない – stream idで見分けることができ、順序の意識が不要になる 前の処理が 完了しないと次 の処理を 行えない スループット向上:HTTP/2 マルチプレキシング HTTP/2 Client Server HTTP/1.1 パイプライン 順番に処理する必要 があるため、 ブロッキングされる ブロックされずに 処理できる Client Server
  • 38. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 37 #jjug_ccc #ccc_a7 ● HTTP/2 – バイナリフレーム – ヘッダー圧縮 – 非 SSL ● Protocol Buffers – データ圧縮 gRPCのよいところ レイテンシの低減 スループット向上 ● HTTP/2 – 多重化 (マルチプレキシング) ● クライアントサイド ロードバランシング
  • 39. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 38 #jjug_ccc #ccc_a7 ● Protocol Buffers – Google 社製のシリアライザ – IDLにより、言語に応じたメッセージオブジェクトが自動生成でき – gRPC ではデフォルトで Protocol Buffers が使用できる Protocol Buffers message ProductMastersRequest { int64 product_group_id = 1; int32 product1_quantity_at_most = 2; repeated int64 product1_ids = 3; int32 product2_quantity_at_most = 4; repeated int64 product2_ids = 5; } IDL
  • 40. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 39 #jjug_ccc #ccc_a7 ● データ圧縮効率が高い – フィールド名をデータとして持たずに tag を使う – 文字列より数値型を扱うように設計した方がより圧縮率が高まる レイテンシの低減:Protocol Buffers データ圧縮効率 シリアライズ前 シリアライズ後 product_group_id = 1122 product1_quantity_at_most = 3 product1_ids = 103,999,101 product2_quantity_at_most = 4 product2_ids = 106,105,998,104 「72byte + フィールド名」のデータを 17 byte に圧縮 tag ≒ index message ProductMastersRequest { int64 product_group_id = 1; int32 product1_quantity_at_most = 2; repeated int64 product1_ids = 3; int32 product2_quantity_at_most = 4; repeated int64 product2_ids = 5; } IDL
  • 41. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 40 #jjug_ccc #ccc_a7 ● HTTP/2 – バイナリフレーム – ヘッダー圧縮 – 非 SSL ● Protocol Buffers – データ圧縮 gRPCのよいところ レイテンシの低減 スループット向上 ● HTTP/2 – 多重化 (マルチプレキシング) ● クライアントサイド ロードバランシング
  • 42. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 41 #jjug_ccc #ccc_a7 gRPC Client ● ロードバランシングの設定が容易 – 動的なgRPC サーバの追加・削除が容易 – DNSレコードを削除したサーバに自動的にリクエストが送られなくなる – nginx など外部のロードバランサが不要で管理が楽 スループット向上:クライアントロードバランシング Name Resolver (DNS) gRPC Client grpclb policy gRPC Server gRPC Server gRPC Server Load Balancer 今回はここを拡張して、 動的なgRPCサーバの 追加に対応
  • 43. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 42 #jjug_ccc #ccc_a7 ● 現状のgRPC-java単独の仕組みでは動的なgRPCサーバの増減に対してうまく 機能しない ● 独自の仕組みや、他のロードバランシング機能を提供するライブラリとの組み合わ せも考慮されているが、 Logicad では使われていないため不採用 1. grpc-eureka-java 2. grpc-consul 3. grpc-zookeeper (注:これらはサードパーティのOSSです) ● 今回は定期的にサーバリストを更新する NameResolverを作成して対応した Tips:クライアントロードバランシング RefreshableNameResolverProvider nameResolverProvider = ... ManagedChannel channel = ManagedChannelBuilder .forAddress(host, port) .usePlainText(true) .nameResolverFactory(nameResolverProvider) .loadBalancerFactory( RoundRobinLoadBalancerFactory .getInstance() ) .build();
  • 44. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 43 #jjug_ccc #ccc_a7 import io.grpc.Attributes; import io.grpc.NameResolver; import io.grpc.NameResolverProvider; import io.grpc.internal.DnsNameResolverProvider; @Singleton public class RefreshableNameResolverProvider extends NameResolverProvider { private static final int _priority = 5; private final DnsNameResolverProvider _delegate = new DnsNameResolverProvider(); private final MutableList<NameResolver> _resolvers = Lists.mutable.of(); @Override public NameResolver newNameResolver( final URI targetUri, final Attributes params) { final NameResolver r = _delegate.newNameResolver(targetUri, params); if (r != null) { _resolvers.add(r); } return r; } ● サーバリストを更新するNameResolverのサンプル Tips:クライアントロードバランシング @Override public String getDefaultScheme() { return _delegate.getDefaultScheme(); } @Override protected boolean isAvailable() { return true; } @Override protected int priority() { return _priority; } public void refresh() { for (final NameResolver r : _resolvers) { r.refresh(); } } } ①複数のgRPCサーバ の接続情報を登録 ②API or 定期実行で サーバリストを更新
  • 45. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 44 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA
  • 46. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 45 #jjug_ccc #ccc_a7 レイテンシの低減 1. 広告商品情報サーバ接続処理による遅延がないこと To-Be を実現する上での要件 広告商品情報 サーバ 入札サーバ スループット向上 1. コネクション増加による処理数低下が起きないこと 2. ロードバランシングできること ココの遅延 広告商品情報 サーバ 入札サーバ ココの処理数 再掲
  • 47. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 46 #jjug_ccc #ccc_a7 スループット向上 1. コネクション増加による処理数低下が起きないこと 2. ロードバランシングできること ● HTTP/2 による並列化 ● クライアントサイドロードバランシング レイテンシの低減 1. 広告商品情報サーバ接続処理による遅延がないこと To-Be を実現する上での要件は達成できそうか? ● HTTP/2 による高速な通信 ● Protocol Buffers によるデータ圧縮
  • 48. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 47 #jjug_ccc #ccc_a7 ● 1. 広告配信サーバのストレステスト – 最大のスループット、Connection数の変化を測定 ● 2. 負荷試験環境でのレイテンシ、スループットの測定 – 入札の一連の処理に関するレイテンシ、スループットを測定 ベンチマーク ストレステスト 負荷試験環境での レイテンシ、スループット測定
  • 49. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 48 #jjug_ccc #ccc_a7 ● gRPCでもJMeterを用いて負荷をかけることが可能 ● JavaSamplerClientを実装したクラスを用意して任意のプロトコルをリ クエストすることが可能 @Override public SampleResult runTest(final JavaSamplerContext context) { HelloRequest request = HelloRequest.newBuilder() .setName(context.getParameter("param_name")) .build(); final SampleResult result = new SampleResult(); result.setDataEncoding(StandardCharsets.UTF_8.toString()); result.setDataType(SampleResult.BINARY); result.setSamplerData(StringUtils.EMPTY); result.sampleStart(); client.sayHello(request); result.sampleEnd(); result.setSuccessful(true); result.setResponseCodeOK(); result.setResponseData(StringUtils.EMPTY,StandardCharsets.UTF_8.toString()); return result; } Tips:ストレステスト時の負荷のかけ方 public class GrpcHelloSampler extends AbstractJavaSamplerClient { private GreeterBlockingStub client; @Override public void setupTest(final JavaSamplerContext context) { super.setupTest(context); JMeterVariables variables = JMeterContextService.getContext().getVariables(); String host = variables.get("grpc_host"); int port = Integer.parseInt(variables.get("grpc_port")); GreeterBlockingStub stub = getClient(host, port); this.client = stub; } ①setupTestでgRPC クライアントのインスタン スを生成 ②runTestでgRPC クライアントを呼び出 して処理するだけ
  • 50. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 49 #jjug_ccc #ccc_a7 ● 環境 – サーバ ● 広告配信サーバ x 1台 – Java8 – メモリ128GB – 8core/16thread – NW ● 10GbE ● 扱う広告商品情報 – 件数:1億件 – サイズ:1.6TB ベンチマーク(ストレステスト)
  • 51. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 50 #jjug_ccc #ccc_a7 ● スループット – 比較的軽い処理の場合、秒間7万件程度 – データ量に応じて処理件数は変わるが秒間数万件の問題なく処理できる ベンチマーク(ストレステスト) 30商品 高負荷 レアなデータ量 3商品 低負荷 ややありうる データ量 秒間の処理件数 (10k=秒間1万件) 15商品 中負荷 通常のデータ量
  • 52. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 51 #jjug_ccc #ccc_a7 ● Connection – データ量、スループットに関係なくConnection数は一定 – HTTP/2のマルチプレキシングにより少ないTCPコネクションで処理できる ベンチマーク(ストレステスト) Connection数は スループットに比例せず一定
  • 53. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 52 #jjug_ccc #ccc_a7 ● 負荷試験環境 – サーバ ● 入札サーバ – Java8 – メモリ30GB – 14core/28thread x 2cpu ● 広告配信サーバ – Java8 – メモリ128GB – 8core/16thread – NW ● 10GbE ● 扱う広告商品情報 – 件数:1億件 – サイズ:1.6TB ベンチマーク(レイテンシ、スループット)
  • 54. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 53 #jjug_ccc #ccc_a7 ● gRPC対応前後で、レイテンシ・スループットは全体の僅か 1割程度の変化に収まった ○ gRPC 化前 : 広告商品情報を入札サーバに持たせた状態 ○ gRPC 化後 : 入札サーバから広告商品情報サーバに外部化した状態 ベンチマーク(レイテンシ、スループット) # 計測対象 レイテンシ(ミリ秒) スループット(秒間処理件数) 平均 50perc entile 99perc entile 1分間 平均 5分間 平均 15分間 平均 1 gRPC 化前 2.04 1.84 9.47 3,732 3,201 2,382 2 gRPC 化後 2.14 1.83 6.79 3,345 3,463 3,501
  • 55. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 54 #jjug_ccc #ccc_a7 1. 自己紹介 2. Logicadについて 3. 今回のシステムと業界 4. 今回のシステムのアーキテクチャと背景 5. gRPCと他の選定候補 6. gRPCのよいところ 7. gRPCを実際に適用してみた結果 8. まとめ 9. QA
  • 56. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 55 #jjug_ccc #ccc_a7 ・ユーザ情報 ・広告予算消化情報 リアルタイムに扱う情報を格納 広告商品情報サーバ Java8 gRPC-Java 入札サーバ Java8 gRPC-Java まとめ SSP nginx 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ 入札サーバ X X X X ・広告キャンペーン情報 事前定義、定期的にロードする 必要がある情報を格納 ・アドフラウド情報 3rd Partyから提供された 情報を格納 Aerospike (KVS) RDS Redis 今回はここをgRPCで構築 ローカル処理を外部化しても 0.1ミリ秒の遅延に収まった 広告商品 情報
  • 57. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 56 #jjug_ccc #ccc_a7まとめ ● 億オーダーの商品情報を gRPC で扱っても 簡単に導入でき、なおかつ速い ● 性能要求の高いシステムでも gRPC おすすめ # gRPC の特徴 導入結果 1 HTTP/2 : 高速な通信 数万のスループットでも同時に並列処理を実現 レイテンシの悪化によるタイムアウトはほぼ無し レイテンシ・スループットのビジネス要求を達成 2 Protocol Buffers : 効率的なシリアライズ 3 ロードバランシング 簡単な拡張で動的なロードバランシングを実現
  • 58. ULS Copyright © 2011-2018 UL Systems, Inc. All rights reserved. Proprietary & Confidential Powered by 57 #jjug_ccc #ccc_a7 お問い合わせ先 mailto: [email protected] https://www.ulsystems.co.jp/