在前面的Sender源码阅读中,发现在kafka发送消息过程中,先获取消息,同时还检查了集群的信息,然后通过KafkaClient来完成发送。这一篇中将对kafka的消息组织结构,包括TopicPartition、ProducerBatch、Metadata等进行分析。
1.TopicPartition
TopicPartition的实现比较简单,将topic的名称以及对应的分区号进行了封装。只包含了以下几个变量,并重写了hashCode和equals方法。
private int hash = 0;
private final int partition;
private final String topic;
2.ProducerBatch
ProducerBatch用于存储一系列要发送的消息,其相关的数据组织结构如下所示。
2.1 Thunk/FutureRecordMetadata
Thunk是ProducerBatch的内部类,表示一个消息块。它包含了一个FutureRecordMetadata对象,表示发送记录后返回的结果。
FutureRecordMetadata实现了Future接口。包含了以下三个重要的方法
@Override
public RecordMetadata get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
// Handle overflow.
long now = time.milliseconds();
long timeoutMillis = unit.toMillis(timeout);
long deadline = Long.MAX_VALUE - timeoutMillis < now ? Long.MAX_VALUE : now + timeoutMillis;
boolean occurred = this.result.await(timeout, unit);
if (!occurred)
throw new TimeoutException("Timeout after waiting for " + timeoutMillis + " ms.");
if (nextRecordMetadata != null)
return nextRecordMetadata.get(deadline - time.milliseconds(), TimeUnit.MILLISECONDS);
return valueOrError();
}
get方法中,通过result.await来等待直到有请求结果返回。
RecordMetadata value() {
if (nextRecordMetadata != null)
return nextRecordMetadata.value();
return new RecordMetadata(result.