一、理解事件驱动软件架构
本单元介绍事件驱动软件架构的基础:发布-订阅模型、平台事件的概念、集成模式,以及事件驱动的用例。
学完本单元,你将能够:列出事件驱动架构的组件、解释其好处、描述 Platform Events 的用例,并描述平台事件的特性。
理解事件驱动软件架构
事件驱动的核心是发布-订阅(publisher-subscriber)模型——发送者广播消息,一个或多个接收者捕获。就像无线电传输:发射塔广播信号,调到正确频率的接收器才能收到信号。
事件消息异步发送,无论接收者是否在听;接收者收到事件时也不回确认。事件通信是实时的(更准确地说是近实时)。
事件驱动系统的组件:
- 事件(Event):业务过程中有意义的状态变化,如采购下单。
- 事件消息(Event message):含事件数据的消息,也叫事件通知。
- 事件生产者(Event producer):发布事件消息的一方。
- 事件通道(Event channel):生产者发送、消费者读取的事件流。
- 事件消费者(Event consumer):订阅通道、接收消息的一方。
- 事件总线(Event bus):基于发布-订阅的多租户、多云事件存储与投递服务。
与请求-响应模型不同,事件驱动模型把生产者与消费者解耦:系统订阅事件通道,新状态发生时被通知,任意数量的消费者能接收并响应同一事件,发送方与接收方除消息语义外互不依赖。Salesforce 企业消息平台提供事件驱动架构的好处,平台事件就是你的应用收发的事件消息。
三种集成模式与平台事件
平台事件的三种典型集成模式:
平台到外部应用——供应商应用的订单履行:当 Salesforce 里的商机"赢得"成交后,产品订单应用中的触发器触发并发布平台事件消息,每个监听该事件的外部供应商应用收到通知,负责特定产品的供应商创建发货。
外部应用到平台应用——在 Salesforce 中处理退货:外部系统发布平台事件提醒 Salesforce 有商品退货,Salesforce 里的事件监听器(触发器)收到事件并执行动作,例如提醒销售代表、向客户发确认邮件。
平台到平台——重新分配线索记录:线索在 Salesforce 中分配时,线索触发器触发并检查与该线索所有者相关的未关闭商机和案件,据此发布事件,Salesforce 应用收到事件后重新分配线索并创建 Chatter 帖子。这个场景用 Flow Builder 也能做,但用平台事件能获得事件驱动编程模型和跨应用的标准编程方式。
平台事件与 Salesforce 对象:平台事件是一种特殊的 Salesforce 实体,类似对象。事件消息是平台事件的实例,就像记录是对象的实例。但与记录不同,你不能更新或删除事件消息,也不能在 UI 中查看它们,只能设置读取和创建权限。
原生与外部应用中的平台事件:Salesforce 平台上的应用用 Apex 方法发布事件、用 Apex 触发器或 empApi Lightning 组件消费事件;外部应用用 Pub/Sub API 或数据 API 发布与消费。平台事件适用于收发带预定义模式的自定义事件数据、在 Apex 中发布/订阅、在平台内外灵活发布与处理事件。
二、定义与发布平台事件
本单元动手定义平台事件、理解发布行为(立即 vs 提交后)、通过 Apex、点击和 API 三种方式发布事件。
学完本单元,你将能够:定义平台事件、描述如何用 Apex 发布、使用 Apex 方法发布事件、用流程点击发布、用 REST API 插入 sObject 发布。
定义平台事件(保留、ReplayId、API 名称后缀)
以 Cloud News 新闻机构为例,定义名为 Cloud News 的平台事件:Setup → 输入 Platform Events → 选 Platform Events → New Platform Event → Label 输入 Cloud News → 保存 → 在 Custom Fields & Relationships 里 New → 选字段类型(如 Text、Checkbox)→ 添加 Location(Text 100)、Urgent(Checkbox)、News Content(Text Area Long)等自定义字段。平台事件支持的字段类型有 Checkbox、Date、Date/Time、Number、Text、Text Area (Long)。
事件保留与 ReplayId:Salesforce 在事件总线中存储高频平台事件 72 小时。不能通过 SOQL/SOSL 查询事件消息,也不能在报表、列表视图、搜索中使用它们。每条事件消息被分配一个不透明的 ReplayId(系统在事件投递给订阅者时填充),指事件在事件流中的位置。订阅者可存储 ReplayId 并在重新订阅时用它取回保留窗口内的事件(例如连接失败后取回遗漏的事件)。
API 名称后缀:创建平台事件时系统追加 __e 后缀(如 Cloud_News__e),在 Apex、REST API、Pub/Sub API 中程序化引用时使用该 API 名。
发布行为与事务(通过 Apex/点击/API 发布)
平台事件有两种发布行为:
- Publish Immediately(立即发布,默认):发布调用执行时立即发布事件消息,无论事务是否成功;订阅者有时会在数据提交前收到消息。适合发布者与订阅者独立、订阅者不依赖发布者已提交数据的场景,或日志用途。
- Publish After Commit(提交后发布):仅当事务成功提交后才发布;事务失败则不发布。适合订阅者收到事件时需要已提交事务数据的场景,例如一个流程发布事件并创建任务记录,第二个订阅该事件的流程需要找到该任务记录。
用 Apex 发布:创建事件实例并传给 EventBus.publish() 方法。该方法返回 Database.SaveResult 对象,isSuccess() 为 true 时发布请求入队、事件异步发布;为 false 时返回 Database.Error 中的错误。同一调用可发布多个事件(传列表)。
用点击发布:在 Flow Builder 中用 Create Records 元素创建平台事件实例并设置字段值(布尔字段用 {!$GlobalConstant.True})。
用 API 发布:外部应用用 Pub/Sub API 或数据 API(SOAP、REST、Bulk)发布,方式和插入 sObject 相同。
例如 REST API 向 /services/data/.../sobjects/Cloud_News__e POST JSON body,返回 success 和 id。
三、订阅平台事件
本单元学习如何订阅平台事件:用 Apex 触发器、Lightning Web Components、Aura 组件、流程和 Pub/Sub API 订阅,以及如何管理订阅者和测试触发器。
学完本单元,你将能够:描述订阅方式、在平台内和外部应用中订阅事件、在 Apex 测试中测试平台事件。
用 Apex 触发器订阅(调试日志、测试)
在 Salesforce 平台上,用 Apex 触发器、流程和 empApi Lightning 组件订阅事件。最常用的是在事件对象上写 after insert Apex 触发器——平台事件只支持 after insert 触发器,对应事件发布之后触发。触发器提供自动订阅机制,无需显式创建和监听通道。
以 Cloud News 触发器为例:遍历每个事件,通过 Urgent__c 字段判断是否紧急,若紧急则创建案件派遣记者并把事件位置加到案件主题。
设置调试日志:平台事件触发器不与发布事件的事务在同一 Apex 事务中执行,而是在 Automated Process 系统用户下独立运行,因此要在 Setup 的 Debug Logs 里为 Automated Process 实体添加 trace flag 才能收集触发器日志。
平台事件触发器注意事项:触发器按接收顺序顺序处理事件(基于 ReplayId),一次可接收一批(批内顺序保留);触发器异步运行,发布与处理之间可能有延迟;触发器在 Automated Process 下运行,创建记录时需显式设置 OwnerId(或用分配规则);受 Apex 调控器限制;批大小为 2,000 条事件消息(普通对象触发器是 200)。
Subscriptions 相关列表:在事件定义详情页可查看所有触发器订阅者的状态(运行中/断开/错误)。
管理 Apex 触发器订阅者:管理员可挂起、恢复(从事件总线最早可用消息)、或"从 Tip 恢复"(从新消息开始)订阅。
测试平台事件触发器:把发布语句包在 Test.startTest() 和 Test.stopTest() 之间,Test.stopTest() 使事件发布执行,之后验证 isSuccess() 和触发器创建的案件。
通过 LWC、Aura、Pub/Sub API 订阅与测试
用 Lightning Web Component 订阅:从 lightning/empApi 模块导入方法,在 JavaScript 中调用订阅事件通道(如 /event/Cloud_News__e)。
用 Aura 组件订阅:在自定义组件里添加 lightning:empApi 组件并设 aura:id,在客户端控制器调用组件方法(旧方法,新开发推荐 LWC)。
用点击订阅:创建平台事件触发的流程,在 Start 元素选择触发流程运行的平台事件,用 $Record 全局变量引用事件消息字段值;也可用 Pause 元素让暂停的流程在收到事件消息时恢复。
用 Pub/Sub API 订阅:Pub/Sub API 基于 gRPC 和 HTTP/2,用 Apache Avro 格式高效发布和投递二进制事件消息,为发布和订阅平台事件提供单一接口。它用拉取订阅模型——客户端根据处理能力主动请求事件,避免事件激增时被淹没。好处包括:发布/订阅/模式检索一体的 API、发布操作的最终结果(而非中间入队结果)、流控、HTTP/2 压缩实时流、支持 11 种语言(Python、Java、Node、C++ 等)。客户端可分别检索模式、ReplayId、payload 并解码。
延伸学习与总结
恭喜完成平台事件基础模块!你现在了解了事件驱动架构的发布-订阅模型、如何定义与发布平台事件、如何用 Apex 触发器、Lightning Web Components、Aura、流程和 Pub/Sub API 订阅,以及如何测试平台事件触发器。
继续学习可参考:Platform Events Developer Guide、Pub/Sub API Documentation,以及 Trailhead 的 Apex Triggers、Change Data Capture Basics 和 Build an Instant Notification App 项目。












