如何对 Kafka 中的数据进行反规范化?
How to de-normalize data in Kafka?
我有一个包含 ~20 table 的 MySQL 数据库。数据已标准化。
考虑这个例子:
book -> book_authors <- authors
我们尝试流式传输图书信息,例如:
{book_id:3, title='Red', authors:[{id:3, name:'Mary'}, {id:4, name:'John'}]}
一个严重问题的例子:如果一个作者的名字改变了,我们必须重新生成他们所有的书。
我正在使用 Debezium post Kafka 中每个 table 的更改日志。
我找不到数据反规范化的优雅解决方案,例如。用于将其添加到 ElasticSearch,MongoDb 等
我确定了两个解决方案,但似乎都失败了:
- 在源头将数据去规范化为新的 MySQL table,并使用 Debezium 仅流式传输此新的 table。这可能是不可能的,我们必须投入大量精力来更改源系统的代码。
- 虽然加入了 Kafka 中的流,但我没能成功。似乎 Kafka 不允许加入非主键字段。这似乎是 N 对 N 关系的常见情况。
有没有人找到数据反规范化的解决方案并将数据发布到 Kafka 流中?这似乎是一个普遍的问题,我还没有找到任何解决方案。
尝试以原始形式将 Debezium 中的更改发布到主题 book
、book_authors
和 authors
,这会创建三个不相交的流。
创建一个订阅所有三个主题的简单消费者应用程序。在收到关于任一主题的消息后,它会查询数据库以获取引用实体的最新快照,将数据合并在一起,并将非规范化版本发布到新的 merged_book_authors
主题上。下游消费者可以直接从合并的主题中读取。
上述的一个小变化:与其为每个 Debezium 更改查询数据库,这可能很慢,不如使用快速键值或文档存储构建 物化视图比如 Redis。这需要多做一些工作,但会 (1) 提高整个管道的吞吐量,以及 (2) 减轻记录系统数据库的负载。
我有一个包含 ~20 table 的 MySQL 数据库。数据已标准化。
考虑这个例子:
book -> book_authors <- authors
我们尝试流式传输图书信息,例如:
{book_id:3, title='Red', authors:[{id:3, name:'Mary'}, {id:4, name:'John'}]}
一个严重问题的例子:如果一个作者的名字改变了,我们必须重新生成他们所有的书。 我正在使用 Debezium post Kafka 中每个 table 的更改日志。
我找不到数据反规范化的优雅解决方案,例如。用于将其添加到 ElasticSearch,MongoDb 等
我确定了两个解决方案,但似乎都失败了:
- 在源头将数据去规范化为新的 MySQL table,并使用 Debezium 仅流式传输此新的 table。这可能是不可能的,我们必须投入大量精力来更改源系统的代码。
- 虽然加入了 Kafka 中的流,但我没能成功。似乎 Kafka 不允许加入非主键字段。这似乎是 N 对 N 关系的常见情况。
有没有人找到数据反规范化的解决方案并将数据发布到 Kafka 流中?这似乎是一个普遍的问题,我还没有找到任何解决方案。
尝试以原始形式将 Debezium 中的更改发布到主题 book
、book_authors
和 authors
,这会创建三个不相交的流。
创建一个订阅所有三个主题的简单消费者应用程序。在收到关于任一主题的消息后,它会查询数据库以获取引用实体的最新快照,将数据合并在一起,并将非规范化版本发布到新的 merged_book_authors
主题上。下游消费者可以直接从合并的主题中读取。
上述的一个小变化:与其为每个 Debezium 更改查询数据库,这可能很慢,不如使用快速键值或文档存储构建 物化视图比如 Redis。这需要多做一些工作,但会 (1) 提高整个管道的吞吐量,以及 (2) 减轻记录系统数据库的负载。