使用死信队列构建响应式事件驱动应用

事件驱动架构促进系统响应真实事件,比如用户个人资料更新时。本文阐述了通过结合Spring WebFlux、Apache Kafka和死信队列构建处理数据丢失的反应式事件驱动应用。当这些技术一起使用时,它们为创建容错、弹性和高性能系统提供了框架,这对需要高效处理海量数据的大型应用非常重要。

本文中使用的特性

  • Spring Webflux:它提供了一个响应式范式,依赖于非阻塞背压以同时处理事件。
  • Apache Kafka:响应式Kafka生产者和消费者有助于构建高效和适应性强的处理流水线。
  • 响应式流:它们不会阻塞Kafka生产者和消费者的流执行。
  • 死信队列(DLQ):DLQ暂时存储因各种原因无法处理的消息。DLQ消息可以后续重新处理,以防止数据丢失并使事件处理具有弹性。

响应式Kafka生产者

一个 响应式Kafka 生产者并行推送消息,并且在发布时不会阻塞其他线程。这在需要处理大量数据的场景中非常有利。它与Spring WebFlux很好地结合,并在微服务架构中处理背压。这种集成不仅有助于处理大消息,还能很好地管理云资源。

上面展示的响应式Kafka生产者可以在 GitHub上找到

响应式Kafka消费者

响应式Kafka消费者无阻塞地拉取Kafka消息,并保持高吞吐量。它还支持背压处理,并与WebFlux完美集成以进行实时数据处理。响应式消费者管道很好地管理资源,非常适合部署在云中的应用程序。

上面展示的响应式Kafka消费者可以在 GitHub上找到

死信队列(DLQ)

一个DLQ是一个简单的Kafka主题,用于存储由生产者发送但无法处理的消息。在实时情况下,我们需要系统在没有阻塞和故障的情况下正常运行,这可以通过将这些消息重定向到死信队列来实现在事件驱动架构中。

死信队列集成的好处

  • 它提供了一个备用机制,以防止消息流中断。
  • 它允许保留未处理的数据,并有助于防止数据丢失。
  • 它存储失败的元数据,最终有助于分析根本原因。
  • 它为重新处理未处理的消息提供了多次尝试的机会。
  • 它解耦了错误处理,并使系统具有弹性。

可以通过以下方式将失败的消息从生产者代码推送到DLQ中:

如下所示,需要在响应式消费者中创建一个DLQ处理程序

结论

将DLQ与反应式生产者和消费者结合,有助于构建可靠、容错且高效的事件驱动应用程序。反应式生产者确保非阻塞消息发布;另一方面,反应式消费者以背压方式处理消息,提高响应能力。DLQ提供了一种回退机制,防止中断并避免数据丢失。

上述架构确保了系统故障的隔离,并有助于调试,从而进一步改进应用程序。

上述参考代码可以在GitHub生产者GitHub消费者中找到。

有关反应式生产者和消费者的更多细节,可以在ReactiveEventDriven找到。Spring Apache Kafka文档中有关于DLQ的更多信息。

Source:
https://dzone.com/articles/reactive-event-driven-app-with-dead-letter-queue