1.kafka每个节点叫做broker,producer向kafka发送消息时,是将消息发送给指定的topic。同时每个topic下面还细问分partition,具体到每条消息细分到哪个partition,是根据消息的key参数以及配置的partition规则来的,由于多个partition的存在,所以针对同一个topic,其吞吐量更高,并发性也越强
2.partition中消息都是直接追加写到尾部的,这种顺序记录的方式其实比随机访问内存还快,从而使得读取消息也是能够顺序读取,速度也很快。
3.每个partition中又细分为segment,这是存储消息的最小物理单位,也是为了便于定时清理过期消息数据
4.kafka中有LEO(LogEndOffset:日志最后位置)和HW(highWaterMark:副本同步位置)的概念,其中LEO为每个partition的log最后一条日志的位置,HW为consumer能够看到的此partition的位置。一般来说,HW是要等到所有kafka follower都确认同步好partition后的partition的位置。LEO有可能不会等于HW的。
5.kafka并没有利用zookeeper来选举leader,而是利用zookeeper来记录每个partition的信息的,记录的信息有:每个consumer对应消费的partition的offset,consumer group中消费partition对应的consumer id,每个分片partition的副本同步状态等等
6.kafka选举:kafka leader负责所有的write和read(这点跟zookeeper好像不一样,zookeeper的leader负责write,follower可以read)候选kafa必须是已经同步了kafka lead所有commit的消息的follower中选举出来,这样能保证消息丢失的最小化
7.kafka的消息传送:默认都是以sync方式发送,也可以手动设置为async形式发送,虽然提高了效率,但是增大了丢失消息的风险。producer发送消息时,原则是是exactly once,但是还是存在at least once的可能:比如producer与kafka的网络中断,producer无法收到kafka的ack确认消息,会重试多次,这里就造成了at least once.
8.kafka会保证topic下面的每个消息只被consumer group下面的一个consumer消费,一个consumer会对应到一个topic下面的一个或者多个partition,一个partition只会被一个consumer group下面的consumer对应消费