目录

kafka工作流程图

producer

产生消息的客户端,产生的消息发给topic中的某个partition。当然,你可以控制消息具体发到哪个partition(只要实现Partitioner即可)

import kafka.producer.Partitioner;
import kafka.utils.VerifiableProperties;

import java.io.PrintWriter;

public class ProducerPartitioner implements Partitioner {

    public ProducerPartitioner(VerifiableProperties props) {

    }
    public int partition(Object key, int numPartitions) {
        
        return Math.abs(key.hashCode() % 3);
    }
}
******************
在JProducer设置自己实现的partition类
props.put("partitioner.class", "ProducerPartitioner");
******************

broker

目的:管理多个partition(这些partition可能来自多个topic)

controller

目的:普通列表项目Kafka选举一个broker作为controller,这个controller通过watch Zookeeper检测所有的broker failure,并负责为所有受影响的parition选举leader,再将相应的leader调整命令发送至受影响的broker.

topic

目的:管理一类消息

partition

目的:partition 可以分布在多台机器上(机器间调度的最小单位)。用于分担topic的负载

partition leader

segment

目的:partition存储的逻辑单位,在文件系统中是一个目录(存在在参数log.dir指定的目录下)

consumer group

目的:管理多个consumer

如果有新的consumer加入group,或有旧的consmer挂掉,会导致consumer 和 partition对应关系重新分配

offset维护

所有consumer获取消息时会连接zookeeper。zookeeper保存每个consumer group对其所关注topic的每个分区的offset。这样任何时候consumer group都知道上次访问到哪条消息了。这次接着读取就好了。如下图

容错策略

分布式HA和Failover