首页 > 解决方案 > 哪些异常会传播到 Kafka API 中的客户端应用程序代码

问题描述

我正在使用 Kafka Java API v2.1。我想知道什么样的异常会从底层 API 传播到客户端应用程序代码

这是我为发送调用生成的回调代码:

        @Override
    public void onCompletion(RecordMetadata metadata, Exception e) {
        if (e == null) {
            if (LOG.isLoggable(Level.FINEST)) {
                LOG.finest("Sent message " + mySentRecord
                           + " with offset " + metadata.offset()
                           + " on topic:partition "
                           + metadata.topic() + ":" + metadata.partition());
            }
        }
        else {
            try {
                throw e;
            }
            catch (NotEnoughReplicasAfterAppendException |
                   NotEnoughReplicasException |
                   TimeoutException exception )
            {
                StringWriter outError = new StringWriter();
                e.printStackTrace(new PrintWriter(outError));
                LOG.warning(outError.toString());
            }
            catch (Exception exception) {
                throw new ApplicationDeath(exception);
            }
        }
    }

在这里,我捕获了 NotEnoughReplicasAfterAppendException、NotEnoughReplicasException 和 TimeoutException,但是当我在 ISR 中杀死代理时,除了超时异常之外,我什么也没看到。我没有看到任何断开连接异常或没有足够的副本异常。

我知道 Kafka API 将在内部重试连接,但我想在应用程序代码中收到此类尝试的通知。同样,除了元数据超时,我在消费者代码中看不到任何此类异常。

我怎样才能做到这一点并获得有关任何连接中断、副本不足等的通知?我应该在这里捕获和处理哪些其他异常?

谢谢,阿比

标签: javaapache-kafkakafka-consumer-apikafka-producer-api

解决方案


首先,永远不要throw e抓住它。

而是检查if (e instanceof ExceptionClass)


这些都列在 JavaDoc 中

在此处重新格式化以提高可读性。

不可重试异常(致命,永远不会发送消息):

  • 无效主题异常
  • OffsetMetadataTooLargeException
  • RecordBatchTooLargeException
  • 记录太大异常
  • 未知服务器异常

可重试异常(瞬态,可以通过增加#.retries 来覆盖):

  • 损坏记录异常
  • 无效元数据异常
  • NotEnoughReplicasAfterAppendException
  • NotEnoughReplicasException
  • OffsetOutOfRangeException
  • 超时异常
  • 未知主题或分区异常

推荐阅读