kafka基础三
消费者消费消息过程(一)
消费者组
消费者是以消费者组consumer group的方式进行消息消费的,一个消费者组是由一个或者多个消费者组成的,共同消费一个topic,在每个分区同一时间只能由消费者组中的一个消费者读取,一个消费者组中的消费者可以同时读取同一个topic中的多个partition。不同group之间可以消费相同的partition。

kafka采用消费者组保证了:一个Patition只允许被一个消费者组的一个消费者消费。
由此可得出:一个消费者可以消费多个partition,不同的消费者消费的partition一定不会重复;所有消费者组共同消费所有的Partition;也就是同一个消费者组内的消费者是互斥的,不同的消费者组之间是共享所有的Partition的。
假如两个消费者消费同一个topic,如果连个消费者在不同的消费者组中,则每个消费者都会获取到这个topic的所有消息;如果这两个消费者在同一个消费者组中,则它们只能各自获取一半的记录。
发布订阅与点对点消息通信
同一条消息会被多个订阅了这个topic的不同消费者组消费;如果有多个消费者组,每个组内只有一个消费者,那么就实现了发布订阅模式
只有一个消费者组,这个消费者组有多个消费者,一条消息只能被这个组内的一个消费者消费,实现点对点模式

但实际应用中一般都是由多个消费者组,每个消费者组中由多个消费者。
负载均衡Rebalance
将topic的所有的partition平均负载给消费者组中的所有消费者。比如一个topic有四个partition,一个消费者组有两个消费者,那么每个消费者都会分配到两个partition。
一个消费者组有多个消费者,如果其中一个消费者宕机,分配给这个消费者的partition需要被重新分配给相同组的其他消费者;如果一个消费者加入了同一个组,之前分配给其他消费者的partition需要分配给新加入的消费者。实际上一旦有消费者加入或者退出消费者组,导致消费列表变化,即使partition没有变化,消费组中的所有消费者也要触发重新rebalance的工作。如果集群中的partition发生变化,即使消费组成员没有变化,所有的消费者也要重新rebalance。
比如之前有C1,C2连个消费者,它们消费的消息分别是P0,P3和P1,P2
新添加一个消费者C3,则C1,C2,C3分别消费的消息是P0,P2,P1,P3
rebalance的触发时机
consumer的添加或者减少,partition的变化(比如broker的增加或者删除)都会触发rebalance。
rebalance算法
1、将topic下的所有partition进行排序,并存放在PT中。
2、将consumer group下的所有consumer进行排序,存放在CG中,第i个编号为Ci;
3、N=size(PT)/size(CG)向上取整
4、接触Ci对原来分配的partition的消费权,从0开始
5、将第iN到(i+1)N-1个partition分配给Ci
rebalance前后的动作
rebalance之前需要把消费者对partition的消费进度保存起来,这样在rebalance之后新分配的消费者可以保存的进度继续读取partition。这样确保了消息不会被重新消费。
消费进度的保存
每个Partition的消费进度应该是面向消费者组的。如果面向消费者,那么rebalance之后的消费者并不知道rebalance之前消费partition的进度。但是如果是消费者组级别的,因为rebalance前后的两个消费者同属于同一个消费者组,所以在rebalance之后的消费者可以从消费者组中读取消费进度。通常是借助外部的存储系统来保存消费进度的比如zookeeper或者Kafka内部的topic。所以消费者消费消息时需要实时的将最新的消费进度保存到zookeeper中。

Partition数量与消费者线程数量问题
一个Partition只能属于一个消费者线程,所以可能会有一下情况:
1、线程数量多于Partition数量-----部分线程无法消费该topic的消息
2、线程数量等于Partition数量-----一个线程对应一个Partition
3、线程数量少于Partition-----一些线程会消费多个Partition
通常情况下,第三中情况是最好的,这要会充分压榨线程的劳动能力。
一个消费者消费多个Partition消息的顺序问题
同一个Partition的消息消费是有序的(在生产者不继续添加消息的情况下),但是多个Partition之间的消息消费并不能保证是有序的。
offset与消息消费进度
生产者提交的日志采用递增的offset连同消息内容一起写入到本地日志文件,生产者客户端本身不需要保存offset的状态,但是消费者进程需要保存消费消息的offset,这样消息才能将消息的消费进度保存到zookeeper中。
消费方式消费者采用主动向服务端pull拉取数据,而不是采用服务端push推送数据给消费者。
主动向服务端pull数据与服务端push数据给消费者:如果服务端push数据给消费者,那么消费者就只需被动接收就行了,也不用记录offset的消费进度。这样就增加了服务端的压力,服务端也不知道消费者的接收速度,如果消费者来不及处理,就会造成消息积压处理不及时。并且消息的消费进度是和消费者有关的,所以使用统一的外部存储,每个消费者将自己消费的消息offset写到存储系统中,这样消费者也可以自己掌控获取消息的速度。
offset的读取时机:rebalance之前,rebalance之后。
kafka基础三的更多相关文章
- Zookeeper与Kafka基础概念和原理
1.zookeeper概念介绍 在介绍ZooKeeper之前,先来介绍一下分布式协调技术,所谓分布式协调技术主要是用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种共享资源,防止造成 ...
- kafka 基础知识梳理及集群环境部署记录
一.kafka基础介绍 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特 ...
- [转帖]kafka基础知识点总结
kafka基础知识点总结 https://blog.csdn.net/qq_25445087/article/details/80270790 需要学习. 1.kafka简介 kafka是由Apach ...
- Kafka基础教程(四):.net core集成使用Kafka消息队列
.net core使用Kafka可以像上一篇介绍的封装那样使用(Kafka基础教程(三):C#使用Kafka消息队列),但是我还是觉得再做一层封装比较好,同时还能使用它做一个日志收集的功能. 因为代码 ...
- Python全栈开发【基础三】
Python全栈开发[基础三] 本节内容: 函数(全局与局部变量) 递归 内置函数 函数 一.定义和使用 函数最重要的是减少代码的重用性和增强代码可读性 def 函数名(参数): ... 函数体 . ...
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
- Bootstrap <基础三十一>插件概览
在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...
- Bootstrap <基础三十>Well
Well 是一种会引起内容凹陷显示或插图效果的容器 <div>.为了创建 Well,只需要简单地把内容放在带有 class .well 的 <div> 中即可.下面的实例演示了 ...
- Bootstrap<基础三> 排版
Bootstrap 使用 Helvetica Neue. Helvetica. Arial 和 sans-serif 作为其默认的字体栈. 使用 Bootstrap 的排版特性,您可以创建标题.段落. ...
随机推荐
- Failed to import pydot
在使用keras进行模型绘制的时候,出现了一个错误 Failed to import pydot. You must install pydot and graphviz for `pydotprin ...
- BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树+dfs序
BZOJ_3545_[ONTAK2010]Peaks_主席树+倍增+kruscal重构树 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道 ...
- SDOI2017 Round1 Day2 题解
T2好厉害啊……AK不了啦……不过要是SCOI考这套题就好了240保底. BZOJ4819 新生舞会 模板题,分数规划+二分图最大权匹配. 费用流跑得过,可以不用KM. UPD:分数规划用迭代跑得飞快 ...
- cuda 版本查阅
查看cuda版本 cat /usr/local/cuda/version.txt nvcc -V
- 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 instance 重启后又会差 8 个小时
这是 OpenStack 实施经验分享系列的第 3 篇. 问题描述 通过上一节部署出来的 Windows instance 有时候会发现操作系统时间总是慢 8 个小时,即使手工调整好时间和时区,下次 ...
- Android 常用adb shell 命令(转)
调试Android程序有时需要adb shell 命令,adb全称Android Debug Bridge ,就是起到调试桥的作用. 通过adb我们可以在Eclipse中通过DDMS来调试Androi ...
- CCF 201604-2 俄罗斯方块 (模拟)
问题描述 俄罗斯方块是俄罗斯人阿列克谢·帕基特诺夫发明的一款休闲游戏. 游戏在一个15行10列的方格图上进行,方格图上的每一个格子可能已经放置了方块,或者没有放置方块.每一轮,都会有一个新的由4个小方 ...
- POJ - 2376 Cleaning Shifts 贪心(最小区间覆盖)
Cleaning Shifts Farmer John is assigning some of his N (1 <= N <= 25,000) cows to do some clea ...
- ubuntu上安装与卸载deb文件(转载)
转自:http://blog.csdn.net/nkguohao/article/details/8951082 版权声明:本文为博主原创文章,未经博主允许不得转载. 通过deb包安装软件: sudo ...
- Spring Boot 学习系列(08)—自定义servlet、filter及listener
此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 传统的filter及listener配置 在传统的Java web项目中,servlet.filter和li ...