基于Salesforce平台事件与Queueable类的高量记录批量处理方案咨询
针对每日200万条Salesforce记录加载的推荐架构方案
核心思路
放弃单条记录触发Queueable的模式,改用批量缓冲+定时批量处理的架构,既满足外部系统“即发即弃”的快速响应需求,又完全避开Salesforce异步调用上限,同时大幅提升处理效率。
具体实现步骤
1. 外部服务入口:保持快速响应
- 外部系统调用自定义Rest API(或直接调用Platform Event的REST端点),API收到请求后,将负载存入缓冲自定义对象(例如
Integration_Request__c,需包含字段:Payload__c(存储JSON格式的记录数据)、Object_Type__c(区分Account/Contact)、Status__c(待处理/处理中/成功/失败)、External_Id__c(外部系统唯一标识,用于幂等性校验)、Error_Message__c(存储失败原因))。 - 完成存储后立即返回
202 Accepted响应,确保外部系统无需等待处理完成。
2. 批量处理核心:Scheduled Apex + Batch Apex
- 定时调度类:配置每10-15分钟触发一次(可根据流量峰值调整),查询缓冲对象中
Status__c = '待处理'的记录,每次触发时启动一个Batch Apex任务。 - Batch Apex类:
start()方法:返回待处理缓冲记录的SOQL查询,可设置queryLocator的批量大小(最大10000条)。execute()方法:- 批量反序列化当前批次的
Payload__c为Account/Contact对象列表。 - 执行数据校验、字段映射逻辑。
- 使用
Database.upsert()/Database.insert()并设置allOrNone=false,避免单条记录失败导致整批回滚。 - 遍历操作结果,更新对应缓冲记录的
Status__c和Error_Message__c。
- 批量反序列化当前批次的
finish()方法:可添加日志记录、失败告警,或触发重试逻辑(针对处理失败的记录)。
3. 可选优化:基于Platform Event的批量缓冲(若需事件溯源)
如果业务要求必须通过Platform Event传递数据,不要在触发器中逐条调用Queueable:
- Platform Event触发器默认支持批量触发(单次最多接收2000条事件),在触发器中将整批事件的负载批量存入缓冲对象,再调用一次Queueable来触发Batch处理。
- 按此方式,200万条记录仅需1000次Queueable调用,远低于25万的每日上限。
方案优势
- 规避异步上限:原方案需200万次Queueable调用,远超Salesforce每日25万次的限制;新方案用Batch Apex,每日上限5000次,每次可处理10000条记录,完全覆盖200万的需求。
- 处理效率更高:批量DML和反序列化操作的性能远优于单条处理,减少系统开销。
- 可追溯性强:缓冲对象完整记录每条请求的处理状态和错误信息,便于问题排查和数据对账。
- 弹性适配:可根据实时流量调整调度频率和批次大小,灵活应对峰值波动。
关键注意事项
- 存储容量:提前确认Salesforce的自定义对象存储配额,200万条记录按每条1KB计算约需2GB存储。
- 幂等性:利用
External_Id__c字段实现请求去重,避免重复处理相同记录。 - 错误重试:对处理失败的记录,设置“待重试”状态,通过单独的调度类定期重试(最多3次,避免无限循环)。
- 监控告警:配置Salesforce告警规则,当缓冲对象中待处理记录超过阈值(如10万条)时触发通知,及时调整处理策略。
内容的提问来源于stack exchange,提问作者Shaila
相关产品推荐
相关产品推荐

