在本地端到端测试 Web 版问答

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 分钟。

相关的 xkcd 漫画

显示两位程序员在办公室里偷懒,这让经理告诉他们赶紧回去工作,而工人们说代码正在编译,经理对此表示理解,漫画作者认为这是偷懒的头号正当借口

我在编写此 Codelab 时遇到了 xkcd 的 Randall Munroe,并告诉了他我在此处添加了这个漫画

3.3 运行服务

在测试中,我们将运行 8 项服务(每个堆栈 4 项服务)。每个命令都设置为使用本地测试应用提供的资源。强烈建议使用窗口管理器,例如 tmux

打开至少 8 个其他终端窗口,并在每个会话中运行以下命令。

请注意,本地测试应用服务器必须已在单独的进程中运行,因为出价和评分脚本将由应用提供。

3.3.1 Set A 命令

服务

命令

DSP-X 出价服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.101 --network=ba-dev" \

BIDDING_JS_URL=https://192.168.84.100:5003/generate-bid.js \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bidding

DSP-X BFE 服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.102 --network=ba-dev" \

BUYER_KV_SERVER_ADDR=https://192.168.84.100:5003/kv \

BIDDING_SERVER_ADDR=192.168.84.101:50057 \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bfe

SSP-BA 竞价服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.103 --network=ba-dev" \

AUCTION_JS_URL="https://192.168.84.100:6002/score-ad.js" \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_auction

SSP-BA SFE 服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.104 --network=ba-dev" \

SELLER_ORIGIN_DOMAIN="https://localhost:6002" \

AUCTION_SERVER_ADDR="192.168.84.103:50061" \

KEY_VALUE_SIGNALS_ADDR="https://192.168.84.100:6002/kv" \

BUYER_SERVER_ADDRS_JSON='{"https://localhost:5003":{"url":"192.168.84.102:50051","cloudPlatform":"LOCAL"},"https://localhost:5004":{"url":"192.168.84.202:50051","cloudPlatform":"LOCAL"}}' \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_sfe

3.3.2 集 B 命令

服务

命令

DSP-X 出价服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.201 --network=ba-dev" \

BIDDING_JS_URL=https://192.168.84.100:5004/generate-bid.js \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bidding

DSP-X BFE 服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.202 --network=ba-dev" \

BUYER_KV_SERVER_ADDR=https://192.168.84.100:5004/kv \

BIDDING_SERVER_ADDR=192.168.84.201:50057 \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_bfe

SSP-BA 竞价服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.203 --network=ba-dev" \

AUCTION_JS_URL="https://192.168.84.100:6003/score-ad.js" \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_auction

SSP-BA SFE 服务

DOCKER_RUN_ARGS_STRING="--ip=192.168.84.204 --network=ba-dev" \

SELLER_ORIGIN_DOMAIN="https://localhost:6003" \

AUCTION_SERVER_ADDR="192.168.84.203:50061" \

KEY_VALUE_SIGNALS_ADDR="https://192.168.84.100:6003/kv" \

BUYER_SERVER_ADDRS_JSON='{"https://localhost:5003":{"url":"192.168.84.102:50051","cloudPlatform":"LOCAL"},"https://localhost:5004":{"url":"192.168.84.202:50051","cloudPlatform":"LOCAL"}}' \

SKIP_TLS_VERIFICATION=true \

./tools/debug/start_sfe

3.3.2 本地启动脚本的环境变量

以下环境变量可用于控制启动行为。

环境变量

可用性

说明

DOCKER_RUN_ARGS_STRING

所有服务

docker 命令设置的标志

SKIP_TLS_VERIFICATION

所有服务

在本地机器上进行测试时,您可能需要使用未通过 curl 的 SSL 对等验证检查的自签名证书。此标志会停用对等方验证以及 SSL 主机名检查。

默认为 false

PS_VERBOSITY

所有服务

服务日志的级别。级别越高,提供的日志就越多。0 表示最低,10 表示最高。默认为 10

BIDDING_PORT

出价服务

出价服务的端口。默认设置为 50057

BIDDING_JS_URL

出价服务

出价逻辑的网址

EGRESS_SCHEMA_URL

出价服务

模型训练的出站流量

INFERENCE_ARGS

出价服务

出价推理的参数

BFE_PORT

BFE 服务

BFE 服务的端口。默认设置为 50051

BUYER_KV_SERVER_ADDR

BFE 服务

买方的 BYOS K/V 地址

BUYER_TKV_V2_SERVER_ADDR

BFE 服务

买方的 TEE K/V 地址

BIDDING_SERVER_ADDR

BFE 服务

买方的出价服务地址

AUCTION_PORT

竞价服务

竞价服务的端口。默认设置为 50061

AUCTION_JS_URL

竞价服务

评分逻辑的网址

BUYER_REPORT_WIN_URL

竞价服务

买方的胜出报告网址

BUYER_REPORT_WIN_SCRIPT

竞价服务

买方的胜出报告脚本

BUYER_PAS_REPORT_WIN_SCRIPT

竞价服务

适用于 PAS 的买方胜出报告脚本

SFE_PORT

SFE 服务

SFE 服务的端口。默认设置为 50053

AUCTION_SERVER_ADDR

SFE 服务

卖方的竞价服务地址

KEY_VALUE_SIGNALS_ADDR

SFE 服务

卖方的 BYOS K/V 地址

TRUSTED_KEY_VALUE_V2_SIGNALS_ADDR

SFE 服务

卖方的 TEE K/V 地址

SELLER_ORIGIN_DOMAIN

SFE 服务

卖家来源

BUYER_SERVER_ADDRS_JSON

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 代码联接的兴趣群体:

Chrome DevTools 中兴趣群体的屏幕截图

然后,点击“控件”面板中的按钮,以模拟各种竞价类型。

在浏览器中通过 B&A 呈现的广告

如果 B&A 服务和本地测试应用设置正确,则上方显示的广告会在“发布商网站 iframe”面板中呈现。

5.3 本地测试应用竞价配置

在配套的本地测试应用中,托管了以下参与者,并通过端口号进行区分(不同的端口被视为跨源):

参与者

说明

端口

广告客户

在网页上加载 DSP 代码

4001

发布商

在网页上加载 SSP 代码

4002

DSP-A

设备端买方

5001

DSP-B

设备端买方

5002

DSP-X

B&A 买方

5003

DSP-Y

B&A 买方

5004

SSP-TOP

顶级卖家

6001

SSP-OD

仅限设备端的卖家

6002

SSP-BA

仅面向企业和组织的卖家

6003

SSP-MIX

混合模式卖家

6004

有四个 DSP:

  • DSP-ADSP-B 参与设备端竞价
  • DSP-XDSP-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。

就位

服务

参与者

ba-dev 网络地址

集 A

出价服务

DSP-X

192.168.84.101:50057

BFE 服务

DSP-X

192.168.84.102:50051

竞价服务

SSP-BA

192.168.84.103:50061

SFE 服务

SSP-BA

192.168.84.104:50053

集 B

出价服务

DSP-Y

192.168.84.201:50057

BFE 服务

DSP-Y

192.168.84.202:50051

竞价服务

SSP-MIX

192.168.84.203:50061

SFE 服务

SSP-MIX

192.168.84.204:50053

应用

本地测试应用

全部

https://192.168.84.100:PORT

  • 在集 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. 技术支持

6.2 了解详情