---
title: Debezium CDC 与 Outbox 模式(可靠事件与验证)
date: 2025-11-26
keywords:
- Debezium
- CDC
- Outbox
- Kafka Connect
- 可靠事件
description: 使用Debezium进行数据库变更捕获并结合Outbox表发布可靠事件,降低双写与一致性风险,提供连接器配置与端到端验证方法。
tags:
- CDC
- Debezium
- Kafka Connect
- Outbox
- 事件驱动
- 可靠事件
- 数据与存储
categories:
- 文章资讯
- 编程技术
---
概述
CDC通过变更日志捕获数据库写入并转发到消息系统。Outbox模式将业务事件写入专用表,避免直接监听业务表带来的耦合与隐藏字段问题,提升一致性与可追踪性。
关键实践与参数
- 连接器:
database.history.kafka.bootstrap.servers与table.include.list - Outbox表: 事件
aggregate_typeaggregate_idtypepayload - 事务性写入: 业务写入与Outbox在同一事务
- 路由转换: 使用 SMT 将Outbox事件路由至主题
示例/配置/实现
{
"name": "pg-outbox",
"config": {
"connector.class": "io.debezium.connector.postgresql.PostgresConnector",
"plugin.name": "pgoutput",
"database.hostname": "db",
"database.port": "5432",
"database.user": "replicator",
"database.password": "secret",
"database.dbname": "shop",
"table.include.list": "public.outbox",
"transforms": "outbox",
"transforms.outbox.type": "io.debezium.transforms.outbox.EventRouter",
"transforms.outbox.route.by.field": "aggregate_type",
"transforms.outbox.route.topic.replacement": "events.${routedBy}"
}
}
CREATE TABLE outbox (
id BIGSERIAL PRIMARY KEY,
aggregate_type TEXT NOT NULL,
aggregate_id BIGINT NOT NULL,
type TEXT NOT NULL,
payload JSONB NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
BEGIN;
INSERT INTO orders(id, customer_id, status) VALUES (1001, 42, 'PAID');
INSERT INTO outbox(aggregate_type, aggregate_id, type, payload)
VALUES ('order', 1001, 'OrderPaid', '{"id":1001,"status":"PAID"}');
COMMIT;
验证
- 事务一致: 在事务失败时Outbox不写入事件
- 路由正确: 事件进入
events.order主题且载荷正确 - 重放安全: 使用消费位点与幂等处理避免重复副作用
- 审计: 保留Outbox与消费日志以追溯
注意事项
- 控制Outbox表体量与归档
- 连接器权限与安全配置
- SMT路由规则与主题命名稳定
- 下游处理幂等与告警

发表评论 取消回复