在Kafka消息中添加自定义标头

时间:2015-03-13 05:43:38

标签: apache-kafka

我通过使用kafka producer将其转换为字节数组来发送文件作为消息。

我还需要为消息添加一些标题,例如文件名,时间戳等,因此在消费者端我可以根据文件名和其他标题处理消息。

我目前正在做的是创建一个对象并将原始消息和标头包装在其中,并将字节数组中的对象作为消息发送。

我想知道在发布消息时是否可以添加自定义标题?

5 个答案:

答案 0 :(得分:24)

Kafka v0.11.0.0增加了对自定义标头的支持。

您可以在创建ProducerRecord时添加它们,如下所示:

new ProducerRecord(key,value, headers ,...),其中header的类型为Iterable< Header>

有关详细信息,请参阅:

https://issues.apache.org/jira/browse/KAFKA-4208

https://cwiki.apache.org/confluence/display/KAFKA/KIP-82+-+Add+Record+Headers

答案 1 :(得分:3)

Kafka对消息内容不可知,并没有提供任何特殊方法来丰富它,所以这是你自己需要做的事情。处理这些事情的常用方法是使用结构化格式,例如json,avro或类似的,您可以自由定义必要的字段,并可以轻松地将元数据添加到您的消息并将其发送给Kafka经纪人。

答案 2 :(得分:1)

我已经处理了与我合作过的项目类似的问题所以我创建了这个简单的库来帮助解决这个问题:https://github.com/leandronunes85/messaging。目前包含基于Avro的实现,但它可以扩展为使用您选择的任何其他序列化框架。

您只需为要在流上创建的对象(基于Avro或不基于Avro)创建(de)序列化程序,并让AvroMessageSerializer发挥其神奇作用。

这仍然是一个非常年轻的图书馆,但我觉得它可以为很多人节省很多时间!

答案 3 :(得分:1)

记录级别标题是从Kafka 0.11.0中引入的。我们可以在每个记录中发送标题列表。

List<Header> headers = Arrays.asList(new RecordHeader("header_key", "header_value".getBytes()));
ProducerRecord<String, String> record = new ProducerRecord<>("topic", null, "key", "value", headers);

答案 4 :(得分:0)

您可以创建自己的小型Java应用程序,以将带有标头的消息发送到kafka。 在intellij或任何支持的IDE中编写以下代码:-

public static void main(String[] args) throws JsonProcessingException, 
InterruptedException {
  Properties props=new Properties();       
  props.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"localhost:9092");
  props.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, 
  JsonSerializer.class.getName());
  props.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,JsonSerializer.class.getName());

  KafkaProducer<String, JsonNode> producer=new KafkaProducer<String, JsonNode>(props);
  String json = "{ \"f1\" : \"v1\" } ";
  ObjectMapper mapper = new ObjectMapper();
  JsonNode jsonNode = mapper.readTree(json);
  ProducerRecord<String,JsonNode> record =new ProducerRecord<String, 
  JsonNode>("test topic", jsonNode);
  record.headers().add(new RecordHeader("key","value1".getBytes()));
  producer.send(record);
  Thread.sleep(10000);
}

String json =“ {\” f1 \“:\” v1 \“}”-这是我们要使用objectMapper发送给kafka并将其转换为jsonNode形式的键和值。 record.headers()。add(new RecordHeader(“ key”,“ value1” .getBytes()))-这是我们要发送到kafka的标头数据的键和值。 要验证您的数据,您可以在kafka控制中心中检查主题并验证发送的标头。

相关问题