1. 简介
出价和竞价服务 (B&A) 由 4 项服务组成,可帮助买方和卖方进行 Protected Audience 竞价:
买方堆栈:
- 买方前端服务
- 出价服务
卖方堆栈:
- 卖方前端服务
- 竞价服务
此 Codelab 将引导您在本地环境中设置和测试端到端设置。本演示大约需要 1 小时(不包括初始服务构建时间)。
即使您可能只负责买方代码或卖方代码,在本地环境中设置端到端流程也很有用,这样可以更好地了解买方堆栈和卖方堆栈之间的协作方式。通过设置这两个堆栈,您日后在与另一方的买方或卖方堆栈集成时,会更有信心。在本地测试服务还可以节省开发费用。
在此 Codelab 中,我们将使用 B&A 本地测试应用作为演示助手。
配套的本地测试应用托管了 B&A 竞价中使用的各种买方和卖方资源。该应用还在 http://localhost:3000
中提供了一个界面,您可以在其中模拟各种竞价配置。
2. 环境设置
2.1 准备 Linux 机器
使用本地 Linux 机器,或预配您选择的云提供商的 Linux 虚拟机。为了缩短构建时间,建议至少有 16 个核心,最好有 32 个以上核心。
请注意,我们将从此机器的 http://localhost:3000
加载 HTML 页面。如果虚拟机不提供 GUI,请确保本地机器可以访问端口 3000
,以便您可以连接到该端口。
2.2 安装 Docker
我们使用 Docker 运行服务和本地测试应用。
我们将使用便捷脚本在测试环境中安装 Docker。
# Install Docker
> curl -fsSL https://get.docker.com -o get-docker.sh
> sudo sh get-docker.sh
# Set up sudo-less Docker
> sudo groupadd docker
> sudo usermod -aG docker $USER
> newgrp docker
# Test
> docker run hello-world
警告:在无需 sudo 的设置下,Docker 群组会向用户授予 root 级权限。如需了解详情,请参阅无需 sudo 的 Docker 指南。
2.3 启动配套的本地测试应用
配套应用提供模拟出价/评分脚本和模拟 K/V BYOS 端点等资源。应先启动应用,然后再运行 B&A 服务,以便将资源加载到服务中。
拉取本地测试应用代码库:
git clone https://github.com/privacysandbox/bidding-auction-local-testing-app.git
从代码库的根目录运行设置脚本:
./setup
设置脚本将创建 ba-dev
Docker 网络、生成 SSL 证书,并构建测试应用映像。
构建成功后,运行启动脚本:
./start
3. 在本地构建和运行 B&A
3.1 拉取 B&A 服务
我们将在同一台机器上运行两组 B&A 服务,因此将代码库拉取到两个不同的文件夹中。
集 A:
拉取 B&A 代码库:
git clone https://github.com/privacysandbox/bidding-auction-servers.git bidding-auction-servers-set-a
集 B
拉取 B&A 代码库:
git clone https://github.com/privacysandbox/bidding-auction-servers.git bidding-auction-servers-set-b
`
3.2 构建服务
在每个 B&A 文件夹的根文件夹中,运行以下命令以构建所有 4 项服务:
production/packaging/build_and_test_all_in_docker \
--service-path bidding_service \
--service-path auction_service \
--service-path buyer_frontend_service \
--service-path seller_frontend_service \
--platform gcp \
--instance local \
--no-precommit \
--no-tests \
--build-flavor non_prod \
--gcp-skip-image-upload
上述命令将为所有 4 项服务的 Google Cloud Platform (gcp
) 构建开发 build (non_prod
) 的 local
实例。如有必要,请将 --platform
标志更新为您选择的云服务提供商。如需详细了解构建标志,请参阅 build_and_test_all_docker
文件。
如果使用 64 核机器,初始构建可能需要 2 小时,并且构建时间会按核心数线性缩放。如果您使用的是 32 核机器,则可能需要 4 小时。如果您使用的是 16 核机器,则可能需要 8 小时。
请注意,后续 build 会使用缓存,并且每个 build 都应大约需要 5-20 分钟。
(我在编写此 Codelab 时遇到了 xkcd 的 Randall Munroe,并告诉了他我在此处添加了这个漫画)
3.3 运行服务
在测试中,我们将运行 8 项服务(每个堆栈 4 项服务)。每个命令都设置为使用本地测试应用提供的资源。强烈建议使用窗口管理器,例如 tmux
。
打开至少 8 个其他终端窗口,并在每个会话中运行以下命令。
请注意,本地测试应用服务器必须已在单独的进程中运行,因为出价和评分脚本将由应用提供。
3.3.1 Set A 命令
服务 | 命令 |
|
|
|
|
|
|
|
|
3.3.2 集 B 命令
服务 | 命令 |
|
|
|
|
|
|
|
|
3.3.2 本地启动脚本的环境变量
以下环境变量可用于控制启动行为。
环境变量 | 可用性 | 说明 |
| 所有服务 | 为 docker 命令设置的标志 |
| 所有服务 | 在本地机器上进行测试时,您可能需要使用未通过 默认为 |
| 所有服务 | 服务日志的级别。级别越高,提供的日志就越多。0 表示最低,10 表示最高。默认为 |
| 出价服务 | 出价服务的端口。默认设置为 |
| 出价服务 | 出价逻辑的网址 |
| 出价服务 | 模型训练的出站流量 |
| 出价服务 | 出价推理的参数 |
| BFE 服务 | BFE 服务的端口。默认设置为 |
| BFE 服务 | 买方的 BYOS K/V 地址 |
| BFE 服务 | 买方的 TEE K/V 地址 |
| BFE 服务 | 买方的出价服务地址 |
| 竞价服务 | 竞价服务的端口。默认设置为 |
| 竞价服务 | 评分逻辑的网址 |
| 竞价服务 | 买方的胜出报告网址 |
| 竞价服务 | 买方的胜出报告脚本 |
| 竞价服务 | 适用于 PAS 的买方胜出报告脚本 |
| SFE 服务 | SFE 服务的端口。默认设置为 |
| SFE 服务 | 卖方的竞价服务地址 |
| SFE 服务 | 卖方的 BYOS K/V 地址 |
| SFE 服务 | 卖方的 TEE K/V 地址 |
| SFE 服务 | 卖家来源 |
| SFE 服务 | 买方的 BFE 地址 |
4. 从命令行使用安全调用进行测试
4.1 SFE 测试
您还可以使用 B&A 服务软件包中包含的 Secure Invoke 工具直接从命令行调用服务。
4.1.2 SFE SelectAd
载荷
以下 JSON 请求已填充 SSP-BA
的单卖方 B&A 竞价设置:
{
"auction_config": {
"seller": "https://localhost:6002",
"auction_signals": "{\"testKey\":\"someValue\"}",
"seller_signals": "{\"testKey\":\"someValue\"}",
"buyer_list": [
"https://localhost:5003",
"https://localhost:5004"
],
"per_buyer_config": {
"https://localhost:5003": { "buyer_signals": "{\"testKey\":\"someValue\"}" },
"https://localhost:5004": { "buyer_signals": "{\"testKey\":\"someValue\"}" }
}
},
"raw_protected_audience_input": {
"publisher_name": "http://localhost:4001",
"generation_id": "1210718540",
"enable_debug_reporting": true,
"raw_buyer_input": {
"https://localhost:5003": {
"interest_groups": [
{
"name": "dsp-x-demo",
"ad_render_ids": ["1234"],
"bidding_signals_keys": ["demo-key"],
"browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" },
"user_bidding_signals": "[1, 2, 3]"
}
]
},
"https://localhost:5004": {
"interest_groups": [
{
"name": "dsp-x-demo",
"ad_render_ids": ["1234"],
"bidding_signals_keys": ["demo-key"],
"browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" },
"user_bidding_signals": "[1, 2, 3]"
}
]
}
}
}
}
将该文件另存为 sfe-test.json
,并保存在 Set A 的 B&A 服务代码库的根文件夹中(B&A build 脚本会将代码库根文件夹中的文件复制到 Docker 映像的 /src/workspace
文件夹中)。
4.1.2 使用安全调用调用 SFE
从 B&A 服务代码库的根文件夹运行以下命令:
DOCKER_NETWORK=ba-dev ./builders/tools/bazel-debian run //tools/secure_invoke:invoke \
-- \
-target_service=sfe \
-input_file=/src/workspace/sfe-test.json \
-host_addr=192.168.84.104:50053 \
-client_ip=192.168.84.100 \
-insecure=true
如果 B&A 堆栈设置正确,您将收到以下成功响应:
{"adRenderUrl":"https://localhost:5004/ad.html","interestGroupName":"dsp-x-demo","interestGroupOwner":"https://localhost:5004","score":39,"bid":39,"biddingGroups":{"https://localhost:5003":{"index":[0]},"https://localhost:5004":{"index":[0]}}}
4.2 BFE 测试
4.2.1 BFE GetBids
请求
{
"buyer_input": {
"interest_groups": {
"name": "dsp-x-demo",
"ad_render_ids": ["1234"],
"bidding_signals_keys": ["demo-key"],
"browser_signals": { "bid_count": "1", "join_count": "1", "prev_wins": "[]" }
}
},
"auction_signals": "{\"testKey\":\"someValue\"}",
"buyer_signals": "{\"testKey\":\"someValue\"}",
"seller": "https://localhost:6002",
"publisher_name": "http://localhost:4001",
"enable_debug_reporting": true,
"client_type": "CLIENT_TYPE_BROWSER"
}
将该文件另存为 bfe-test.json
,并保存在 B&A 服务代码库的根文件夹中。
4.2.2 使用安全调用调用 BFE
从 B&A 服务代码库的根文件夹运行以下命令:
DOCKER_NETWORK=ba-dev ./builders/tools/bazel-debian run //tools/secure_invoke:invoke \
-- \
-target_service=bfe \
-input_file="/src/workspace/bfe-test.json" \
-host_addr="192.168.84.102:50051" \
-client_ip=192.168.84.100 \
-insecure=true
如果 B&A 堆栈设置正确,BFE 会返回以下响应:
{"bids":[{"bid":6,"render":"https://localhost:5003/ad.html","interestGroupName":"dsp-x-demo"}],"updateInterestGroupList":{}}
4.3 检查 SFE 日志
访问终端并检查 SFE 日志。我们将介绍输出中的一些重要日志。
4.3.1 SelectAd
请求的加密载荷
在此 SFE 日志输出中,我们找到了 navigator.getInterestGroupAdAuctionData()
调用的加密载荷。此载荷由浏览器生成,从代码发送到 SAS,然后 SAS 将其转发给 SFE:
I1210 21:20:47.266673 37 select_ad_reactor.cc:228] Protected auction ciphertext: AEAAIAABAAKg3OQSSLEBMR1MmJiwfOT8uef41iE+DQIvKUowsQvVcGbWZ+r17ff2r/iTbEnwqLPtpAxSTy77mi+cVV5cKjkKb4piaZnKiCDIMCyEvrQUD4+BG+HgrbUFhqiWPmQhNThvInMaHuYrXG7xushbRtvSPsVzEl6iBZcLZzD7W3CHMFK7bnJ+ufu52W6B7/8dOQ1gZW6SpwXMGNcrurTGoucbwbZRIPqCcbZk76J1gB69wrDYRo1wQ6jmBleLM36nulxbEj/sHhpQIgr895aKqEGQ3Fy+/HHPTO+zHphcX44YeF6mZ/I+WxZTDxCi1x27nI4yvzC8vI4a/giJN5XUlJZGb/fMrj3/Qly+gwJ8lbxdX+4GWTooDoS4MTtiBpJqh9wkIQ5XwfO54p8Kv6j/tk+51hOfVkOdtGwX0LvVrWT9PiJOJHa23nZ1fLg/22mTe05xdbR3WVeA+xiO9YwF4ozyCYDRUkDyWB/3k9RuaaT9H5S1szVpuOuD2nYSRpT9svmpfG4kipiS6BTPZPX2whDlukpuuoFgdiDtH6cFShNhZ5C47R0ayAvaZ1QSpOZMWfA6pdl4nhvNLpOKesKY/KFDEBzpUXRDsQWsfvmdqFl1mCeX9rOrEc9rodYVLXXhM8GPycehHmvqkccTBW6kipOQlmnSdIYaFmtWSFpUrzxajGkct3mZdTjVjOf...
4.3.2 解密载荷
在此输出中,我们可以找到 navigator.getInterestGroupAdAuctionData()
调用的已解密载荷:
I1210 21:20:47.267590 37 select_ad_reactor.cc:347] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Decoded BuyerInput:
https://localhost:5003 : {interest_groups { name: "dsp-x-demo" bidding_signals_keys: "demo-key" browser_signals { join_count: 1 recency: 7 prev_wins: "[]" } }}
4.3.3 向 BFE 发出的 GetBids
请求
GetBids
请求从 SFE 发送到 BFE:
I1210 21:20:47.267710 37 select_ad_reactor.cc:751] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Getting bid from a BFE
I1210 21:20:47.267729 37 buyer_frontend_async_client.cc:52] Raw request:
buyer_input {
interest_groups {
name: "dsp-x-demo"
bidding_signals_keys: "demo-key"
browser_signals {
join_count: 1
recency: 7
prev_wins: "[]"
}
}
}
auction_signals: "{\"testKey\":\"someValue\"}"
buyer_signals: "{\"testKey\": \"someValue\"}"
seller: "https://localhost:6002"
publisher_name: "localhost"
enable_debug_reporting: true
log_context {
generation_id: "c2824bfc-d515-4a1a-9de9-7660ad963252"
}
client_type: CLIENT_TYPE_BROWSER
4.3.4 BFE 的 GetBids
响应
BFE 会回复出价:
I1210 21:20:47.282549 41 select_ad_reactor.cc:856] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Received response from a BFE ...
I1210 21:20:47.282552 41 select_ad_reactor.cc:859] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252)
GetBidsResponse:
bids {
bid: 9
render: "https://localhost:5003/ad.html"
interest_group_name: "dsp-x-demo"
}
update_interest_group_list {
}
4.3.5 向竞价服务发出的 ScoreAds
请求
收到出价后,SFE 会针对每个出价向竞价服务发出 ScoreAds
调用:
I1210 21:20:47.287898 18 select_ad_reactor.cc:1280] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) ScoreAdsRawRequest:
ad_bids {
bid: 9
render: "https://localhost:5003/ad.html"
interest_group_name: "dsp-x-demo"
interest_group_owner: "https://localhost:5003"
join_count: 1
k_anon_status: true
}
seller_signals: "{\"testKey\":\"someValue\"}"
auction_signals: "{\"testKey\":\"someValue\"}"
scoring_signals: "{\"renderUrls\":{\"https://localhost:5003/ad.html\":[1,2,3],\"https://localhost:5004/ad.html\":[1,2,3]}}"
publisher_hostname: "localhost"
enable_debug_reporting: true
log_context {
generation_id: "c2824bfc-d515-4a1a-9de9-7660ad963252"
}
per_buyer_signals {
key: "https://localhost:5003"
value: "{\"testKey\": \"someValue\"}"
}
per_buyer_signals {
key: "https://localhost:5004"
value: "{\"testKey\": \"someValue\"}"
}
seller: "https://localhost:6002"
4.3.6 来自竞价服务的 ScoreAds
响应
卖方的竞价服务会响应以提供可取性得分:
I1210 21:20:47.298029 33 default_async_grpc_client.h:134] Decrypting the response ...
I1210 21:20:47.298100 33 default_async_grpc_client.h:152] Decryption/decoding of response succeeded: ad_score {
desirability: 9
render: "https://localhost:5003/ad.html"
interest_group_name: "dsp-x-demo"
buyer_bid: 9
interest_group_owner: "https://localhost:5003"
win_reporting_urls {
top_level_seller_reporting_urls {
}
}
ad_type: AD_TYPE_PROTECTED_AUDIENCE_AD
}
4.3.7 来自 SFE 的 SelectAd
响应
SFE 的 SelectAd
响应会被加密并发送到 SAS:
I1210 21:20:47.298428 33 select_ad_reactor.cc:1413] (generationId: c2824bfc-d515-4a1a-9de9-7660ad963252) Encrypted SelectAdResponse:
auction_result_ciphertext: "\023\233\252\321\000\331M\327\216\201S\332kl?\322\255\247\312\375h\007W\367\016\366FR\364\275\377\326\027h\204\203\265\t\271-\333\266\tH\342\033F\001k\211C\026V\013\271\255(\236\273\353\260\275\007\346\027\340?\005|\235S\244\265\2563U\246\322\177%\200/\3175\034 \020\024\362\345\3263\356F.s\261\005\231\262Z\000\330x\0230\335>\"\217\254\010\254\330>\206\007\274\235\037`\370W\032\207\356\367\206\026\341.i\"$\370\367\2554i\247\354\304e\306\2466S\337\321w\327+!\316\035:\002\231\246\362\366qm\211\000\013\343\345\224{\365py\361\374\316\202\217-\244\302\331\216D\025W#.\304nH\235\315\311<#\342\344\324\257\354\2441\251\312\320\226\342\021\377>3`\347/\350\254h\306\273\023\365\340@\321\2412\254\323\213\0137,\013n\220|\211\323/\030)\314\263\223\355>\254\312aa`!\375\335\023Z\234p\206\037\001\355\261{$\025+\341\275\327Ny\342\342\264=\376\2138\224\026\2058\251\020\202\245*46\023\307)K\342\364k<\2104r\247\034\216}\034\001\374\215\363\210\026\275\371S>\031;f.b\260\363\257.\255\023I\341A\237*_T\355\262\005\344L\336D%\327\267@\302$\300\340\203c\350|\337>C\275c\260\202o\315xp\260\257\241\305U\nK\033\274L6\025\350\373a:\253\212&>p\210\215\017&^\327\005_\037\020\212\362\351\341\231@g\372\0037\275b:)\207\303d\243?\261O\266\343\214\200\004\247\372\022S\326\200\037\330\252r\257+e\273[\231\202\3625{\330\213\240\370\245\\\214\350/\313\ty/\004\313\0304k\223\354\374\305\233\264\224K\344\241\251\322?\323q6\314D\027\200\203\035]\023O\306\230?\203\237:\254\305\265\332\330\2641l\322\020\022\330O-\242\207>Q\364_{F\235\353tk\207\035\205\005\221\373\207\0143\035\014\322\240H\220\347%\262f\347\017\352\273\265\231\014\204\r\312\254z\000\340&\354\222\323\245\356\217(i\246"
5. 通过浏览器中的本地测试应用进行测试
5.1 打开 Chrome
阅读有关从命令行启动 Chrome 的 Chromium 文章,然后使用以下标志启动 Chrome:
google-chrome --enable-privacy-sandbox-ads-apis --disable-features=EnforcePrivacySandboxAttestations,FledgeEnforceKAnonymity --enable-features=FledgeBiddingAndAuctionServerAPI,FledgeBiddingAndAuctionServer:FledgeBiddingAndAuctionKeyURL/https%3A%2F%2Fstorage.googleapis.com%2Fba-test-buyer%2Fcoordinator-test-key.json
该标志已设置为加载我们在 https://storage.googleapis.com/ba-test-buyer/coordinator-test-key.json
上托管的模拟协调器密钥
重要提示:请务必先完全退出所有 Chrome 实例,然后再使用 B&A 标志从命令行打开 Chrome。如需退出所有 Chrome 进程,请尝试从命令行运行 ps aux | grep -ie chrome/chrome | awk '{print $2}' | xargs kill -9
。
5.2 访问本地测试应用界面
您可以在使用标志打开的 Chrome 浏览器实例中访问 http://localhost:3000 来查看应用界面。如果您使用的虚拟机具有不同的主机名,您访问的确切地址可能会有所不同。
在应用的顶行中,“控件”面板包含用于模拟不同竞价配置的按钮。另外两个面板包含广告客户网站和发布商网站中的 iframe。
当您点击广告客户页面 iframe 中的“Load DSP tags”(加载 DSP 代码)按钮时,系统会将每个 DSP 中的脚本添加到该页面。这些脚本会将用户添加到兴趣群组。打开 Chrome 开发者工具,然后访问“应用 / 存储 / 兴趣群体”,检查 DSP 代码联接的兴趣群体:
然后,点击“控件”面板中的按钮,以模拟各种竞价类型。
如果 B&A 服务和本地测试应用设置正确,则上方显示的广告会在“发布商网站 iframe”面板中呈现。
5.3 本地测试应用竞价配置
在配套的本地测试应用中,托管了以下参与者,并通过端口号进行区分(不同的端口被视为跨源):
参与者 | 说明 | 端口 |
广告客户 | 在网页上加载 DSP 代码 |
|
发布商 | 在网页上加载 SSP 代码 |
|
| 设备端买方 |
|
| 设备端买方 |
|
| B&A 买方 |
|
| B&A 买方 |
|
| 顶级卖家 |
|
| 仅限设备端的卖家 |
|
| 仅面向企业和组织的卖家 |
|
| 混合模式卖家 |
|
有四个 DSP:
DSP-A
和DSP-B
参与设备端竞价DSP-X
和DSP-Y
参与 B&A 竞价
有四个 SSP,每个卖方都采用不同的竞价配置:
SSP-OD
运行仅限设备端的竞价SSP-BA
运行仅限 B&A 的竞价SSP-MIX
运行混合模式竞价SSP-TOP
运行多卖家竞价SSP-OD/BA/MIX
作为SSP-TOP
的多卖家竞价的组件卖家参与竞价
如需查看完整架构,请参阅设计图。
5.4 出价和竞价服务配置
在此 Codelab 中,我们将并排运行两组 B&A。
就位 | 服务 | 参与者 |
|
集 A | 出价服务 |
|
|
BFE 服务 |
|
| |
竞价服务 |
|
| |
SFE 服务 |
|
| |
集 B | 出价服务 |
|
|
BFE 服务 |
|
| |
竞价服务 |
|
| |
SFE 服务 |
|
| |
应用 | 本地测试应用 | 全部 |
|
- 在集 A 中,买方服务由
DSP-X
使用,卖方服务由SSP-BA
使用 - 在集 B 中,买方服务由
DSP-Y
使用,卖方服务由SSP-MIX
使用
在本地测试应用和 B&A 服务之间进行通信时,系统会使用 Docker 桥接网络。ba-dev
桥接网络由本地测试应用的设置脚本创建。B&A 服务会被分配 192.168.84.0
子网中的 IP 地址。
例如,当您从应用调用 Set A 的 SFE 时,系统会使用 192.168.84.104:50053
的网络地址。将模拟出价脚本从 DSP-X 加载到 BFE 时,系统会使用 https://192.168.84.100:5003/generate-bid.js
。
6. 小结
到目前为止,我们希望您已经熟悉了如何在本地机器上运行 B&A 服务堆栈,并对这些服务如何相互通信有了更深入的了解。
6.1. 技术支持
- 如果您对设置本地测试应用有疑问,请在 LTA 仓库中打开一个问题。
- 如果您对出价和竞价服务有疑问,请在出价和竞价服务代码库中打开问题。
- 如果您对 Privacy Sandbox 有一般性疑问,请在 privacy-sandbox-dev-support 代码库中打开问题。
6.2 了解详情
- 详细了解适用于网站的 B&A 架构
- 详细了解卖方与适用于网页的 B&A 的集成