Skip to content

常见问题

约 485 字大约 2 分钟

2025-06-19

如何保证有序?

image Kafka 的消息实际上是保存在Partition上的,其内部可以认为是队列,因此在同一个Partition中是有序的 但不同Partition间,写与读均是独立的,因此不同Partition间无法保证有序

消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。Kafka 通过偏移量(offset)来保证消息在分区内的顺序性。

因此,要保证有序,必须使需要有序的消息放入同个Partition中;Kafka 在发送信息时允许指定四个参数:TopicPartitionkeydata,我们可以通过指定Partitionkey(其哈希值与分区数取模,得到投放的目标分区)来保证消息投放至同一个Partition

如何保证消息不丢失

生产者丢失消息

生产者发送消息时,可能由于网络原因没有成功发送,因此需要在消息发送后确认消息的发送

手动查询调用结果

SendResult<String, Object> sendResult = kafkaTemplate.send(topic, o).get();
if (sendResult.getRecordMetadata() != null) {
  logger.info("生产者成功发送消息到" + sendResult.getProducerRecord().topic() + "-> " + sendRe
              sult.getProducerRecord().value().toString());
}

send()方法是异步的,手动调用get()会使该方法的调用变为同步,使用异步调用可以避免该问题

回调查询结果

ListenableFuture<SendResult<String, Object>> future = kafkaTemplate.send(topic, o);
future.addCallback(result -> logger.info("生产者成功发送消息到topic:{} partition:{}的消息", result.getRecordMetadata().topic(), result.getRecordMetadata().partition()),
		ex -> logger.error("生产者发送消失败,原因:{}", ex.getMessage()));

压缩算法的比对

  • GZIP:延迟最低,压缩比高,但压缩和解压缩速度相对较慢
  • Snappy:压缩速度快,但压缩比低
  • LZ4:压缩速度(TPS)最高
  • ZStandard(zstd):牺牲一定的压缩速度,换取更高的压缩比

参考:Kafka 2.1.0压缩算法性能测试