Kafka是一个持久化消息发布订阅系统,常用于消息队列、日志通道等场景。
Kafka的一些名词解释和概述:
名词 | 解释 |
Producer | Kafka通过Producer产生数据push到Kafka服务器中。 |
topic | Kafka通过topic来对不同类别的队列进行隔离,每个push的消息必须制定属于哪个topic |
Broker | 每一个Kafka的机器被称为一个Broker。 |
Cluster | 多个Broker组成一个Kafka集群(Kafka Cluster) |
Consumer | Kafka中的数据通过Consumer指定不同的offset进行消费 |
Partition | Kafka支持数据分区,每个topic可以包含多个分区,并将分区分布在不同的服务器上,同时设置其中一个为leader,其余几个通过复制来进行数据副本,保证集群在N-1个挂掉仍然可用 |
Group | 多个Consumer组成一个Group,用于负载均衡的进行消费 |
Offset
在Kafka中Consumer在消费队列中的数据时候,需要通过指定offset来告诉当前消费的进度。
offset不在broker中进行维护,需要在客户端维护。可以设置Offset自动增长或者手动进行commit两种方式。一般会使用手动commit的方式来防止程序异常的时候队列数据没有消费被直接跳过。
Group
多个Consumer组成一个Group的时候,发送到这个Group的数据会分别被Group中的Consumer来进行消费,如果Consumer A消费了这条数据,那么Consumer B就不会受到这条数据。
同一个Topic可以同时被不同的Group以订阅的形式进行拉取,他们的offset是相互隔离的。比如我在kafka的Consumer用三个Group来进行拉取分别对应:Hadoop、Storm、log collention等,这样每个Consumer Group都可以接收到相同的数据。
Partition
kafka通过分区的方式来增加吞吐量和处理容灾。每个offset可以存放在不同的分区中,每个partition对应一个文件夹,kafka保证每个Partition中的数据是有序的,每个push到offset的消息,会被有序的追加到Partition的结尾。
Kafka中对每个Partition进行主从复制,可以配置为一主多从的方式进行数据副本。同时保证N-1个Broker挂掉的时候数据不丢失。
Consumer在进行消费的时候可以指定Partition进行消费。但是不可以指定多个Consumer消费一个Partition。