Kafka-基本概念
Published:
Kafka 基本概念
消息队列
消息队列是一种进程间通信或同一进程的不同线程间的通信方式,它可以实现异步、解耦、削峰等功能。消息队列有很多种,比如RabbitMQ、Kafka、ActiveMQ等。
消息队列的优点有以下几个:
- 解耦:消息队列可以让发送者和接收者不直接依赖,降低系统的耦合度。
- 异步:消息队列可以让发送者不需要等待接收者的处理,提高响应速度。
- 削峰:消息队列可以缓冲突发的高并发请求,避免系统过载。 消息队列的缺点有以下几个:
- 增加系统复杂度:消息队列需要额外的部署和维护,也需要考虑可靠性、可用性、监控等问题。
- 一致性问题:消息队列可能会导致数据不一致,比如发送者发送了消息但是接收者没有收到或者处理失败。
- 消息积压问题:如果接收者处理能力不足或者出现故障,消息队列可能会出现大量的未消费的消息,影响系统性能。
Topic
一个 Topic(主题)对应一个消息队列。Kafka 支持多生产者,多消费者,如下图:
多个生产者将数据发送到 Kafka 中,Kafka 将它们顺序存储。Kafka 的目标是大数据,如果将消息存在一个“中心”队列中,势必缺少可伸缩性。无论是生产者/消费者数目的增加,还是消息数量的增加,都可能耗尽机器的性能或存储。
因此,Kafka 在概念上将一个 Topic 分成了多个 Partition,写入 topic 的消息会被(平均)分配到其中一个 Partition。Partition 中会为消息保存一个 Partition 内唯一的 ID ,一般称为偏移量(offset)。这样当性能/存储不足时 Kafka 就可以通过增加 Partition 实现横向扩展。
Kafka是按照顺序存储数据的,每个分区(Partition)中的每条记录都会被分配一个唯一的序号(Offset)。Offset是一个递增的、不可变的数字,由Kafka自动维护。当一条记录写入Partition的时候,它就被追加到日志文件(log)的末尾,并被分配一个序号,作为Offset。这样,Kafka可以保证同一个分区内的消息是有序的。