​从这篇文章你将了解到什么?Kafka的topic为什么要分区。

消费者组的作用。

Kafka的分区分配。

“Kafka是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统。”

看着这一句句对Kafka的介绍,以及这张架构图, 突然感觉眼前一阵恍惚......

再睁眼的瞬间, 画风居然变成了植物大战僵尸的样子!!!

下面我们来说道说道这有趣的场景:

我们熟悉的消息生产者——自然就是植物大战僵尸中可以生成粮食的植物了。

比如生产者豌豆射手:

他可以发送出普通豌豆(消息)。

比如生产者寒冰射手:

他可以发送出寒冰豌豆(消息)。

再来看看我们可爱的消费者僵尸,他们可以消耗(消费)生产者发出来的豌豆(消息)。

而Kafka broker服务就是一个个炮台!炮台可以储存豌豆射手发送过来的豌豆, 然后再把这些豌豆投送给僵尸。

ZooKeeper就是僵尸最喜欢的大脑了!

当然这只是一句玩笑,我们消费者僵尸是不会移动的,也不会去攻击Zookeeper。

这里要说明一下,所有消费者僵尸的梦想都是不放过每一颗属于他的豌豆。他们甚至会主动从炮台拉取(pull)豌豆过来消耗(消费)。

玩过植物大战僵尸的小伙伴们都知道,游戏中是没有Kafka炮台这种东西的。那为什么我们需要Kafka呢?

下面我们来看看,没有Kafka时,生产者直接面对消费者僵尸的情况。

1生产者大战僵尸

在没有Kafka的情况下, 豌豆射手(生产者)VS僵尸(消费者)。

豌豆射手要一边留意僵尸的位置, 一边费尽全力将豌豆(消息)发送到僵尸身上!

如果这时候出现一大波新的僵尸!

豌豆射手除了要及时辨认出所有僵尸的位置外, 还要把同一颗豌豆(同一个消息)同时投送给每一个僵尸。

豌豆射手还要留意投送出去的的豌豆有没有发送成功,如果一颗豌豆石沉大海,那到底是这个僵尸已经挂了,还是方向射偏了?同时还要从万千消费者中找到这个投送失败的僵尸,重新投送。

这也太累了吧!

而从僵尸的角度上看呢, 他除了要消耗每一个豌豆, 还要费劲辨认出每一个豌豆射手的位置, 否则的话, 就接不到豌豆射手投出来的豌豆了!

随着生产者和消费者的增多,他们之间的关系也就越来越混乱。这样一来, 不仅豌豆射手累, 僵尸也累!

2Kafka大战僵尸

如果在豌豆射手和僵尸之间加上一个Kafka炮台(kafka broker)会怎么样呢?现在豌豆射手只需要关心Kafka炮台的位置, 然后把豌豆发送给Kafka炮台存储起来。豌豆射手不用再关心有多少个消费者僵尸, 只要一心一意地生产豌豆就好, 多舒心!

而消费者僵尸呢, 同样也不需要关心有多少生产者,只需要记住Kafka炮台的位置,专心消耗豌豆就行。

Kafka的使用场景之一就是解耦生产者和消费者,生产者和消费者不再直接接触。

消费者组

Kafka炮台支持两种豌豆投递方式。

把消费者僵尸划分成不同的消费者组,那么就可以实现点对点模式和广播模式。

如果每个消费者僵尸属于不同的消费组,那么同一颗豌豆会被“广播”给每个消费组内的僵尸。

如果每个消费者僵尸都在同一个消费组,那么同一颗豌豆,每一个消费组内只能有一个僵尸能消耗这颗豌豆。

主题与订阅

生产者有很多类型,有普通豌豆射手,有寒冰射手,有火焰射手等等,这些生产者发出来的豌豆就分别对应3个Topic:普通主题,寒冰主题, 火焰主题。

主题如果没有分区,那么就意味着每个炮台只能接收一种主题的豌豆。如果一个炮台接收了寒冰豌豆,那么他就不能再接收普通豌豆。

消费者僵尸也有很多种类型,寒冰僵尸擅长消耗寒冰豌豆,火焰抗性高的僵尸擅长消耗火焰豌豆。

不同的消费者僵尸会主动从Kafka炮台“订阅”自己感兴趣的主题。比如寒冰僵尸会专门去消耗寒冰豌豆,普通僵尸会专门去消耗普通豌豆。

主题没有分区的弊端

很多不同类型生产者其实都可以生产普通豌豆,比如二连豌豆,三连豌豆,加特林豌豆(四连发),甚至还有可以五连发的豌豆荚。

如果现在战场上投入一批五连发的豌豆荚!

可以预见的是,将会有巨量的普通豌豆发送到普通主题炮台中,很快这个炮台就会积压很多豌豆发送不出去,并且还有可能因为负载过大而宕机,而与此形成鲜明对比的是,其他主题的炮台却是处于空闲状态,连一颗寒冰/火焰豌豆都接收不到。

而站在消费组僵尸的角度上看,即使现在新增再多的消费者,也无法加速豌豆的消耗,因为Kafka炮台已经成为吞吐量的瓶颈。

3主题分区

如果我们让每个炮台都可以接收多种主题的豌豆, 这样就可以充分利用场上的每一个炮台了。这就是主题的分区。

假如现在我们给普通豌豆主题2个分区, 这2个分区分别分布在两个炮台中。

这样场上所有炮台可以接收普通豌豆子弹,理想状态下,是可以减缓了单一炮台的压力,这就是主题分区的特点之一,分布式存储。

而对于消费者僵尸而言,现在同一时间可以有两个消费者僵尸消耗普通豌豆, 加快了豌豆的消耗速度,这主题分区的另一个特点,分布式消费。

4分区分配

现在主题有了分区,在获得了很多好处的同时,又必然会引申出一系列复杂的问题。

生产者的分区分配

如图,如果豌豆荚每次给主题分区1和分区2按4:1的比例发放豌豆,那么最后还是会导致分区1所在的Kafka炮台负担过重。

所有现在生产者要考虑怎么才能把豌豆均匀地分发给各个Kafka炮台。

在Kafka中,如果生产者有指定分区号,那么消息会直接发往指定的分区。否则会提供默认的分区器DefaultPartitioner,对消息的key进行哈希运算得到分区号。如果消息没有key,那么就会采用轮询的方式给主题下的各个分区发送消息。

消费者的分区分配

如图,如果两个分区的豌豆都由同一个消费者僵尸负责消耗,另一个消费者将无所事事,这就是消费者分区分配不均的情况。

所以,消费者僵尸也要讨论由哪些僵尸负责消耗哪些分区的豌豆,让每个僵尸都可以均匀地承受打击。

Kafka提供的消费者分区分配策略有三种,分别是RangeAssignor、RoundRobinAssignor和StickyAssignor。每种策略的具体细节属于僵尸大军中的“高度机密”(面试高频),我们将在下一篇文章中进行讲解。

broker端的分区分配

思考一下,如果一个生产者把所有豌豆发送给炮台存储后,炮台宕机了,那这批豌豆就丢失了,那怎么才能避免这问题呢?这就是数据的容灾能力问题了。

我们给每个主题的分区引入副本的概念。

如果每一个分区都有2个副本,副本之间的关系是一个Leader对多个follower。

只有Leader副本才能存储豌豆,其他副本只是同步Leader的数据。

如果Leader宕机了,那么就会在剩下的副本中选出新的Leader。这就实现了故障的自动转移。

Kafka集群在创建主题时,就要考虑分区副本应该分配在哪个broker上。

而引入副本机制后,与此相关的优先副本选举,副本之间的同步机制等问题又是一次长篇大论了。

5后续

由于篇幅/时间有限,很多没有提及的问题,就留到下一篇再讲解了。ZooKeeper的作用。

分区的有序性。

分区数。

重平衡。

字节武装

kafka多分区只有一个在消费_Kafka的topic为什么要分区相关推荐

  1. kafka多分区只有一个在消费_kafka多个消费者只有一个消费

    使用goalng "github.com/Shopify/sarama"这个库 我现在有两个消费者,两个topic,kafka分区设定是50个,但是在实际运行过程中只有一个消费者在 ...

  2. kafka Java客户端之 consumer API 消费消息

    背景:我使用docker-compose 搭建的kafka服务 kafka的简单介绍以及docker-compose部署单主机Kafka集群 使用consumer API消费指定Topic里面的消息 ...

  3. kafka consumer配置拉取速度慢_Kafka分区分配策略(Partition Assignment Strategy)

    众所周知,Apache Kafka是基于生产者和消费者模型作为开源的分布式发布订阅消息系统(当然,目前Kafka定位于an open-source distributed event streamin ...

  4. kafka控制台模拟消费_Kafka 详解

    kafka简介 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可 ...

  5. kafka 主动消费_Kafka核心API——Consumer消费者

    Consumer之自动提交 在上文中介绍了Producer API的使用,现在我们已经知道如何将消息通过API发送到Kafka中了,那么现在的生产者/消费者模型就还差一位扮演消费者的角色了.因此,本文 ...

  6. kafka 主动消费_Kafka消费组(consumer group)

    在开始之前,我想花一点时间先来明确一些概念和术语,这会极大地方便我们下面的讨论.另外请原谅这文章有点长,毕竟要讨论的东西很多,虽然已然删除了很多太过细节的东西. 一. 误区澄清与概念明确 1 Kafk ...

  7. Apache Kafka:使用java方式操作消费组和重置分区偏移量(admin api)

    当前版本:kafka_2.12-2.8.0 1. 声明 当前内容主要为本人学习和测试使用java方式操作消费组和重置分区偏移量,主要参考:Apache Kafka官方文档 主要为: 使用java方式实 ...

  8. kafka监听topic消费_Kafka消费者-从Kafka读取数据

    (1)Customer和Customer Group (1)两种常用的消息模型 队列模型(queuing)和发布-订阅模型(publish-subscribe). 队列的处理方式是一组消费者从服务器读 ...

  9. Kafka扩分区和分区副本重分配之后消费组会自动均衡吗?

    作者:石臻臻, CSDN博客之星Top5.Kafka Contributor .nacos Contributor.华为云 MVP ,腾讯云TVP, 滴滴Kafka技术专家 . KnowStreami ...

最新文章

  1. Android TextView textAppearance
  2. 把脉Linux上USB数据流
  3. Couldn‘t connect to session bus: Did not receive a reply. Possible causes include: the remote applic
  4. 机械革命重装Win10系统后独立显卡驱动故障问题解决
  5. 液态金属和Liquidmetal公司
  6. OIDC在 ASP.NET Core中的应用
  7. 直播笔记 | Unity中射线检测详解
  8. 【报告分享】迈向更好的教育:未来教育的技术空间研究报告.pdf(附下载链接)
  9. 使用U盘安装Ubuntu
  10. 对自己编译的文件(exe/dll)进行签名的实践(Windows)
  11. 语言模型总结(待完善)
  12. C++ fork函数理解
  13. 3G是IPv6的3G(转)
  14. 给买车的来点干货——汽车品牌分析
  15. Android陀螺仪传感器学习
  16. 浅谈java中的ServerSocket和Socket的通信原理实现聊天及多人聊天
  17. 支付宝信用卡还款攻略:这样操作仍可以免手续费!
  18. 黑猫带你学UFS协议第1篇:全网最全UFS协议中文详讲,这份学习框架图,你值得拥有!!!(持续更新中...)
  19. 跟我学Kafka:Kafka消费组运维详解
  20. 解决电脑插耳机听视频暂停后继续耳机声音突然变大的问题(详细图解)

热门文章

  1. cool-admin框架后端使用-node版本,使用事务装饰器来创建和事务回滚
  2. Android开发: 分享利用好Kotlin的特点提高开发效率
  3. 怎么自己做巧克力 在家制作巧克力的方法
  4. 设置静态路由 不同网段可以互相访问
  5. 花钱最少的推广方式(2)电子书营销(下)
  6. 游戏玩家的心理分析,让游戏更好的吸引玩家和抓住玩家。
  7. 关于CentOS7联网,祝你一臂之力
  8. 猿辅导转行卖羽绒服?网友:这是段子吗?会有新某方棉鞋、学某思秋裤吗?...
  9. 用帅气的线条表达人物,概念原画师toni infante作品
  10. python数据分析工资_拉勾网爬取全国python职位并数据分析薪资,工作经验,学历等信息...