1 kafka基本概念
Topic: producer向topic里面发布消息,consumer从topic里面读取消息,进行消费。
partition: 每个主题都可以有多个分区,每个分区对应带磁盘上面就是一个目录。,一个topic的分区可以分布在不同的broker,producer发布消息的时候,可以通过partition key,发布到具体的partition上面。当没有partition key的时候,就采取随机的选取分区。消费者消费消息的时候,也是可以指定消费具体的指定的partition的。也可以使用high_level consumer api来进行自动的进行负载均衡的。一个partion只能被一个consumer消费。一个topic里面partition的个数是可以指定的,默认是1.

broker:使用 ./kafka-server.sh start -daemon server.properties代表着启动一个broker,同一个主机是可以启动多个broker的,但是有前提的,就是server.properties里面的broker.id 不可以一样的,还有kafka存放数据和日志的配置目录最好不一样。
consumer: 可以部署多实例(对于同一个topic,可以有多个不同的group的用户来进行读取消息,一个group主可以有一个成员读取消息),可以批量拉取消息(提高IO,就和buffer的思想差不多)。有两类api可以使用:一个是simpleConsumer,暴露所有的操作给用户。可以提交offset,fetch offset ,指定partition fetch message;另外的一个是high_level consumer api(ZookeeperConsumerConnector),可以自动的帮助用户做自动的负载均衡,定期的提交offset,建立消费队列等。simpleConsumer相当于手动挡,high_level_相当于自动挡。
simpleConsumer: 无需像high_level consumer那样向zk注册brokerId,owner,甚至不需要提交offset到zk,可以将offset提交到任何的地方(mysql,本地文件)
high-level-consumer:一个进程中可以启多个消费线程,一个消费线程即是一个consumer,假设A进程里有2个线程(consumerid分别为1,2),B进程有2个线程(consumerid分别为1,2),topic1的partition有5个,那么partition分配是这样的:
partition1 ---> A进程consumerid1
partition2 ---> A进程consumerid1
partition3 ---> A进程consumerid2
partition4 ---> B进程consumer1
partition5 ---> B进程consumer2
Group high_level consumer : 可以声明group,每个group可以有多个consumer,每个consumer各自管理着自己的offset,各个不同的group之间互相不影响
由于目前版本消费的offset、owner、group都是consumer自己通过zk管理,所以group对于broker和producer并不关心,一些监控工具需要通过group来监控,simpleComsumer无需声明group。

参考的URL:https://www.jianshu.com/p/f94bb7a70ab6
网友评论