Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache kafka 在Kafka消息中添加自定义头_Apache Kafka - Fatal编程技术网

Apache kafka 在Kafka消息中添加自定义头

Apache kafka 在Kafka消息中添加自定义头,apache-kafka,Apache Kafka,通过使用kafka producer将文件转换为字节数组,我将文件作为消息发送 我还需要为消息添加一些标题,例如文件名、时间戳等,以便在使用者端,我可以根据文件名和其他标题处理消息 我目前正在做的是创建一个对象,将原始消息和头包装在其中,并将该对象作为消息以字节数组的形式发送 我想知道是否有一种方法可以在发布消息时添加自定义标题?卡夫卡对消息内容不可知,并且没有提供任何特殊的方法来丰富消息内容,因此这是您需要自己做的事情。处理这些事情的一种常见方法是使用结构化格式,如json,avro或类似网站

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

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

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


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

卡夫卡对消息内容不可知,并且没有提供任何特殊的方法来丰富消息内容,因此这是您需要自己做的事情。处理这些事情的一种常见方法是使用结构化格式,如json,avro或类似网站,您可以自由定义必要的字段,并可以轻松地将元数据添加到您的邮件中,然后将其发送给Kafka brokers。

我所从事的项目也遇到过类似的问题,因此我创建了这个简单的库来帮助解决这一问题:。目前包含一个基于Avro的实现,但它可以扩展为使用您选择的任何其他序列化框架

您只需为您想要在流上拥有的对象创建(反)序列化器(基于Avro或不基于Avro),并让AvroMessageSerializer发挥其魔力


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

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

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

新产品记录(键、值、标题等),其中标题类型为Iterable

有关更多详细信息,请参阅:


您可以创建自己的小型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);
}
publicstaticvoidmain(字符串[]args)抛出JsonProcessingException,
中断异常{
Properties props=新属性();
setProperty(ProducerConfig.BOOTSTRAP\u SERVERS\u CONFIG,“localhost:9092”);
props.setProperty(ProducerConfig.KEY\u序列化程序\u类\u配置,
JsonSerializer.class.getName());
setProperty(ProducerConfig.VALUE\u SERIALIZER\u CLASS\u CONFIG,JsonSerializer.CLASS.getName());
卡夫卡制作人=新卡夫卡制作人(道具);
字符串json=“{\'f1\':\'v1\'”;
ObjectMapper mapper=新的ObjectMapper();
JsonNode=mapper.readTree(json);
ProducerRecord记录=新的ProducerRecord(“测试主题”,jsonNode);
record.headers().add(新的RecordHeader(“key”,“value1.getBytes()));
制作人。发送(记录);
睡眠(10000);
}
String json=“{\“f1\”:\“v1\”}”-这是我们希望使用objectMapper发送给kafka并将其转换为jsonNode形式的键和值。 record.headers().add(new RecordHeader(“key”,“value1”.getBytes()))-这是我们发送给kafka的headers数据的键和值。
要验证您的数据,您可以在卡夫卡控制中心查看主题并验证发送的标题

记录级标题是从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);
List headers=Arrays.asList(新记录头(“头\键”、“头\值”.getBytes());
ProducerRecord记录=新的ProducerRecord(“主题”,空,“键”,“值”,标题);

因此,在这种情况下,我将获取整个主题中的所有消息,然后解析每条消息,然后根据我的元数据应用一些逻辑,我认为有一种方法可以获取包含特定元数据的消息,而不是所有消息。此答案已过时。标题已经在卡夫卡支持多年了。请演示这是如何解决问题的答案本身。请考虑接受由@ Michal Borowiecki提供的答案,以避免混淆谁寻找类似的解决方案。