繁体   English   中英

将应用程序从Kafka 0.8.2.1移植到Kafka 0.9.0。 阅读补偿问题

[英]Porting app from Kafka 0.8.2.1 to Kafka 0.9.0. Reading offsets issue

我们遇到的问题与我们的应用程序代码从0.8.2.1版本迁移到Apache Kafka的0.9.0.0有关。

在这种情况下,我们指的是Cloudera发布的Kafka版本:

kafka_2.10-0.8.2.0 - 卡夫卡1.3.2

kafka_2.11-0.9.0 - 卡夫卡2.0.2

我们在__consumer_offsets元数据主题上读取和写入偏移时检测到了问题。 特别是,我们使用BlockingChannel连接到Kafka Broker,在receive()方法调用时,我们得到一个EOFException。

尤其是:

java.io.EOFException
at org.apache.kafka.common.network.NetworkReceive.readFromReadableChannel (NetworkReceive.java:83)
at kafka.network.BlockingChannel.readCompletely (BlockingChannel.scala: 129)
at kafka.network.BlockingChannel.receive (BlockingChannel.scala: 120)

一个可能的原因可能是两个版本的Kafka API之间的差异。

卡夫卡0.8.2

在我们的应用中,我们打电话

ConsumerMetadataResponse.readFrom(channel.receive().buffer())

接收方法如下

def receive(): Receive = {
    if(!connected)
      throw new ClosedChannelException()

    val response = new BoundedByteBufferReceive()
    response.readCompletely(readChannel)

    response
}

我们可以看到它返回一个kafka.network.Receive,这是一个扩展特征kafka.network.Transmission的特征。 在此Receive中,缓冲区方法存在并在kafka.network.BoundedByteBufferReceive中被覆盖

def buffer: ByteBuffer = {
    expectComplete()
    contentBuffer
  }

卡夫卡0.9.0

我们将上一行更改为

GroupCoordinatorResponse.readFrom(channel.receive().payload())

此版本的API中的receive方法如下

 def receive(): NetworkReceive = {
    if(!connected)
      throw new ClosedChannelException()

    val response = readCompletely(readChannel)
    response.payload().rewind()

    response
  }

  private def readCompletely(channel: ReadableByteChannel): NetworkReceive =     {
    val response = new NetworkReceive
    while (!response.complete())
      response.readFromReadableChannel(channel)
    response
  }

正如我们所看到的,这将返回一个kafka.network.NetworkReceive,它是一个实现接口kafka.network.Receive的类,现在用java编写,与前一个完全不同。 这里没有缓冲区方法,只有一个返回内容的有效负载方法

    private ByteBuffer buffer;

我们怎么解决? 提前致谢

Kafka 0.9维护着旧的Kafka消费者,以实现与Kafka 0.8.2经纪商的向后兼容。 您正在使用仍然存在于Kafka 0.9中的旧消费者来阅读来自Kafka 0.9的消息。 您应该开始使用Kafka 0.9的新消费者API来读取Kafka 0.9经纪人的数据。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM