消息队列
延迟队列
Kafka 都有哪些特点?
- 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
- 可扩展性:kafka集群支持热扩展
- 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
- 高并发:支持数千个客户端同时读写
Kafka 分区的目的?
分区对于 Kafka 集群的好处是:实现负载均衡。分区对于消费者来说,可以提高并发度,提高效率。
kafka 中的每个 partition 中的消息在写入时都是有序的,而且单独一个 partition 只能由一个消费者去消费,可以在里面保证消息的顺序性。但是分区之间的消息是不保证有序的。
Kafka 是如何实现高吞吐率的?
Kafka是分布式消息系统,需要处理海量的消息,Kafka的设计是把所有的消息都写入速度低容量大的硬盘,以此来换取更强的存储能力,但实际上,使用硬盘并没有带来过多的性能损失。kafka主要使用了以下几个方式实现了超高的吞吐率:
- 顺序读写
- 文件分段
- 零拷贝
- 批量发送
- 数据压缩
日志结构存储(Log-Structured Storage):只追加(Append-Only)写入:所有消息按到达顺序追加到分区(Partition)的日志文件中,写入操作天然顺序。不可变性(Immutable):已写入的消息不可修改或删除,避免了随机更新或覆盖操作。
分段(Segment)机制:按大小或时间切分日志:每个分区的日志被拆分为多个固定大小的 Segment 文件(例如 1GB)。当前活跃的 Segment(如 00000000000000000.log)仅用于写入,旧 Segment 只读
Kafka 不支持减少分区数,但支持增加分区。
避免重复消费
在消息处理逻辑中引入去重机制。例如,可以使用消息的唯一标识符(如消息ID)在处理前检查是否已经处理过该消息,从而避免重复处理。
kafka保证一致性:
producer 级别:acks=all(或者 request.required.acks=-1),发生模式为同步 producer.type=sync
acks = 0意味着如果生产者能够通过网络把消息发送出去,那么就认为消息已成功写入 Kafka ,
acks = 1:意味若Leader在收到消息并把它写入到分区数据文件,在这个模式下,如果发生正常的Leader选举,生产者会在选举时收到一个异常
ISR机制