处理 Kafka 生产者连接丢失



这本身并不是一个编码问题,而更像是一个实时流应用程序的架构设计。我们有以下设置:

  • 现场有多个嵌入式物联网设备(内存不足,但可以选择一些扩展的本地存储(
  • 它们都实时将数据流式传输到 Kafka 集群,充当生产者,然后我们有后处理应用程序充当消费者并帮助将数据存储在数据库中。
  • 现在,有时这些物联网设备会失去与Kafka集群中某个节点的连接,因为现场的网络连接并不总是可靠的。这种断开连接通常可持续长达一天。

现在我明白了 Kafka 负责集群中发生故障的节点(充当代理(,但是如果我遇到生产者只是没有良好的网络连接并且因为看不到而无法将其数据发布到 Kafka 主题的情况怎么办?

我们不能丢失任何数据,但好消息是,我们为嵌入式物联网设备提供了可扩展的存储选项,我们可以在物联网设备离线时保存数据,然后在连接备份时流式传输数据。这是卡夫卡推荐的东西吗?我特别有以下问题:

  1. Kafka 是否有内置的方式让生产者拥有某种离线磁盘(不是内存中(存储缓存?
  2. Kafka 如何处理由于网络连接问题而无法发送的主题的消息?有没有办法将它们安排在队列中,然后等到与集群的连接恢复?
  3. 我可以使用哪些类型的本地存储选项,可以轻松地将其作为磁盘上的缓存进行交互?
  4. 如何让一个冗余的本地时间序列数据库(在嵌入式设备的存储上(只收集所有数据流,然后让代理负责将数据发送到 Kafka 集群,然后在数据库收到 Kafka 代理的确认时清理数据库?
  5. 有没有其他方法可以处理这些情况,即 Kafka 生产者与集群的连接断断续续,并且可以在连接时以块的形式发送流数据?

Kafka 生产者不提供离线模式,它无法以块 AFAIK 的形式流式传输数据。 我建议你做的是有一个回调,让生产者发送,并在失败时将消息的内容写入本地存储。然后,您应该有一个后台线程,该线程从本地存储中挑选所有刷新的数据,并无休止地尝试使用生产者发送它。基本上,这是您在设备上使用时间序列数据库的建议的幼稚方法。但是,无论是设备上的 FS 还是 DB,这都是满足您需求的唯一方法。

最新更新