topic:自定义的一个队列 broker:broker通常就是一台物理机器,在上面运行kafka server的一个实列,每个broker会给自己分配一个唯一的broker id。broker集群通过zookeeper集群来管理的。在0.9.0中,producer/consumer已经不会依赖zookeeper来获取集群的配置信息,而是通过任意一个broker来获取整个集群的配置信息
如上图所示:只有服务端依赖zk,客户端不依赖zk
partition
kafka的topic,在每个机器上,是用文件存储的。partition就是文件的目录,目录下面包含包含index后缀和log后缀的文件
replica/leader/follower
每个topic的partion的所有消息,都是存储了多份,在多个broker上冗余存储,这多台机器就叫一个replica集合。在这个replica集合中,需要选出1个leader,剩下的是follower。也就是master/slave。发送消息的时候,只会发送给leader,然后leader再把消息同步给followers(以pull的方式,followers去leader上pull,而不是leader push给followers)。这里replica/leader/follower都是逻辑概念,并且是相对"partion"来讲的,而不是"topic"。还有一点是leader收到消息之后,是否直接返回给produce,取决于客户端ack(0,1,all)的配置,然后followers在进行同步。
消息队列的各种策略和语义
1.ack:request.required.acks有三种策略分别如下;0表示不等服务器ack就返回了,性能最高,可能丢数据;1表示leader确认消息存下来了,再返回;all表示leader和当前ISR中所有replica都确认消息后,在返回;
注:在0.9.0以前的版本是用-1表示all
同步发送vs异步发送
0.8.2开始,引入了一套新的Java版的client api,需要如下四个参数
1)队列的最大长度:buffer.memory//缺省32M
2)队列满了,客户端是阻塞,还是抛异常出来:block.on.buffer.full//true:阻塞消息/false:抛异常
3)发送的时候,可以批量发送的数据量:batch.size//default:16384,即16k
4)最长等多长时间,批量发送:linger.ms//缺省是0;//类似TCP/IP协议中的linger algorithm
5)消息的最大长度:max.request.size//缺省是1048576,即1M