Apache Cassandra行更新时保存旧值到历史审计表的方案咨询
Cassandra 行变更审计存储旧值的实现方案
Trigger 相关问题解答
- 能否获取更新前的旧值:可以。自定义Trigger需要实现
org.apache.cassandra.triggers.ITrigger接口,接口定义的augment方法在执行时会先读取目标行当前已存储的旧数据,和新的更新请求数据一同作为参数传入,你可以在自定义逻辑中提取需要的旧字段值写入审计历史表。 - Trigger 存在的性能及稳定性问题:
- 每次写入都会额外产生一次前置读请求,原写入操作会被阻塞直到Trigger逻辑执行完成,会显著提升写入延迟,高并发写入场景下性能下降非常明显
- Trigger逻辑执行报错会直接导致主表的写入请求失败,没有内置的降级或容错机制
- 集群扩缩容、版本升级时需要保证所有节点都同步部署了Trigger的JAR包,否则会出现节点逻辑不一致的问题
- 该功能官方已停止迭代维护,属于半废弃状态,生产环境不建议重度依赖
生产环境推荐替代方案
1. 应用层双写
在业务代码执行更新操作前,先发起读请求获取当前行的旧值,再通过BATCH语句同时写入主表和审计历史表,该方案可控性最高,还可以通过业务侧缓存减少读请求开销,是目前生产环境最常用的实现方式。
注意:Cassandra的
BATCH仅保证同一分区内的写入原子性,如果主表和历史表的分区键不一致,需要自行实现写入失败的重试或补偿逻辑。
2. CDC(变更数据捕获)
开启Cassandra内置的CDC功能,所有行变更记录会被写入节点本地的专用日志文件,你可以自行开发轻量的CDC消费服务,解析变更日志中的新旧值后写入审计历史表。该方案对业务写入逻辑无侵入,性能开销极低,适合高写入量的业务场景。
内容的提问来源于stack exchange,提问作者PraveenKumar K G
相关产品推荐
相关产品推荐

