通过 Apache Kafka 中的死信队列进行错误处理( 二 )


Kafka Connect 内置死信队列
Kafka Connect 是 Kafka 的集成框架 。它包含在开源 Kafka 下载中 。不需要其他依赖项(除了您部署到 Connect 集群中的连接器本身) 。
默认情况下,如果由于使用无效消息而发生错误(例如使用错误的 JSON 转换器而不是正确的 AVRO 转换器时),Kafka Connect 任务将停止 。删除无效消息是另一种选择 。后者容忍错误 。
Kafka Connect 中 DLQ 的配置很简单 。只需将两个配置选项 ' errors.tolerance' 和 ' errors.deadletterqueue.topic.name' 的值设置为正确的值:

通过 Apache Kafka 中的死信队列进行错误处理

文章插图
博客文章“ Kafka Connect Deep Dive – 错误处理和死信队列”显示了使用 DLQ 的详细动手代码示例 。
Kafka Connect 甚至可以用于处理 DLQ 中的错误消息 。只需部署另一个使用 te DLQ 主题的连接器 。例如,如果您的应用程序处理 Avro 消息并且传入消息是 JSON 格式 。然后连接器使用 JSON 消息并将其转换为 AVRO 消息以成功重新处理:
通过 Apache Kafka 中的死信队列进行错误处理

文章插图
请注意,Kafka Connect 没有用于源连接器的死信队列 。
Kafka Streams 应用程序中的错误处理
Kafka Streams 是 Kafka 的流处理库 。它可与其他流式传输框架相媲美,例如 Apache Flink、Storm、Beam 和类似工具 。但是,它是 Kafka 原生的 。这意味着您可以在单个可扩展且可靠的基础架构中构建完整的端到端数据流 。
如果您分别使用 Java(JVM 生态系统)来构建 Kafka 应用程序,建议几乎总是使用 Kafka Streams 而不是 Kafka 的标准 Java 客户端 。为什么?
 
  1. Kafka Streams“只是”一个围绕常规 Java 生产者和消费者 API 的包装器,以及许多内置的附加功能 。
  2. 两者都只是嵌入到 Java 应用程序中的库(JAR 文件) 。
  3. 两者都是开源 Kafka 下载的一部分 - 没有额外的依赖项或许可证更改 。
  4. 许多问题已经开箱即用地解决,以构建成熟的流处理服务(流功能、有状态的嵌入式存储、滑动窗口、交互式查询、错误处理等等) 。
 
Kafka Streams的内置功能之一是默认的反序列化异常处理程序 。它允许您管理无法反序列化的记录异常 。损坏的数据、不正确的序列化逻辑或未处理的记录类型都可能导致错误 。该功能不称为死信队列,但开箱即用地解决了相同的问题 。
Spring Kafka 和 Spring Cloud Stream 的错误处理
Spring 框架对 Apache Kafka 有很好的支持 。它提供了许多模板以避免自己编写样板代码 。Spring-Kafka 和 Spring Cloud Stream Kafka 支持各种重试和错误处理选项,包括基于时间/计数的重试、死信队列等 。
尽管 Spring 框架功能非常丰富,但它有点重,并且有一个学习曲线 。因此,它非常适合新建项目,或者如果您已经将 Spring 用于其他场景的项目 。
有很多很棒的博客文章展示了不同的示例和配置选项 。还有用于死信队列的官方 Spring Cloud Stream 示例 。Spring 允许使用简单的注释构建逻辑,例如 DLQ 。这种编程方法是一些开发人员钟爱的范例,而另一些则不喜欢它 。只需了解选项并为自己选择合适的选项即可 。
Apache Kafka 并行消费者的可扩展处理和错误处理
在许多客户对话中,事实证明,请求死信队列的主要原因通常是处理连接到外部 Web 服务或数据库的失败 。超时或 Kafka 无法并行发送各种请求会导致某些应用程序瘫痪 。这个问题有一个很好的解决方案:
Apache Kafka的并行消费者是Apache 2.0 许可下的开源项目 。它提供了一个带有客户端队列的并行 Apache Kafka 客户端包装器、一个具有关键并发性的更简单的消费者/生产者 API,以及可扩展的非阻塞 IO处理 。
该库允许您通过单个 Kafka Consumer 并行处理消息,这意味着您可以在不增加要处理的主题中的分区数量的情况下增加 Kafka Consumer 并行度 。对于许多用例,这通过减少 Kafka 代理的负载来提高吞吐量和延迟 。它还开辟了新的用例,例如极端并行性、外部数据丰富和排队 。
一个关键特性是在单个 Kafka 消费者应用程序中处理/重复 Web 服务和数据库调用 。并行化避免了一次发送单个 Web 请求的需要:


推荐阅读