处理Kafka Producer连接丢失

时间:2019-12-11 17:47:06

标签: apache-kafka iot

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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