1. Pull vs Push

  Producer主动的通过push将消息发布到Broker上,Consumer通过Pull的的方式从Broker消息消息。

  通过Push的方式由于是一有消息就推到Broker,所以极大的保证了消息实时性,但是在某些情况下,可能由于Consumer网络,或是其他原因倒是消费速度低,此时就可能会导致Consumer堆积大量的消息,甚至在极端情况下会压垮Consumer.

  通过Pull拉取消息保证了Consumer能够按自己实际处理能力来拉取相应的消息,并且Broker的实现也相对简单,但是也会出现在消息处理能力很低的情况下造成消息的实时性过低。

  kafka提供了High Level Consumer和High Level Consume两种方式的API。

2. High Level Consumer

  很多应用场景下,客户程序只是希望从Kafka顺序读取并处理数据,而不太关心具体的offset。它同时也希望提供一些语义,例如同一条消息只被某一个Consumer消费(单播)或被所有Consumer消费(广播),Kafka High Level API提供了一个从Kafka消费数据的高层抽象,从而屏蔽掉其中的细节,并提供丰富的语义。

  在Kafka中,High Level Consumer将从某个Partition读取的最后一条消息的offset存于Zookeeper中(从0.8.2开始同时支持将offset存于Zookeeper中和专用的Kafka Topic中)。这个offset基于客户程序提供给Kafka的名字来保存,这个名字被称为Consumer Group,Consumer Group是整个Kafka集群全局唯一的,而非针对某个Topic的。每个High Level Consumer实例都属于一Consumer Group,若不指定则属于默认的Group。在消息被消费之后,消息并不会立即被删除,只是相应的offset加一,若以可能Consumer中的offset将会跟消息的数据一样多,

  在High Level Consumer下由于存在了关联关系(Group ),所以消息删除也将不再是到一定时间或消息条数达到某个值就删除,而是通过压缩的方式,保留最新的key的value的方式。具体示例如下:

  

   这样就保证了消息与offset之间仍然是正确的对应关系。

  对于每条消息,在同一个Consumer Gourp里都只会被一个Consumer消费,不同的Cosumer Group可以消费同一条消息。

  如下:

  Kafka的设计理念之一就是同时提供对离线批处理和在线流处理的支持。可以同时使用Hadoop系统进行离线批处理,Storm或它流处理系统进行流处理。也可使用Kafka的Mirror Maker将消息从一个数据中心镜像到另一个数据中心。

  如图:

  

  Consumer的Rebalance(平衡策略)

  High Level Consumer启动时将其ID注册到其Consumer Group下,在Zookeeper上的路径为/consumers/[consumer group]/ids/[consumer id],在/consumers/[consumer group]/ids上注册Watch,在/brokers/ids上注册Watch,如果Consumer通过Topic Filter创建消息流,则它会同时在/brokers/topics上也创建Watch,强制自己在其Consumer Group内启动Rebalance流程

  Rebalance算法

  1. 将目标Topic下的所有Partirtion排序,存于PT

  2. 对某Consumer Group下所有Consumer排序,存于CG,第i个Consumer记为Ci

  3. N=size(PT)/size(CG) ,向上取整

  4. 解除Ci对原来分配的Partition的消费权(i从0开始)

  5. 将第i∗N 到(i+1)∗N−1个Partition分配给Ci

    Rebalance算法也存在如下缺点:

  1. Herd Effect: 任何Broker或者Consumer的增减都会触发所有的Consumer的Rebalance

  2. Split Brain: 每个Consumer分别单独通过Zookeeper判断哪些Broker和Consumer宕机,同时Consumer在同一时刻从Zookeeper“看”到的View可能不完全一样,这是由Zookeeper的特性决定的。

  3. 调整结果不可控所有Consumer分别进行Rebalance,彼此不知道对应的Rebalance是否成功

3. Low Level Consumer 

  使用Low Level Consumer (Simple Consumer)的主要原因是,用户希望比Consumer Group更好的控制数据的消费,如:

  1. 同一条消息读多次,方便Replay

  2. 只消费某个Topic的部分Partition

  3. 管理事务,从而确保每条消息被处理一次(Exactly once)

  与High Level Consumer相对,Low Level Consumer要求用户做大量的额外工作

  1. 在应用程序中跟踪处理offset,并决定下一条消费哪条消息

  2. 获知每个Partition的Leader

  3. 处理Leader的变化

  5. 处理多Consumer的协作

Kafka学习笔记(5)----Kafka的Consumer的更多相关文章

  1. Kafka学习笔记之Kafka Consumer设计解析

    0x00 摘要 本文主要介绍了Kafka High Level Consumer,Consumer Group,Consumer Rebalance,Low Level Consumer实现的语义,以 ...

  2. Kafka学习笔记之Kafka三款监控工具

    0x00 概述 在之前的博客中,介绍了Kafka Web Console这 个监控工具,在生产环境中使用,运行一段时间后,发现该工具会和Kafka生产者.消费者.ZooKeeper建立大量连接,从而导 ...

  3. Kafka学习笔记之Kafka性能测试方法及Benchmark报告

    0x00 概述 本文主要介绍了如何利用Kafka自带的性能测试脚本及Kafka Manager测试Kafka的性能,以及如何使用Kafka Manager监控Kafka的工作状态,最后给出了Kafka ...

  4. Kafka学习笔记之Kafka背景及架构介绍

    0x00 概述 本文介绍了Kafka的创建背景,设计目标,使用消息系统的优势以及目前流行的消息系统对比.并介绍了Kafka的架构,Producer消息路由,Consumer Group以及由其实现的不 ...

  5. Kafka 学习笔记之 High Level Consumer相关参数

    High Level Consumer相关参数 自动管理offset auto.commit.enable = true auto.commit.interval.ms = 60*1000 手动管理o ...

  6. Kafka学习笔记之Kafka High Availability(下)

    0x00 摘要 本文在上篇文章基础上,更加深入讲解了Kafka的HA机制,主要阐述了HA相关各种场景,如Broker failover,Controller failover,Topic创建/删除,B ...

  7. Kafka学习笔记之Kafka High Availability(上)

    0x00 摘要 Kafka在0.8以前的版本中,并不提供High Availablity机制,一旦一个或多个Broker宕机,则宕机期间其上所有Partition都无法继续提供服务.若该Broker永 ...

  8. Kafka学习笔记1——Kafka的安装和启动

    一.准备工作 1. 安装JDK 可以用命令 java -version 查看版本

  9. Kafka学习笔记之Kafka自身操作日志的清理方法(非Topic数据)

    0x00 概述 本文主要讲Kafka自身操作日志的清理方法(非Topic数据),Topic数据自己有对应的删除策略,请看这里. Kafka长时间运行过程中,在kafka/logs目录下产生了大量的ka ...

  10. Kafka学习笔记之Kafka日志删出策略

    0x00 概述 kafka将topic分成不同的partitions,每个partition的日志分成不同的segments,最后以segment为单位将陈旧的日志从文件系统删除. 假设kafka的在 ...

随机推荐

  1. 08.Web服务器-3.Web静态服务器

    1.显示固定的页面 from socket import * from multiprocessing import * import os def handleClient(clientSocket ...

  2. PAT 1080. Graduate Admission

    It is said that in 2013, there were about 100 graduate schools ready to proceed over 40,000 applicat ...

  3. Zend Studio快捷键汇总

    应用场景 快捷键 功能 查看快捷键 ctrl+shift+l 显示所有快捷键列表 查看和修改快捷键   打开Window->Preferences->General->keys 修改 ...

  4. EF--code first数据迁移命令

    原文推荐!点我点我! 添加Migrations文件夹,并生成类文件Configuration.cs PM> Enable-Migrations -EnableAutomaticMigration ...

  5. HDU 1240

    #include <iostream> #include <cstdio> using namespace std; ; char maze[MAX][MAX][MAX]; s ...

  6. UVA10862 - Connect the Cable Wires(递推 + java的大数)

    UVA10862 - Connect the Cable Wires(递推 + java的大数) 题目链接 题目大意:给你n座房子位于一条直线上,然后仅仅给你一个cable service.要求每座房 ...

  7. 【网络协议】ICMP协议、Ping、Traceroute

        ICMP协议 ICMP常常被觉得是IP层的一个组成部分,它是网络层的一个协议.它传递差错报文以及其它须要注意的信息.ICMP报文通常被IP层或更高层(TCP.UDP等)使用,它是在IP数据报内 ...

  8. 基于Torndb的简易ORM

    ============================================================================ 原创作品,同意转载. 转载时请务必以超链接形式 ...

  9. Linux下把目录拷贝到全部同名目录的脚本

    需求:拷贝文件夹到Linux文件夹下.覆盖该Linux文件夹下全部同名文件夹 目标:Linux下,运行本脚本.输入目录名.就可以批量复制覆盖. 使用说明:         先把本脚本文件和要复制的文件 ...

  10. linux中udev简单的用法【转】

    本文转载自:http://blog.csdn.net/qq_29729577/article/details/50825134 udev是Linux提供的一种在用户态管理设备的一种机制,udev的详细 ...