【问题标题】:How to save in local storage messages when Kafka Producer does not send a message?Kafka Producer 不发送消息时,如何将消息保存在本地存储中?
【发布时间】:2020-03-05 23:47:47
【问题描述】:

我有 120 个使用 Kakfa Producer 的数据生产者,他们每秒发送消息,有些有敏感数据(我的意思是,我们必须发送是或是),而且这些生产者有时可能会关闭或失去互联网连接,所以我需要生产者的容错性。我知道有发送它的方式,同步和异步,他们坚持尝试发送数据并将其保存在内存中,但如果我想将它保存在磁盘而不是缓冲内存中,我们怎么能这样做。如果没有发送消息,我们怎么能将消息持久保存在磁盘中?我们如何控制 Kafka 生产者何时抛出异常?

【问题讨论】:

    标签: apache-kafka iot kafka-producer-api


    【解决方案1】:

    您可以在本地事务中将消息插入到数据库表中。之后,通过使用线程,您可以发送消息,并且在从 Kafka 获得确认后,您可以将消息表中的已发送列更新为 true。因此,您的线程应该不断地从消息表中读取发送字段为假的消息并将消息发送到 Kafka。 (如果你有多个实例,leader instance应该负责向Kafka发送消息以避免重复)

    注意:您也可以使用单独的服务向 Kafka 发送消息,如下所示。

    更多信息您可以查看this

    【讨论】:

    • 有趣的模式,谢谢,这是个好主意。最后,我实现了另一个解决方法,我在线程中使用了同步 kafka 方法(它似乎没有意义,因为已经存在异步方法)并且我配置了 max.block.ms 以强制发生 TimoutException,当这种情况发生时我保存。另一方面,我使用 AtomicBoolean 作为标志来协调恢复过程。
    【解决方案2】:

    我建议改为立即写入文件。

    使用在每台机器上运行的 Filebeat、Fluentbit、Flume 等工具将数据汇集到 Kafka 中

    【讨论】:

      【解决方案3】:

      在这种情况下,您的 Kafka 用例是错误的。我建议将数据保存在 NOSQL 数据库中,而不是发送到 Kafka。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-14
        • 2020-08-18
        • 2021-06-01
        • 2021-11-09
        • 1970-01-01
        相关资源
        最近更新 更多