kafka设计简要

生产端、消息存储队列中间层、消费端,都采用分布式集群。各层集群的节点状态和列表,通过zk记录、监控。
通过zk集中记录,生成端和消费端通过统一算法自行实现负载均衡的方式,避免了master单节点问题。(实时上,zk从广义上可以理解为master,但不做负载分配算法控制)
消息项以AOF方式在消息队列broker层顺序持久化到文件系统。以一定大小分文件存放,并以消息的位移命名文件,从而支持offset的二分法定位消息文件。
消费者自行从broker处拉数据,并自行保存完成消费数据的offset位移。消息在消费后,并不会从broker处删除,而是由broker定期清理消息文件。
生成者获取broker列表后,以roundrobin轮询push消息实现负载均衡。
消费者以一定算法完成消费者到broker分区的一一对应。例如有3个消费者,10个分区。则第一个消费者固定消费到分区0,3,6,9。通过1对1的方式,保证了消息不会被多个消费者重复记录。
任意节点都会在zk上注册临时node,一旦kfk任意服务器宕机,通过zk的watch机制,其它节点都可以观察到,从而立即进行一次负载均衡的重新分配。
kafka比起tair这样的分布式cache,相对构架简单(无master):消息无状态,可以发送到任意broker节点,消费者也可以从任意broker节点取消息,不会像cache集群那样有数据抖动问题。因此无需一个master来维护一个可靠稳定的分布式节点映射关系。
QA:
1、producer.publish('topic')是如何定位到哪几个broker及其分区?
2、消息在broker处是否有备份机制?假如一台broker宕机,会直接丢消息?
3、consumer如何保存消费偏移量?