首页 > 解决方案 > 当单个应用程序实例中的基础设施问题时,Kafka 分区被阻塞

问题描述

在使用具有许多 POD 的 Kubernetes 运行微服务时,我遇到了一些微服务的问题。我使用手动提交策略,所以我应该确认或不确认每条消息。应用程序的所有实例都属于同一个 kafka 组。并且主题在 POD 之间至少有 20 个分区。使用消息时,侦听器调用外部组件(例如 WebClient 或 RestTemplate 的 rest API,或不同主题的 kafka 生产者)。Kafka 消费者如下所示:

  @KafkaListener(topics = "topic")
  @Trace
  public void listen(@Payload Object message, , Acknowledgment acknowledgment)) {
  try {
    api.call(message);
    acknowledgment.acknowledge();
  } catch (InfraException e) {
    acknowledgment.nack(1000);
  }

但有时这个外部组件存在基础设施问题并且不可用。当由于某种原因单个 POD 存在连接问题时,通常会发生此问题。由于消息未确认,他继续被消费,有什么好处。但问题是消息会继续发送到应用程序的同一个有问题的实例,并且永远不会重定向到另一个“健康”消费者。由于消费者能够从 kafka 获取消息并发送心跳,因此它永远不会被认为是有问题的即使在重新平衡之后,消费者也可以使用 kafka。我们可以在配置中采取一些策略或做些什么来解决这个问题或避免分区被阻塞?

感谢您迄今为止的关注。

标签: javakubernetesapache-kafkaspring-kafka

解决方案


推荐阅读