CDC领域的消息对象膨胀率与数据结构设计

消息膨胀

消息对象膨胀率

原始从日志解析出来的内容主要是字节流,在数据同步过程中反序列化成具体的 Java 对象,占用的内存与实际字节流占用内存的比值,就是我们指的 CDC 领域中的消息对象膨胀率。

1
消息对象膨胀率=CDC程序中消息JAVA对象占用的内存字节数/原始字节流占用的字节数

膨胀率与能力

CDC 工具需要提供强大的数据处理能力,那么必然涉及消息对象膨胀。膨胀后的对象包含丰富的元信息和可读可处理的值对象。以 CloudCanal 为例,这些能力包含库表列裁剪映射、条件过滤、虚拟列、自定义主键、自定义代码等。

膨胀率与性能

更好的内存利用率和同步性能一定要关注消息对象膨胀率。如果在满足 CDC 产品能力诉求的情况下,优化消息对象膨胀率,对同步性能来说十分重要。

CloudCanal 消息膨胀

测试表

平均行长 2~3KB

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE `cms_cw_zd_ws` (
`CW_BM` varchar(50) NOT NULL COMMENT '错误编码',
`CW_DL` varchar(50) NOT NULL COMMENT '错误大类:患者基本信息、住院过程信息、诊疗信息、费用信息',
`CW_MS` varchar(500) DEFAULT NULL COMMENT '错误描述',
`CW_CKF` double DEFAULT '0' COMMENT '参考分',
`CW_XRD` char(1) DEFAULT '0' COMMENT '错误信任度,0:疑似,1:强制',
`CW_ISBM` char(2) DEFAULT '0' COMMENT '是否为编码错误,1:编码错误,0:非编码错误',
`CW_DJ` char(1) DEFAULT NULL COMMENT '错误等级:A、B、C、D',
`CW_MAX_SCORE` double DEFAULT '0' COMMENT '标识某类错误的最大分值,如果这一类错误扣过的分超过该阈值则丢弃该错误',
`CW_RULE_TYPE` varchar(20) DEFAULT NULL COMMENT '标识该规则是艾登的还是儿童医院的以及其他jar包的,AD:艾登,ET:重庆儿童医院',
`CW_ZJ` varchar(32) DEFAULT NULL COMMENT '错误章节',
`CW_LABEL` varchar(32) DEFAULT NULL COMMENT '错误标签',
`effect_drg` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否影响drg 0不影响 1影响 2错误字段是总费用影响, 编码错误默认都是影响',
`cw_ss` tinyint(4) DEFAULT NULL COMMENT '错误所属其值域包括:1,病案首页 ;2,医保清单;3,病案&医保;',
`description` varchar(64) DEFAULT NULL COMMENT '描述,无实际意义',
`dll` tinyint(1) DEFAULT '0' COMMENT '是否为医生端编码规则',
`merge_rule` tinyint(1) DEFAULT NULL COMMENT 'V9.1, , , V9.1 is null, ',
PRIMARY KEY (`CW_BM`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

全量

原始对象 CC 内存对象 消息对象膨胀率(平均值)
Value Map (Value 通过 RS 取得均为 String) RdbRecord 2.5

增量

原始对象 CC 内存对象 消息对象膨胀率(平均值)
字节流 Event (ByteString) 7
Event ParsedEntry 4

累计 28 倍