R2DBC 可以用于 Spring boot 中的变更数据捕获吗?

问题描述

我有一个经典的 Spring Boot 应用程序连接到 MysqL 数据库

我可以使用 r2dbc 驱动程序和 spring data r2dbc 来开发另一个应用程序来侦听数据库更改,例如更改数据捕获吗?

我研究了 r2dbc 驱动程序文档,但我不明白它们是产生反应性热流还是仅产生冷流。 如果不可能,我相信我应该使用 Debezium,就像我在这article 中找到的那样。

非常感谢

解决方法

TL;DR

R2DBC 主要是一种规范,用于启用与数据库的反应式/非阻塞式通信。 R2DBC 驱动程序的功能在很大程度上取决于您的数据库。

更长的版本

R2DBC 指定了一组接口,其中包括通过 Publisher 激活每个数据库对话的方法。 R2DBC 对底层有线协议没有意见。相反,实现 R2DBC 的数据库驱动程序必须坚持其数据库通信协议。您通过 JDBC 或 ODBC 获得的内容与您从 R2DBC 驱动程序中获得的内容几乎相同。

有一些较小的区别:一些 JDBC 驱动程序需要轮询数据(例如 Postgres Pub/Sub 通知),而在 R2DBC 中,可以在没有轮询线程的情况下使用通知流,因为所有 I/O 都基于侦听一旦驱动程序接收到数据,就接收缓冲区并发送数据。相比之下,JDBC(以及几乎所有命令式 API)都需要有人调用一个方法来使用/获取数据。

我不确定 CDC 如何与 MySQL 配合使用;我认为您需要使用 MySQL 命令或 MySQL 协议扫描(轮询)BINLOG。目前,R2DBC MySQL 驱动程序不支持 BINLOG 轮询。

Postgres 具有类似的功能(逻辑解码)。它由 R2DBC Postgres 支持(请参阅 Logical Decode using R2DBC Postgres 的文档)。在 Postgres 中,服务器将复制日志推送到客户端,当逻辑解码订阅复制日志时,它会为您提供热流。

要点几乎取决于实际的数据库技术。