【Kafka官方文档翻译】5.4.5. 消费者

原文地址:https://kafka.apache.org/0101/documentation.html#theconsumer

消费者通过从主分区的服务器获取数据进行消费。消费者指定每次请求时日志的偏移量,然后从这个位置开启批量获取数据。消费者对位移量有绝对的控制权,这样消费者可以重新设置位移位置,并在有需要的时重新消费。

推送 vs 拉取

一个基本的问题是,我们在考虑消费者是主动从服务器那里拉去数据,还是服务器应该主动推送数据到消费者端。在这方面,kafka和传统的消息吸引设计一样,生产者推送消息到服务器,消费者从服务器拉去消息。在一些日志中心系统,像 ScribeApache Flume,使用一种特殊的推送流数据推送机制,这些方式都有利有弊,但是,在一个基于推送方式消息系统,很难处理大量的消费者,因为服务器需要控制数据的传输速率。目标是为了让消费者尽可能多消费数据;不幸的是,在一个推送系统,这意味着消费者往往被消息淹没,如果消费率低于生产速度(例如密集的服务攻击)。基于拉取的系统往往比较优雅些,消息处理只是落后,消费者在后面尽可能赶上。
  使用基于拉取方式的系统还有一个好处就是容易汇集批量数据后发给消费者。基于推送的系统,要么马上发送请求,要么汇总数据后再发送,而不光下游的消费者是否能够处理得上。如果为了进一步降低延迟,这会导致缓存还没有结束时就传输单条数据过去,这样很浪费。基于拉的方式可以从当前日志位置拉去可用的消息(或者根据配置的大小)。这样能在没有引入不必要的延迟的情况下,获取到比较好的批处理性能。
  基于拉取方式的系统不足的地方是如果没有任何数据,消费者就要循环检测,使用空轮询的繁忙检测方式等候数据到来。为了避免这一点,我们可以设置拉请求的参数,允许消费者请求在“长轮询”时阻塞,直到数据到达。
  你可以想象一些其他从端到端的一些可能性设计。生产者把记录写入到本地日志中,服务器将从消费者拉取的数据中拉取。一种类似的储存和转发的生产者模型经常被提议。这虽然挺有趣的,但不适合有成千上万生产者的情况。在我们大规模运行数据储存系统的经验来看,成千上万的磁盘跨越多个应用并不让系统更为可靠,操作起来将会是一个噩梦。在实践中,我们发现可以创建具有很强壮的SLAs保障的,大规模的管道,并且不需要提供者有持久化能力。

消费位置

令人惊讶的是,跟踪已消耗的内容是消息传递系统的关键性能点之一。
  大部分的消息系统在服务器端记录哪些消息被消费的元数据信息。那就是,消息被发送给消费者时,服务器要么在本地马上记录日志,要么等待消费者反馈后记录。这样的话相当不直观,事实上,对于一台服务器,很难理清楚这个状态到底去哪里了。因为在大部分的消息储存系统中,数据结构很难被扩展,这也依赖于编程的语义,如果服务器知道消息被消费后可以马上删除,那么就可以维持比较小的数据集。
  碰巧不太明显的是,让服务器和消费者对已经消费的数据达成一致并不是一件简单的事情。如果服务器在每次数据分发出去后,马上标记消息已经被消费了,如果消费者处理消息失败了(例如宕机了),那么消息可能会丢失。为了解决这个问题,很多消息系统添加了反馈机制,用于标记消息已经被发送,而不是被消费,服务器等待消费者发送一个反馈来确认消息已经被消费。这个策略解决消息丢失的问题,但是同时也引发新的问题。首先,如果消费者已经消费了记录,但是在反馈时失败,则有可能重复消费两次。其次,是多一个来回的性能损耗,现在服务器就要为每个消息保存不同的状态(先锁定,这样不会发送第二次,然后标记为永久消费后,才能把它删除)。还有些麻烦的问题需要处理,比如消息被发送了,但是从来没有接受到反馈。
  kafka使用不一样的处理方式,主题被划分成一系列有序的分区集合,每个分区在一个时刻仅被订阅分组中的一个消费者消费。这意味这每个消费者在一个分区位置就只是一个数值,用于记录下一次消息要被消费的位置。这意味着记录消费者状态的代价非常小,只是每个分区一个数值。这个状态可以定期做检查点,这使等价的消息反馈代价非常小。
  这个方案还有另外的好处,消费者可以优雅地重新指定一个旧的位移位置,并重新消费数据。这个和通常的队列观念有点相悖,但是对很多消费者来说是一个很重要的特性。例如,如果消费代码有bug,并且在一些消息被消费后发现,一旦bug被修复,消费者可以重新使用这些消息。

离线数据加载

可扩展的持久性储存能力,使得消费者能定期批量把数据导入到离线系统中,如:Hadoop 或关系型数据仓库。
  在hadoop的例子中,我们通过把数据分发到独立的任务集中进行并行处理,每个的单位是按服务器/主题/分区,这样可以允许很好的并发数据加载处理。Hadoop 提供任务管理,任务可以在失败四重新启动,而不用担心会重复处理数据——只需要简单从他们原来处理的位置重新开始。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容