如何处理 kafka KStream 并直接写入数据库而不是发送另一个主题

Posted

技术标签:

【中文标题】如何处理 kafka KStream 并直接写入数据库而不是发送另一个主题【英文标题】:How to Process a kafka KStream and write to database directly instead of sending it another topic 【发布时间】:2018-03-13 11:45:51 【问题描述】:

我不想将处理后的 KStream 写入另一个主题,我直接想将丰富的 KStream 写入数据库。我应该如何进行?

【问题讨论】:

正如马蒂亚斯在他的回答中所说,这不是一个好的设计模式。您可以通过这种方式将您的流应用程序耦合到您的数据库。更好的是写回 Kafka,然后使用 Kafka Connect 将数据流式传输到数据库。 【参考方案1】:

您可以实现一个自定义Processor,它打开一个数据库连接并通过KStream#process() 应用它。参照。 https://docs.confluent.io/current/streams/developer-guide/dsl-api.html#applying-processors-and-transformers-processor-api-integration

请注意,您需要同步写入数据库以防止数据丢失。

因此,不回信有多个缺点:

由于同步写入导致吞吐量降低 你不能使用exactly-once语义 将您的应用程序与数据库耦合(如果 DB 出现故障,您的应用程序也会出现故障,因为它无法再写入结果)

因此,建议将结果写回主题并使用 Connect API 将数据获取到您的数据库中。

【讨论】:

感谢 Matthias,它真的给了我一个方向,让我思考是否可以改变我的设计。但是,在我的情况下,问题是我有太多主题(每台机器)并创建相同数量的主题来摄取转换后的流。我不知道当有大量主题时它会如何表现。 我明白你在说什么。通常,您应该通过添加更多代理来处理增加的负载来扩展您的 Kafka 集群。

以上是关于如何处理 kafka KStream 并直接写入数据库而不是发送另一个主题的主要内容,如果未能解决你的问题,请参考以下文章

1 周后如何处理来自分布式日志代理(例如 Kafka)的日志?

20221222蔚来面试

20221222蔚来面试

20221222蔚来面试

如果列数不同,如何处理从源 spark df 到 hive 表的插入

如何处理 Kafka Connect Sink 中的背压?