apache-kafka - 处理来自 Kafka 的消息时避免数据丢失
问题描述
寻找设计我的 Kafka Consumer 的最佳方法。基本上,我想看看在处理消息期间出现任何异常/错误时避免数据丢失的最佳方法是什么。
我的用例如下。
a)我使用 SERVICE 处理消息的原因是 - 将来我计划编写一个 ERROR PROCESSOR 应用程序,该应用程序将在一天结束时运行,它将尝试处理失败的消息(不是所有消息,但是由于缺少父项等任何依赖项而失败的消息)再次出现。
b)我想确保消息丢失为零,因此我会将消息保存到文件中,以防在将消息保存到数据库时出现任何问题。
c) 在生产环境中,可能有多个消费者和服务实例正在运行,因此多个应用程序很有可能尝试写入同一个文件。
Q-1) 写入文件是避免数据丢失的唯一选择吗?
Q-2) 如果它是唯一的选项,如何确保多个应用程序写入同一个文件并同时读取?请考虑将来一旦构建错误处理器,它可能会在另一个应用程序尝试写入文件时从同一文件中读取消息。
错误处理器- 我们的来源遵循事件驱动机制,有时依赖事件(例如,某事的父实体)很可能会延迟几天。所以在那种情况下,我希望我的错误处理器多次处理相同的消息。
解决方案
我以前遇到过类似的事情。所以,直接进入你的问题:
不一定,您也许可以在新主题中将这些消息发送回 Kafka(比如说 -
error-topic
)。因此,当您的错误处理器准备就绪时,它可以只监听 thiserror-topic
并在这些消息进入时使用它们。我认为这个问题已经解决了第一个问题。因此,与其使用文件来写入和读取并同时打开多个文件句柄来执行此操作,Kafka 可能是更好的选择,因为它是为此类问题而设计的。
注意:以下几点只是基于我对您的问题领域的有限理解的一些思考。因此,您可以选择安全地忽略它。
关于组件的设计还有一点值得考虑service
- 您不妨考虑通过将所有错误消息发送回 Kafka 来合并第 4 点和第 5 点。这将使您能够以一致的方式处理所有错误消息,而不是将一些消息放在错误数据库中,而将一些消息放在 Kafka 中。
编辑:基于错误处理器要求的附加信息,这里是解决方案设计的图表表示。
我现在故意保留 ERROR PROCESSOR 抽象的输出只是为了保持它的通用性。
我希望这有帮助!
推荐阅读
- java - 404 not found - 在此服务器上找不到请求的 URL /hello-servlet - 在 Google AppEngine 上部署后
- homebrew - 无法在 M1 Silicon 中安装 UPX
- html - 我可以在验证中使用 .val 作为我的 MAXLENGHT 吗?
- c# - 如何使用 windows 窗体 c# 中的按钮更改单选按钮组中的选中项?
- python - 关于 pygame.mask 函数的问题
- azure-cognitive-search - path_hierarchy_v2 不能与 Azure 认知搜索中的构面字段一起使用
- ios - 只有几个值?
- typescript - 在不知道 TypeScript 中的属性键的情况下定义对象类型
- javascript - SDP 问题:WebRTC 连接失败 Firefox 但不是 Chrome
- c# - 如何比较两个 Object 类型的变量?