Создание сообщения Kafka с нулевым значением (Tombstone) из консоли - PullRequest
0 голосов
/ 28 августа 2018

Есть ли способ создать сообщение в kafka-console-produser с нулевым значением (т. Е. Пометить его, чтобы компактор удалил его надгробной плитой)?

Я пытался создать "mykey" и "mykey |". Первая выдает ошибку, а вторая делает значение пустой строкой. Бегущий продюсер вот так:

$KAFKA_HOME/bin/kafka-console-producer --broker-list localhost:9092 --topic mytopic --property "parse.key=true" --property "key.separator=|"

1 Ответ

0 голосов
/ 28 августа 2018

К сожалению, нет способа сделать это с помощью console-производители

это фрагмент кода из класса ConsoleProducer (как он читает данные). Кафка 0.11.0 (не думайте, что она значительно изменилась в разных версиях).

override def readMessage() = {
  lineNumber += 1
  print(">")
  (reader.readLine(), parseKey) match {
    case (null, _) => null
    case (line, true) =>
      line.indexOf(keySeparator) match {
        case -1 =>
          if (ignoreError) new ProducerRecord(topic, line.getBytes(StandardCharsets.UTF_8))
          else throw new KafkaException(s"No key found on line $lineNumber: $line")
        case n =>
          val value = (if (n + keySeparator.size > line.size) "" else line.substring(n + keySeparator.size)).getBytes(StandardCharsets.UTF_8)
          new ProducerRecord(topic, line.substring(0, n).getBytes(StandardCharsets.UTF_8), value)
      }
    case (line, false) =>
      new ProducerRecord(topic, line.getBytes(StandardCharsets.UTF_8))
  }
}

как вы можете видеть, значение всегда является необнуляемым массивом байтов

...