Salesforce的CDC是做什么的?

Change Data Capture 介绍

Salesforce早于DF17的时候,就发布了Change Data Capture,业内简称CDC

01CDC是做什么的?

Change Data Capture是Lightning Platform上的流产品(streaming product),使您可以有效地将Salesforce数据与外部系统集成。简单来说,CDC 能够其主要功能是追溯和捕捉数据库级别的数据变化。

借助CDC,您可以实时接收Salesforce记录的更改,并同步外部数据存储中的相应记录。CDC能够捕获数据库级的新建,更新,删除和取消删除操作,然后发布对应的事件。简单来说,如果你只知道Trigger能够捕捉insert,update的操作,你就Out了
下面这张图很形象地描述了Salesforce 的CDC是做什么的?


那么再具体来说,CDC是怎么实现数据的同步呢?

可以看看下面的例子,当有一个对象进行更新操作时候,会更新Salesforce的数据,然后通过Change Event 发布相关事件,而同时外部服务监听此事件,从而实现外部数据库和Salesforce数据库的同步。

#实例 #

那么如何通过Apex Trigger监听数据Change Event呢?可以参考下面的例子。

假设有一个Object为Employee__c,希望在每一次新增修改时候,都能新建一个Task。传统的做法是可以通过在对象下写一个after insert 的trigger,这里我们通过CDC来实现。

首先需要在Setup里面选择所需要使用Change Data Capture的对象。

由于CDC可以捕捉数据变化,可以通过在Employee__ChangeEvent里面写一个EmployeeChangeTrigger 的Trigger。值得注意的是,可以通过changetype来识别数据是Insert还是update。而通过event.Field Name, 可以轻松获得该数据的现在值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
trigger EmployeeChangeTrigger on Employee__ChangeEvent (after insert) {
List<Task> tasks = new List<Task>();

// Iterate through each event message.
for (Employee__ChangeEvent event : Trigger.New) {
// Get some event header fields
EventBus.ChangeEventHeader header = event.ChangeEventHeader;
System.debug('Received change event for ' +
header.entityName +
' for the ' + header.changeType + ' operation.');
// For update operations, we can get a list of changed fields
if (header.changetype == 'UPDATE') {
System.debug('List of all changed fields:');
for (String field : header.changedFields) {
if (null == event.get(field)) {
System.debug('Deleted field value (set to null): ' + field);
} else {
System.debug('Changed field value: ' + field + '. New Value: '
+ event.get(field));
}
}
}
// Get record fields and display only if not null.
System.debug('Some Employee record field values from the change event:');
if (event.First_Name__c != null) {
System.debug('First Name: ' + event.First_Name__c);
}
if (event.Last_Name__c != null) {
System.debug('Last Name: ' + event.Last_Name__c);
}
if (event.Name != null) {
System.debug('Name: ' + event.Name);
}
if (event.Tenure__c != null) {
System.debug('Tenure: ' + event.Tenure__c);
}
// Create a followup task
Task tk = new Task();
tk.Subject = 'Follow up on employee record(s): ' +
header.recordIds;
tk.OwnerId = header.CommitUser;
tasks.add(tk);
}
// Insert all tasks in bulk.
if (tasks.size() > 0) {
insert tasks;
}
}

其他

那么什么时候可以用CDC?这里列了一些常见的例子:

  • 如果Salesforce记录的更改需要同步外部数据存储中的相应记录。

  • 接收Salesforce记录更改的通知,包括创建,更新,删除

  • 捕获所有记录的字段更改。

  • 取消删除操作(undelete operations)。

  • 监听大量更改

最后,这里附上CDC和Platform Event之间的不同。有时候面试会遇到这些问题。

也可以参考Trailhead里面CDC的模块,链接如下:

https://trailhead.salesforce.com/en/content/learn/modules/change-data-capture

参考文献:

Change Data Capture Developer Guide : https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_intro.htm

https://developer.salesforce.com/blogs/2018/08/what-is-change-data-capture.html

https://trailhead.salesforce.com/en/content/learn/modules/change-data-capture/understand-change-data-capture

https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_intro.htm