Kafka的术语

1.1Kafka的术语

1.1.1Record

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

1.1.2Topic

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

1.1.3Partition

1.什么事分区dom

kafka在建立topic的时候须要指定partition数,均匀分布在不一样的Broker上,通常状况下Partition和Broker的数量是一致的。这样作的好处是 提高系统的伸缩性,提供了负载均衡的能力,也能够根据对分区作具体的操做。性能

2.kafak的分区策略spa

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

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

/** * 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影响很大。

相关文章
相关标签/搜索