常见问题
约 485 字大约 2 分钟
2025-06-19
如何保证有序?
Kafka 的消息实际上是保存在Partition上的,其内部可以认为是队列,因此在同一个Partition中是有序的 但不同Partition间,写与读均是独立的,因此不同Partition间无法保证有序
消息在被追加到 Partition(分区)的时候都会分配一个特定的偏移量(offset)。Kafka 通过偏移量(offset)来保证消息在分区内的顺序性。
因此,要保证有序,必须使需要有序的消息放入同个Partition中;Kafka 在发送信息时允许指定四个参数:Topic、Partition、key、data,我们可以通过指定Partition与key(其哈希值与分区数取模,得到投放的目标分区)来保证消息投放至同一个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):牺牲一定的压缩速度,换取更高的压缩比
