在 Kafka 中,消息是以 ProducerRecord
和 ConsumerRecord
对象的形式进行封装和传输的。这些对象包含了消息的关键信息,如主题(Topic)、键(Key)、值(Value)、分区(Partition)、偏移量(Offset)等。以下是 Kafka 中消息的封装方式:
ProducerRecord
ProducerRecord
是生产者发送消息时使用的对象,用于封装待发送的消息内容。
- Topic(主题): 指定消息要发送到的主题,是消息的目的地。
- Key(键): 可选项,用于确定消息被发送到哪个分区。具有相同键的消息将被发送到同一个分区中。
- Value(值): 消息的实际内容,通常是需要传输的数据。
- Partition(分区): 可选项,如果未指定分区,则由分区器根据键的哈希值来决定消息被发送到哪个分区。
- Timestamp(时间戳): 可选项,消息的时间戳。
- Headers(头部): 可选项,用于存储消息的元数据信息。
ProducerRecord<String, String> record = new ProducerRecord<>("topic_name", "key", "value");
ConsumerRecord
ConsumerRecord
是消费者从 Kafka 中读取消息时接收到的对象,用于封装已接收的消息内容。
- Topic(主题): 指定消息所属的主题。
- Partition(分区): 指定消息所属的分区。
- Offset(偏移量): 指定消息在分区中的偏移量,用于唯一标识消息在分区中的位置。
- Key(键): 消息的键。
- Value(值): 消息的实际内容。
- Timestamp(时间戳): 消息的时间戳。
- Headers(头部): 消息的头部信息。
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));
for (ConsumerRecord<String, String> record : records) {
System.out.printf("topic = %s, partition = %d, offset = %d, key = %s, value = %s%n",
record.topic(), record.partition(), record.offset(),
record.key(), record.value());
}
通过使用这些消息对象,Kafka 实现了消息的封装和传输,使得生产者能够将消息发送到指定的主题,消费者能够从指定的主题消费消息,并且可以根据需要使用键和分区来控制消息的路由和顺序。