如果KStream#process完成所有数据库操作并转发给下一个使用者并最终写入主题,

时间:2019-09-07 10:55:36

标签: apache-kafka apache-kafka-streams

我想在外部数据库而不是RocksDB中进行所有有状态操作,并且在需要有状态操作的地方执行该操作,我正在编写将执行数据库操作的自定义处理器,context#forward方法将键值对与数据库一起转发给数据库。下游消费者,最后写出一个主题。

1 个答案:

答案 0 :(得分:0)

Kafka Streams仅在 Kafka主题内仅启用一次语义。

对外部系统(数据库)的写操作没有这样的保证。

可能的情况如下:

  1. 自定义处理器处理器获取消息并执行 write 到外部系统(DB)
  2. 发生一些致命错误-未在源主题中进行偏移提交,没有记录传递给下游
  3. 应用程序重新启动
  4. 相同的消息由自定义处理器处理:相同的消息被写入外部系统(DB)并传递到下游,并且以后提交是执行。

在上述情况下:

  • 外部系统(DB)-两次获得相同的消息

  • 在整个Kafka上仅实现一次

如果要将消息写入外部系统(DB),最好使用Kafka ConnectJDBC Sink Connector)。您可以使用Kafka Streams完全处理消息,而不是使用Kafka Connect从输出主题到数据库。

有关一次语义的更多信息,您可以找到