4

有没有办法使用基于Spring Kafka的消费者实现断路器模式。我想知道在实现我的 Spring kafka 消费者时,如果基于某些外部系统处理数据失败并引发网络错误,是否可以停止消费记录。但是,如果网络问题得到解决,消费者应该再次正常处理。

4

3 回答 3

6

如果您想在下游服务或数据库关闭时停止消费消息,您可以参考此解决方案。

例子

  • 消费者正在调用服务 A
  • 服务 A 正在调用外部 HTTP 服务 B
  • 您想在外部服务 B 关闭时设置断路器

在这种情况下,您可以在服务 A 上设置断路器。每当外部服务 B 关闭时,该电路就会打开。然后在此断路器的状态转换时,调用您的侦听器/绑定(如果您使用的是 spring-cloud-stream)来停止/暂停消费者。因此,您的消息将保留在队列/主题上,直到断路器再次关闭,并且您不必死信消息或将它们放入错误队列/主题中。

您可以参考下面的链接以获取详细的解决方案,该解决方案使用Resilience4j 实现断路器spring-cloud-stream 用于消费者

https://dublincoders.com/circuit-breaker-kafka/

于 2020-02-17T14:43:35.317 回答
3

使用死信队列(DLQ)重试是处理消费者失败的好模式,而断路器模式是处理生产者问题的好模式。

于 2018-05-31T19:30:28.287 回答
0

鉴于:

  • 服务 A 产生到主题 T 事件 e1
  • 服务 B 从主题 T 事件 e1 消费并调用远程 REST 服务 r1

然后:

  • 由于服务 A 和 B 通过主题 T 进行交互,因此不需要背压。
  • 您需要关闭服务 B 和远程 REST 服务 r1 之间的电路。为此,您可以只使用 spring boot @HystrixCommand 并在“fallbackMethod”方法中抛出异常。这不会提交偏移,只要电路打开,您就会重新使用事件 e1。

我就是这样做的:-)如果您找到了更好的方法,请分享!

于 2018-09-13T14:21:18.270 回答