一、创建自定义通道
本单元学习 Change Data Capture 中的自定义通道、为何要创建而非用默认通道、设置 Postman 发起 Tooling API 调用,并创建第一个自定义通道 SalesEvents__chn(分组销售相关对象的变更事件)。
学习目标
本项目你将学会:用 Postman 通过 Tooling API 创建自定义通道;订阅自定义通道并实时接收富化的变更事件;用 PATCH 请求更新通道成员上已有的富化字段。
什么是 Change Data Capture 中的自定义通道?
Change Data Capture 在记录创建、更新、删除时流式传输实时变更事件。默认所有变更事件通过标准 /data/ChangeEvents 通道,每个订阅者收到每个事件。自定义通道解决关键问题:选择性订阅——多个订阅者各自需要不同的对象集合,只订阅你关心的事件而非全部再客户端过滤,把相关对象分组到一个通道,把事件富化隔离到特定通道。
真实场景:公司用外部 ERP 做订单履行,Account 记录必须与 ERP 同步;创建启用了 Account/Contact/Order 的自定义通道;ERP 集成应用只订阅此通道——永远看不到无关对象的变更事件。自定义通道 = 聚焦、高效的事件流。
自定义通道如何工作——架构
自定义通道用 PlatformEventChannel 创建(Tooling API 或 Metadata API)。架构三层:① PlatformEventChannel——通道本身,有 channelType("data" 表示 CDC)、label 和以 __chn 结尾的唯一 API 名(如 SalesEvents__chn)② PlatformEventChannelMember——分配给通道的对象,每个成员代表一个对象,selectedEntity 指定哪个对象的变更事件(标准对象 AccountChangeEvent,自定义对象 MyObject__ChangeEvent),一个通道可有多个成员 ③ EnrichedFields——加到每个变更事件的额外字段,定义为成员上的数组,即使字段没变也包含在更新/删除事件中(集成关键:始终包含 External ID 让接收系统匹配记录)。通道 → 成员 → 富化字段,三层配置。
设置 Postman 并连接 Playground
前提:完成 Quick Start: Connect Postman to Salesforce,fork Salesforce Platform APIs collection。连接步骤:① 启动 Trailhead Playground ② 打开 Postman 选 Workspace ③ 导航到 forked 的 Salesforce API collection ④ Authorization → Get New Access Token ⑤ 提示时点 Allow ⑥ 从 Manage Access Tokens 复制 instance URL ⑦ 点 Use Token ⑧ Variables 标签粘贴 instance URL 到 _endpoint CURRENT VALUE ⑨ Save。测试连接:展开 REST → GET Limits → Send,响应 200 OK(否则令牌过期,重取)。
创建你的第一个自定义通道——Tooling API 调用
在 Postman 导航到:Event Platform → Custom Channels → Change Data Capture → Create channel。请求体:
{
"FullName": "SalesEvents__chn",
"Metadata": {
"channelType": "data",
"label": "Custom Channel for Sales App"
}
}
FullName(唯一 API 名,必须以 __chn 结尾)、channelType: "data"(CDC;另一选项 "event" 是自定义 Platform Events)、label(UI 显示名)。Send 后期望 201 Created,响应含新通道 ID(后面要用)。
二、添加通道成员并配置事件富化
连接 Account 对象到自定义通道(创建通道成员),配置事件富化让每个变更事件都包含 External_Account_ID__c 和 Industry,并用 Tooling API 查询 EnrichedField 对象验证配置。
什么是事件富化,为什么重要?
默认变更事件只包含发生变化的字段。若只改 Account 的 Phone,事件负载只有 Phone 加系统字段。事件富化让你指定额外字段包含在每个变更事件中(即使没变)。
为什么重要:ERP 同步应用收到 Account 变更事件——Type 从 Prospect 变 Customer。无富化:事件只有 Type/LastModifiedDate/系统字段,ERP 收到「Type 变了」但无法识别哪个账户记录。有富化:External_Account_ID__c 和 Industry 始终包含,ERP 立即匹配记录并基于 Industry 做相关处理。富化用于 UPDATE 和 DELETE(不用于 create——create 时所有已填充字段都在)。支持的订阅者:CometD 和 Pub/Sub API;不支持 Apex 触发器。事件富化 = 每个事件自带所需上下文,无需额外 API 调用。
创建 External Account ID 自定义字段
配置富化前先创建字段:Setup → Object Manager → Account → Fields & Relationships → New → Text → Field Label External Account ID、Length 18、External ID 勾选(关键,标记为来自外部系统的唯一标识)。External ID 的意义:告诉 Salesforce 此字段含外部系统标识、启用 upsert(按 External ID 而非 Salesforce ID 匹配)、ERP 用它匹配记录、创建索引加速查找。
创建带富化字段的通道成员
把 AccountChangeEvent 加到 SalesEvents__chn 并配置富化——一次 API 调用完成。请求体:
{
"FullName": "SalesEvents_chn_AccountChangeEvent",
"Metadata": {
"enrichedFields": [
{ "name": "External_Account_ID__c" },
{ "name": "Industry" }
],
"eventChannel": "SalesEvents__chn",
"selectedEntity": "AccountChangeEvent"
}
}
selectedEntity(标准对象 <Object>ChangeEvent,自定义对象 <Object>__ChangeEvent)、enrichedFields(始终包含的字段数组)、FullName(约定 <ChannelName>_<EntityName>)。期望 201 Created。重要:若该通道和 selectedEntity 的成员已存在,POST 会失败——用 PATCH 更新或 DELETE 重建。
用 Tooling API 查询验证富化配置
查询 EnrichedField 对象验证配置。Postman:Tooling → Tooling Query,q 参数:SELECT Id, ChannelMemberId, Field FROM EnrichedField ORDER BY ChannelMemberId。响应 size: 2 确认两个富化字段已配置。关键观察:标准字段(Industry)显示字段名,自定义字段(External_Account_ID__c)显示字段 ID(00N 开头)——要得到名称需查 CustomField(SELECT Id, DeveloperName FROM CustomField WHERE Id='<field_Id>')。
三、接收富化的变更事件
看富化实际效果:安装 Streaming Monitor、订阅自定义通道、创建 Account 触发事件、更新它接收包含 External_Account_ID__c 和 Industry 的富化变更事件。
从 AppExchange 安装 Streaming Monitor
Streaming Monitor 是免费的 AppExchange 应用,让你订阅事件通道并实时可视化事件。安装:Playground Starter → Install a Package 标签 → Package ID 04tJ5000000gQFx → Install for Admins Only。由 Salesforce Labs 构建(免费开源,GitHub 可贡献),显示事件时间线可视化、点时间线圆点显示事件负载;替代方案:自定义 Lightning 应用用 empApi 组件,外部客户端用 EMP Connector。
订阅你的自定义通道
启动 Streaming Monitor 连接 SalesEvents__chn:① App Launcher 搜「Streaming Monitor」② Actions → Subscribe to a channel ③ Event type:Custom Channel - Change event ④ Channel name:/data/SalesEvents__chn(/data/ 前缀表示 CDC 通道)⑤ Subscribe。现在 Streaming Monitor 在监听——Account 记录的任何变更事件都会作为时间线圆点出现。保持标签打开。
创建账户并接收第一个事件
新浏览器标签创建 Account 记录:Account Name Astro、Industry Apparel、External Account ID 123、Phone 4155551212,保存。切回 Streaming Monitor——新圆点出现,点击看事件负载。第一个事件(create)含 External_Account_ID__c 和 Industry——但这是因为它们是新记录上已填充的字段(create 天然包含所有已填充字段),不是富化。富化只作用于 UPDATE 和 DELETE。真正的富化测试看 UPDATE 事件。
更新记录——接收富化的变更事件
真正的测试:更新一个未富化的字段,验证富化字段仍出现。更新 Account:改 Type 字段为「Customer - Direct」,保存(只有 Type 变了)。切回 Streaming Monitor——新圆点出现,点看富化事件负载。changedFields: ["Type", "LastModifiedDate"],但也有 External_Account_ID__c 和 Industry——这些字段没变,因为事件富化才出现。ERP 收到 External ID 匹配记录、Industry 提供业务上下文,一次事件无需额外 API 调用。
四、更新现有通道成员
通道成员已存在——不能 POST 覆盖,要用 PATCH。先查询通道 ID 和通道成员 ID,再用 PATCH 替换富化字段(从 External_Account_ID__c + Industry 换成仅 Phone),并触发另一个变更事件验证。
查询通道 ID 和通道成员 ID
PATCH 前需要精确 ID,两个查询:查询 1 拿通道 ID(SELECT Id, DeveloperName, MasterLabel, ChannelType FROM PlatformEventChannel WHERE DeveloperName='SalesEvents');查询 2 拿通道成员 ID(SELECT Id, DeveloperName, EventChannel, SelectedEntity FROM PlatformEventChannelMember WHERE EventChannel='<channel ID>' AND SelectedEntity='AccountChangeEvent')。复制两个 ID 备用。
PATCH 请求——替换富化字段
用 PATCH 更新通道成员,把富化字段替换为仅 Phone。Params 设 PLATFORM_EVENT_CHANNEL_MEMBER_ID 为复制的成员 ID,Body:{"FullName": "SalesEvents_chn_AccountChangeEvent", "Metadata": {"enrichedFields": [{"name": "Phone"}], "eventChannel": "SalesEvents__chn", "selectedEntity": "AccountChangeEvent"}}。期望 204 No Content。结果:External_Account_ID__c 和 Industry 被移除,Phone 成为唯一富化字段。替代方案:直接 DELETE 单个 EnrichedField(查 Id 后发 DELETE 到 /tooling/sobjects/EnrichedField/<Id>)。
验证更新的富化配置
最终验证:仍订阅 SalesEvents__chn,改 Account 的 Type 为「Other」保存。切回 Streaming Monitor 点最新圆点——事件负载现在显示 changedFields: ["Type", "LastModifiedDate"]、富化字段 Phone(值 4155551212)、External_Account_ID__c 和 Industry 不再作为富化字段出现。确认 PATCH 成功替换了富化配置。项目完成——同样的模式适用于任何标准或自定义对象。
自定义通道与事件富化——完整工具包
架构:PlatformEventChannel(命名管道)、PlatformEventChannelMember(通道上的对象)、EnrichedField(每事件包含的额外字段)。API 操作:POST(创建通道和成员)、GET(查询通道/成员/富化字段)、PATCH(更新富化配置)、DELETE(删除单个富化字段)。关键概念:自定义通道分组事件做选择性订阅(不再客户端过滤所有事件)、事件富化在更新/删除事件中包含关键字段(每事件自包含,无需额外 API 调用)、External ID 字段支持跨系统记录匹配、Streaming Monitor 实时可视化调试。这是 Salesforce 事件驱动架构的基础——ERP 同步、数据复制、微服务通信都始于通道和富化。
文章来源:Trailhead - Create a Custom Channel and Enrich Change Events




















