• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Kafka的常用术语

武飞扬头像
juejin
帮助63

1.1Kafka的术语

1.1.1Record

kafaka是一个消息引擎系统发布的肯定就是消息了,就是Producer发布的消息主题

1.1.2Topic

​ kafka发布的消息对象,逻辑上的一个主题,常常和业务,场景相关

1.1.3Partition

1.什么事分区

kafka在创建topic的时候需要指定partition数,均匀分布在不同的Broker上,一般情况下Partition和Broker的数量是一致的。这样做的好处是 提升系统的伸缩性,提供了负载均衡的能力,也可以根据对分区做具体的操作。

2.kafak的分区策略

首先kafka想要自定义分区策略的时候需要实现kafka的Partitioner接口,这个接口仅仅定义了两个方法

partition(),close(),我们仅仅需要实现partition方法去定制我们需要的分区策略。

/**
* topic key keyBytes valueBytes都是消息数据
* cluster 是集群数据
* 我们可以充分利用这些信息对消息进行分区,计算出它要被发送到呢个分区上去
**/
int partition(String topic, Object key, byte[] keyBytes, Object value, byte[] valueBytes, Cluster cluster);
  • 轮询策略

    kafaka的默认分区策略,最大限度的保证消息平均的发送到各个分区上,也是默认的最合理的分区策略。

  • 随机策略

    ​ 代码实现随机分区策略

    //实现partition接口重写partition方法
    //先计算出所有的分区数 然乎随机地返回一个小于它的正整数
    List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
    return ThreadLocalRandom.current().nextInt(partitions.size());
    

虽然随机策略也是保证消息到每个partition的概率是一样的,但是它仅仅是一个伪均衡,如何我们的项目需求是均匀分布,还是要使用轮询策略

  • 消息键值保存策略

    very very very important的一个分区策略。

    允许为每条消息定义消息键,简称为Key 相同的Key 会放在一个分区上

    可以代表明确业务含义的字符串(客户代码,部门编号或者业务Id等)

    List<PartitionInfo> partitions = cluster.partitionsForTopic(topic);
    return Math.abs(key.hashCode()) % partitions.size()
    

    存在一种场景如果我们需要保证我们的Topic 的消息是完全有序的情况下,使用轮询和随机策略就是不能实现的,因为kafka 的消息仅仅是保证消息在每个分区上有序。这样大多数情况下我们会选择仅仅给当前的Topic创建一个partition,当时这样就丧失了kafka的最大优势,多分区的负载均衡和高吞吐量的功能。

    这种情况下我们就可以使用消息键值保存策略指定多个分区,而且业务场景变化系统需要扩展的时候 ,都是比较方便高效的。而不是仅仅为了实现当前的功能去指定一个分区。

1.1.4Replic

kafka实现高可用的一种手段就是 Replication(备份机制)

每个partition 有多个 replica

  • Leader(只有一个Leader Leader挂了后会从Follower 中选取一个 具体的选取策略和 配置有关)
  • Follower(副本不提供对外的服务)
    • Follower Replica 只做一件事,向领导者副本发送请求,请求Leader把最新生产的消息发送给她,这样来保持与Leader的同步
1.1.5Broker(Server端)
  • cluster 由多个Broker组成
  • 接收clients的请求
  • 持久化消息
    • Kafaka使用消息日志(Log)【磁盘上只能追加写(Append-only)消息的物理文件】来保存数据
      • Log: 这样可以避免了缓慢的随机I/O操作 修改为性能较好的顺序I/O操作
      • Log Segment (如果一直追加不删除的话磁盘,最终一定会消耗完磁盘的空间的,所以要定时的进行删除 通过Log Segment 机制)
        • 一个Log可以分为多个Log Segment 消息会被追加到当前最新的日志段中,当然Log Segment是有大小限制的并且每个LogSegment的最大的size都是一致的。
        • 删除 kafka的后台有定时任务会定期的检查老的Log Segment是否能够被删除,从而实现回收磁盘空间的目的。
1.1.6 Clients
  • Producer

    • 向Topic发布消息的客户端应用程序成为生产者
    • 可以同时发布多个Topic消息
  • Consumer

    • 订阅消息的客户端
    • 可以同时订阅多个Topic
1.1.7Consumer Group

提升消费者端的吞吐量

CG会均衡的去消息订阅主题的Patition,一个Partition只能被消费者组中的一个Consumer Instance消费

1.1.8 consumer offset

​ 消费者组记录consumer消费的索引位置

1.1.9offset

当前最新消息存储的位置

1.1.10Rebalance

让一个Consumer Group下所有的Consumer实例如何消费订阅Tioic下的所有分区达成共识的过程。

所有的Consumer Instance共同参与,完成订阅主题的分配。

Rebalacce的过程中所有的消费者实例不能消费任何消息,对Consumer的TPS影响很大。

 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanejag
系列文章
更多 icon
同类精品
更多 icon
继续加载