1、kafka 简介
kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理百万级QPS(每秒访问次数)的动作流数据。
2、kafka名词解释
producer :生产者
consumer:消费者。
topic: 消息以topic为类别记录,Kafka将消息分门别类,每一类的消息称之为一个主题(Topic)。
broker:以集群的方式运行,可以由一个或多个服务组成,每个服务(server)叫做一个broker;消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。
每个消息(也叫作record记录,也被称为消息)是由一个key,一个value和时间戳构成。
3、kafka应用场景
(1) 构建实时的流数据管道,可靠地获取系统和应用程序之间的数据。
(2) 构建实时流的应用程序,对数据流进行转换或反应。
4、kafka消息传输流程
Producer即生产者,向Kafka集群发送消息,在发送消息之前,会对消息进行分类,即Topic,上图展示了两个producer发送了分类为topic1的消息,另外一个发送了topic2的消息。
Topic即主题,通过对消息指定主题可以将消息分类,消费者可以只关注自己需要的Topic中的消息
Consumer即消费者,消费者通过与kafka集群建立长连接的方式,不断地从集群中拉取消息,然后可以对这些消息进行处理。
从上图中就可以看出同一个Topic下的消费者和生产者的数量并不是对应的。
5、kafka服务器消息存储策略
Topic在逻辑上可以被认为是一个queue,每条消费都必须指定它的Topic,可以简单理解为必须指明把这条消息放进哪个queue里。为了使得Kafka的吞吐率可以线性提高,物理上把Topic分成一个或多个Partition,每个Partition在物理上对应一个文件夹,该文件夹下存储这个Partition的所有消息和索引文件。若创建topic1和topic2两个topic,且分别有13个和19个分区,则整个集群上会相应会生成共32个文件夹。
replication-factor : 复制因子,默认设置为1。该值的设置,可以理解为,创建topic的时候,设置复制因子,比如设置为3,那么就会在集群中将分区复制3份,然后3个相同的partition就会推举一个leader和两个follower,follwer只复制数据,leader对外提供服务,如果这个leader挂掉了,就会很快再推举出一个leader。也就为分区提供了备份容错的功能。
6、集群与生产者的交互
(1)生产者在向kafka集群发送消息的时候,可以通过指定分区来发送到指定的分区中;
(2)也可以通过指定均衡策略来将消息发送到不同的分区中;
(3)如果不指定,就会采用默认的随机均衡策略,将消息随机的存储到不同的分区中。
7、集群与消费者之间的交互
这是Kafka用来实现一个Topic消息的广播(发给所有的Consumer)和单播(发给某一个Consumer)的手段。一个Topic可以对应多个Consumer Group。如果需要实现广播,只要每个Consumer有一个独立的Group就可以了。要实现单播只要所有的Consumer在同一个Group里。用Consumer Group还可以将Consumer进行自由的分组而不需要多次发送消息到不同的Topic。
下面这个例子更清晰地展示了Kafka Consumer Group的特性。首先创建一个Topic (名为topic1,包含3个Partition),然后创建一个属于group1的Consumer实例,并创建三个属于group2的Consumer实例,最后通过Producer向topic1发送key分别为1,2,3的消息。结果发现属于group1的Consumer收到了所有的这三条消息,同时group2中的3个Consumer分别收到了key为1,2,3的消息。
对于一个group而言,消费者的数量不应该多余分区的数量,因为在一个group中,每个分区至多只能绑定到一个消费者上,即一个消费者可以消费多个分区,一个分区只能给一个消费者消费 因此,若一个group中的消费者数量大于分区数量的话,多余的消费者将不会收到任何消息。
一个topic 可以配置几个partition,produce发送的消息分发到不同的partition中,consumer接受数据的时候是按照group来接受,kafka确保每个partition只能同一个group中的同一个consumer消费,如果想要重复消费,那么需要其他的组来消费。Zookeerper中保存这每个topic下的每个partition在每个group中消费的offset 新版kafka把这个offsert保存到了一个__consumer_offsert的topic下 这个__consumer_offsert 有50个分区,通过将group的id哈希值%50的值来确定要保存到那一个分区. 这样也是为了考虑到zookeeper不擅长大量读写的原因。
假设一个topic test 被groupA消费了,现在启动另外一个新的groupB来消费test,默认test-groupB的offset不是0,而是没有新建立,除非当test有数据的时候,groupB会收到该数据,该条数据也是第一条数据,groupB的offset也是刚初始化的ofsert, 除非用显式的用–from-beginnging 来获取从0开始数据
参考文档:讲的很详细
http://blog.csdn.net/ychenfeng/article/details/74980531
https://www.2cto.com/kf/201604/499261.html
https://www.cnblogs.com/sodawoods-blogs/p/8969774.html //编程大牛 消费者编程,致敬