处理 Kafka Producer 连接丢失

Ati*_*Ali 5 apache-kafka iot

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

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

现在我知道 Kafka 负责处理集群中发生故障的节点(充当代理),但是如果我遇到这样的情况:生产者没有良好的网络连接,并且无法将其数据发布到 Kafka 主题,因为它不能看见?

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

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

Lio*_*aga 4

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

  • 对于再次遇到这个问题的人来说,需要注意的是,我们最终选择使用基于 MQTT 的消息传递系统,该系统基本上完全满足我们的需求,如我最初的问题中所述。请随意分享任何对您有用的不同建议! (3认同)