处理 Kafka Producer 连接丢失
Dealing with Kafka Producer connection loss
与其说这是一个编码问题本身,不如说是一个实时流应用程序的架构设计。我们有以下设置:
- 现场有多个嵌入式物联网设备(内存太低,但可以选择拥有一些扩展的本地存储)
- 他们都将数据实时传输到 Kafka 集群,作为生产者,然后我们有 post- 处理应用程序作为消费者,帮助将数据存储在数据库中。
- 现在有时这些物联网设备会与 Kafka 集群中的一个节点失去连接,因为现场的网络连接并不总是可靠的。这种断开连接通常会持续一天。
现在我明白 Kafka 会处理集群中出现故障的节点(充当代理),但是如果我遇到生产者没有良好的网络连接并且无法将其数据发布到Kafka 主题因为它看不到它?
我们不能丢失任何数据,但好消息是我们为嵌入式物联网设备提供了可扩展的存储选项,我们可以在物联网设备离线时保存数据,然后在连接恢复时将其流式传输向上。这是 Kafka 推荐的东西吗?特别是我有以下问题:
- Kafka 是否有内置方式让生产者拥有某种离线磁盘上(不是内存中)存储缓存?
- Kafka 如何处理由于网络连接问题而无法发送到主题的消息?有没有一种方法可以将它们安排在队列中,然后等到与集群的连接恢复?
- 我可以使用什么样的本地存储选项,我可以轻松地将其作为我的磁盘缓存进行交互?
- 有一个冗余的本地时间序列数据库(在嵌入式设备的存储上)只是收集所有数据流,然后让代理负责将数据发送到 Kafka 集群,然后清理数据库在收到 Kafka 代理的确认后启动?
- 对于卡夫卡生产者与集群间歇性连接并且在连接时可以分块发送流数据的情况,是否有任何其他方法来处理这些情况?
Kafka producer 不提供离线模式,它不能在 AFAIK 块中流式传输数据。
我建议你做的是为生产者发送回调,并在失败时将消息的内容写入本地存储。然后你应该有一个后台线程,它从本地存储中挑选所有刷新的数据,并不断地尝试使用生产者发送它。基本上,这是您对设备上的时间序列数据库提出建议的幼稚方法。但是无论是设备上的FS还是DB,只有这样才能满足你的需求。
与其说这是一个编码问题本身,不如说是一个实时流应用程序的架构设计。我们有以下设置:
- 现场有多个嵌入式物联网设备(内存太低,但可以选择拥有一些扩展的本地存储)
- 他们都将数据实时传输到 Kafka 集群,作为生产者,然后我们有 post- 处理应用程序作为消费者,帮助将数据存储在数据库中。
- 现在有时这些物联网设备会与 Kafka 集群中的一个节点失去连接,因为现场的网络连接并不总是可靠的。这种断开连接通常会持续一天。
现在我明白 Kafka 会处理集群中出现故障的节点(充当代理),但是如果我遇到生产者没有良好的网络连接并且无法将其数据发布到Kafka 主题因为它看不到它?
我们不能丢失任何数据,但好消息是我们为嵌入式物联网设备提供了可扩展的存储选项,我们可以在物联网设备离线时保存数据,然后在连接恢复时将其流式传输向上。这是 Kafka 推荐的东西吗?特别是我有以下问题:
- Kafka 是否有内置方式让生产者拥有某种离线磁盘上(不是内存中)存储缓存?
- Kafka 如何处理由于网络连接问题而无法发送到主题的消息?有没有一种方法可以将它们安排在队列中,然后等到与集群的连接恢复?
- 我可以使用什么样的本地存储选项,我可以轻松地将其作为我的磁盘缓存进行交互?
- 有一个冗余的本地时间序列数据库(在嵌入式设备的存储上)只是收集所有数据流,然后让代理负责将数据发送到 Kafka 集群,然后清理数据库在收到 Kafka 代理的确认后启动?
- 对于卡夫卡生产者与集群间歇性连接并且在连接时可以分块发送流数据的情况,是否有任何其他方法来处理这些情况?
Kafka producer 不提供离线模式,它不能在 AFAIK 块中流式传输数据。 我建议你做的是为生产者发送回调,并在失败时将消息的内容写入本地存储。然后你应该有一个后台线程,它从本地存储中挑选所有刷新的数据,并不断地尝试使用生产者发送它。基本上,这是您对设备上的时间序列数据库提出建议的幼稚方法。但是无论是设备上的FS还是DB,只有这样才能满足你的需求。