Kafka深度讲解+Zookeeper存储

来源:互联网 发布:sql 前几个字符相同 编辑:程序博客网 时间:2024/06/16 15:56

Concept:

Partition

  partition是物理上的概念,每个topic包含一个或多个partition,创建topic时可以指定partition数量,每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件

<span style="font-family:Microsoft YaHei;"><span style="font-family:System;">[zhuhailong@stm02 kafka-logs]$ cd test.app.log-3/[zhuhailong@stm02 test.app.log-3]$ pwd/o2o/software/kafka_2.10/kafka-logs/test.app.log-3[zhuhailong@stm02 test.app.log-3]$ lltotal 25708-rw-r--r-- 1 root root    12904 Oct 24 19:20 00000000000000053408.index-rw-r--r-- 1 root root 22455397 Oct 24 19:20 00000000000000053408.log-rw-r--r-- 1 root root 10485760 Oct 25 17:20 00000000000000059578.index-rw-r--r-- 1 root root  3838895 Oct 25 17:20 00000000000000059578.log[zhuhailong@stm02 test.app.log-3]$ </span></span>

Consumer

  作用是消费消息,每个consumer属于一个特定的consumer group(可以为每个consumer指定group name,若不指定 group name 则属于默认的group),使用consumer high level API时,同一个topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group可同时消费这一消息。

  Kafka消费者的API分为两部分,High level API 和Low level api,一般开发都是使用High level API(不用关心消费状态,负载均衡,offset等),一般监控开发都是使用Low level API 可以获取 offset,partition 等属性。


高级API的一些特性:

1) 如果consumer group中的consumer线程数量比partition多,那么有的线程将永远不会接收到消息。因为kafka的设计是在同一个partition上是不允许并发的,所以consumer的线程数量不要大于partition数量。

2) 如果consumer grope中的consumer线程数量少于partition,那么有的线程将会收到多条消息,并且不保证数据间的顺序,kafka只保证在一个partition上数据是有序的。

3)增减consumer,broker,partition会导致集群rebalance,所以rebalance后consumer对应的partition会发生变化。

4)High level api 获取不到数据的时候会block等待。

5)consumer group设计的目的之一是为了应用多线程同时消费某个topic的数据

6)consumer group通过Zookeeper来消费kafka集群中的消息,相对于low High API 自己管理offset,High API把offset的管理交给了Zookeeper,但是High API并不是消费一次就在Zookeeper中更新一次,而是每间隔一定时间更新一次offset(默认1000ms),所以可能在重启消费者时拿到重复的消息。此外,当分区leader发生变更时也可能拿到重复的消息,因此在关闭消费者时最好等待一定时间然后在shutdown。



未完待续~






















0 0
原创粉丝点击