赞
踩
1)Kafka采用拉取模型,由消费者自己记录消费状态,每个消费者互相独立地顺序读取每个分区的消息。如下图所示,有两个消费者(不同消费者组)拉取同一个主题的消息,消费者A的消费进度是3,消费者B的消费进度是6。消费者拉取的最大上限通过最高水位(watermark)控制,生产者最新写入的消息如果还没有达到备份数量,对消费者是不可见的。这种由消费者控制偏移量的优点是:消费者可以按照任意的顺序消费消息。比如,消费者可以重置到旧的偏移量,重新处理之前已经消费过的消息;或者直接跳到最近的位置,从当前的时刻开始消费 |
————————————————————————
————————————————————————
2)在一些消息系统中,消息代理会在消息被消费之后立即删除消息。如果有不同类型的消费者订阅同一个主题,消息代理可能需要冗余地存储同一消息;或者等所有消费者都消费完才删除,这就需要消息代理跟踪每个消费者的消费状态,这种设计很大程度上限制了消息系统的整体吞吐量和处理延迟。Kafka的做法是生产者发布的所有消息会一致保存在Kafka集群中,不管消息有没有被消费。用户可以通过设置保留时间来清理过期的数据,比如,设置保留策略为两天(设置天数根据自己的业务要求)。那么,在消息发布之后,它可以被不同的消费者消费,在两天之后,过期的消息就会自动清理掉。 |
1)高级API优点 高级API 写起来简单,不需要自行去管理offset,系统通过zookeeper自行管理。不需要管理分区,副本等情况,.系统自动管理。消费者断线会自动根据上一次记录在zookeeper中的offset去接着获取数据(默认设置1分钟更新一下zookeeper中存的offset)可以使用group来区分对同一个topic 的不同程序访问分离开来(不同的group记录不同的offset,这样不同程序读取同一个topic才不会因为offset互相影响) 2)高级API缺点 不能自行控制offset(对于某些特殊需求来说) 不能细化控制如分区、副本、zk等 |
1)低级 API 优点 能够让开发者自己控制offset,想从哪里读取就从哪里读取。 自行控制连接分区,对分区自定义进行负载均衡 对zookeeper的依赖性降低(如:offset不一定非要靠zk存储,自行存储offset即可,比如存在文件或者内存中) 2)低级API缺点 太过复杂,需要自行控制offset,连接哪个分区,找到分区leader 等。 |
1)消费者是以consumer group消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。每个分区在同一时间只能由group中的一个消费者读取,但是多个group可以同时消费这个partition。 |
1)consumer采用pull(拉)模式从broker中读取数据。而采用push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。 2)而pull模式则可以根据consumer的消费能力以适当的速率消费消息。 对于Kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。 3)pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,我们在拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞(并且可选地等待到给定的字节数,以确保大的传输大小) |
1)配置文件 [root@bigData112 kafka_2.11]# vi config/consumer.properties group.id=test_group [root@bigData113 kafka_2.11]# vi config/consumer.properties group.id=test_group 2)启动kafka集群: bin/kafka-server-start.sh config/server.properties & (注意 :先启动zookeeper) 3)创建主题 [root@bigData111 kafka]$ bin/kafka-topics.sh --zookeeper bigData111:2181 --create --replication-factor 3 --partitions 1 --topic topic_1 4)在bigdata112、bigdata113上分别启动“消费者” [root@bigdata112 kafka]$ ./bin/kafka-console-consumer.sh --bootstrap-server bigdata112:9092 --topic topic_1 --consumer.config config/consumer.properties (没有指定组的话 就使用默认,) [root@bigdata113 kafka]$ ./bin/kafka-console-consumer.sh --bootstrap-server bigdata113:9092 --topic topic_1 --consumer.config config/consumer.properties 5)在bigdata111上启动“生产者” [root@bigdata111 kafka]$ bin/kafka-console-producer.sh --broker-list bigdata113:9092 --topic topic_1 >hello world 6)查看bigdata111和bigdata112的接收者。 (每个ConsumerGroup消费组 只能对同一个分区最多消费一次,而同一个分区可以被不同组消费) 同一时刻只有一个消费者接收到消息。因为创建的主题就定义了 --partitions 1 分区就一个。而1一个分区只能被一组消里面的一个消费者一次。如果有两个分区就会被另外一个消费。没有特定设置,消费者不会对同一个分区进行第二次消费。 如果不指定 --consumer.config参数 每个消费者都会消费到。 |
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。