如何在单个Postgres服务器中使用Embedded Debezium监听多个数据库
问题1:多引擎无法同时生效的原因
你的配置参数本身没有冲突,Postgres的max_wal_senders、max_replication_slots配置为3,完全可以支撑2个Debezium引擎同时运行。问题出在引擎的启动逻辑上:DebeziumEngine实现了Runnable接口,构建完成后需要运行在独立的线程中,它的run()方法是阻塞式的,会持续拉取WAL日志推送变更事件。你当前仅在构造方法中完成了引擎实例的构建,没有为每个引擎分配独立线程启动,先初始化的引擎会阻塞整个Spring Bean的初始化流程,导致第二个引擎根本没有实际运行,因此只能监听到一个库的变更。
修复方案
在两个监听器类中新增引擎启动和销毁逻辑,每个引擎提交到独立线程池运行即可:
@Component public class DBAListener { private final ExecutorService executor = Executors.newSingleThreadExecutor(); private DebeziumEngine<?> debeziumEngine; public DBAListener( @Qualifier("dbAConnector") Configuration connectorConfiguration /*, ... 其他服务 */) { this.debeziumEngine = DebeziumEngine.create(ChangeEventFormat.of(Connect.class)) .using(connectorConfiguration.asProperties()) .notifying(this::handleChangeEvent) .build(); } // 新增:Bean初始化完成后异步启动引擎 @PostConstruct public void startEngine() { executor.submit(debeziumEngine); } // 新增:Bean销毁前优雅关闭引擎 @PreDestroy public void stopEngine() throws IOException { debeziumEngine.close(); executor.shutdown(); } // ... 其他逻辑 }
DBBListener也做同样的修改即可。
问题2:单引擎能否监听多个数据库
不可以,你必须为每个数据库单独配置Debezium引擎。
这是Postgres自身的逻辑复制机制限制:逻辑复制槽是数据库级别的资源,每个复制槽只能归属单个数据库,无法跨库读取WAL日志。因此Debezium的Postgres连接器强制要求填写database.dbname参数,单个引擎只能绑定一个数据库,你的多引擎方案是符合官方设计逻辑的。
内容的提问来源于stack exchange,提问作者emrekgn
相关产品推荐
相关产品推荐

