产生消息的客户端,产生的消息发给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"); ******************
目的:管理多个partition(这些partition可能来自多个topic)
目的:普通列表项目Kafka选举一个broker作为controller,这个controller通过watch Zookeeper检测所有的broker failure,并负责为所有受影响的parition选举leader,再将相应的leader调整命令发送至受影响的broker.
目的:管理一类消息
目的:partition 可以分布在多台机器上(机器间调度的最小单位)。用于分担topic的负载
leader fails,其中一个followers自动成为leader
目的:partition存储的逻辑单位,在文件系统中是一个目录(存在在参数log.dir指定的目录下)
目的:管理多个consumer
如果有新的consumer加入group,或有旧的consmer挂掉,会导致consumer 和 partition对应关系重新分配
所有consumer获取消息时会连接zookeeper。zookeeper保存每个consumer group对其所关注topic的每个分区的offset。这样任何时候consumer group都知道上次访问到哪条消息了。这次接着读取就好了。如下图