首页 > 解决方案 > 处理来自 Kafka 的消息时避免数据丢失

问题描述

寻找设计我的 Kafka Consumer 的最佳方法。基本上,我想看看在处理消息期间出现任何异常/错误时避免数据丢失的最佳方法是什么。

我的用例如下。

在此处输入图像描述

a)我使用 SERVICE 处理消息的原因是 - 将来我计划编写一个 ERROR PROCESSOR 应用程序,该应用程序将在一天结束时运行,它将尝试处理失败的消息(不是所有消息,但是由于缺少父项等任何依赖项而失败的消息)再次出现。

b)我想确保消息丢失为零,因此我会将消息保存到文件中,以防在将消息保存到数据库时出现任何问题。

c) 在生产环境中,可能有多个消费者和服务实例正在运行,因此多个应用程序很有可能尝试写入同一个文件。

Q-1) 写入文件是避免数据丢失的唯一选择吗?

Q-2) 如果它是唯一的选项,如何确保多个应用程序写入同一个文件并同时读取?请考虑将来一旦构建错误处理器,它可能会在另一个应用程序尝试写入文件时从同一文件中读取消息。

错误处理器- 我们的来源遵循事件驱动机制,有时依赖事件(例如,某事的父实体)很可能会延迟几天。所以在那种情况下,我希望我的错误处理器多次处理相同的消息。

标签: apache-kafkakafka-consumer-apifile-writing

解决方案


我以前遇到过类似的事情。所以,直接进入你的问题:

  • 不一定,您也许可以在新主题中将这些消息发送回 Kafka(比如说 - error-topic)。因此,当您的错误处理器准备就绪时,它可以只监听 thiserror-topic并在这些消息进入时使用它们。

  • 我认为这个问题已经解决了第一个问题。因此,与其使用文件来写入和读取并同时打开多个文件句柄来执行此操作,Kafka 可能是更好的选择,因为它是为此类问题而设计的。

注意:以下几点只是基于我对您的问题领域的有限理解的一些思考。因此,您可以选择安全地忽略它。

关于组件的设计还有一点值得考虑service- 您不妨考虑通过将所有错误消息发送回 Kafka 来合并第 4 点和第 5 点。这将使您能够以一致的方式处理所有错误消息,而不是将一些消息放在错误数据库中,而将一些消息放在 Kafka 中。

编辑:基于错误处理器要求的附加信息,这里是解决方案设计的图表表示。

在此处输入图像描述

我现在故意保留 ERROR PROCESSOR 抽象的输出只是为了保持它的通用性。

我希望这有帮助!


推荐阅读