测试中需要知道的kafka核心知识点

术语

 

Broker:对应节点,多个Broker构成Kafka集群

Topic:一类消息

Partition:Topic的物理存储。一个Topic对应多个Patitions

Segment:Partition的物理存储。一个Partition包含多个Segment

消息生产

 

消息内容+topic→hash到目标partition,生成消息的唯一标识offset

  • 指定Partition:直接到目标Partition

  • 指定key:实现paittiioner接口自定义Hash算法将key路由到目标Partition

  • Partition与Key都不指定:自增长数组取余的方式路由到目标Partition

  消息消费

  • 消费者与消费组:消费者携带消费组及topic信息进行消费,同组消费者不可重复消费消息;不同组消费者可以消费同一个消息;
  • 服务器通过zk记录消费者消费消息详情,消费者每次从记录的上次消费的offset后拉取消息

     /{comsumer}/{group_name}/{id}/{consumer_id} //记录id

     /{comsumer}/{group_name}/{offset}/}{topic_name}/{partitions_id} //记录偏移量

     /{comsumer}/{group_name}/{owner}/}{topic_name}/{partitions_id} //记录分区属于哪个消费者

消息存储

 

  • 每个partition包含一组index、log文件,index以key(消息offset)、value(消息在log文件中的偏移量)的形式保存消息的索引信息;

  • 索引文件是稀疏,采用二分查找

  • 日志清理与更新:压缩前Log_Head:offset连续递增(存在相同key不同value的情况) Clear Point: 压缩点 压缩后:offset断续递增,保存各key最新的value值(key不重复) 

  消息重平衡

  • 背景:新增或删除消费者和Partition,Consumer Rebalance被触发执行,导致消息不可消费
  • 消费者通过定期发送心跳(hearbeat)到一个作为组协调者(group coordinator)的broker来保持在消费组内存活(broker不是固定的,每个消费组都可能不同)。当消费者拉取消息或者提交时,便会发送心跳。如果消费者超过一定时间没有发送心跳,那么它的会话(session)就会过期,组协调者会认为该消费者已经宕机,然后触发重平衡。高版本kafka允许设置消费者多长时间不拉取消息但仍然保持存活的时间

消息丢失

 

  • 消息生产:同步、异步(可通过produce.type指定),同步模式下,3种消息应答机制:0(不ACK)、1(Leader接受消息后返回ACK)、-1(Leader和Follower都接受到消息后返回ACK);异步模式下,主要受消息缓存影响
  • 消息消费:消息取出来、并提交了新的消息offset值给ZK后,还没来得及消费,消费进行就异常挂掉

消息丢失场景

  • 同步-应答机制0:用户发送消息后,由于网络或缓存等问题,消息并未存储到Partion;
  • 同步-应答机制1:Leader发送ACK后同步到Follower之前,Leader挂掉;
  • 异步:缓存空间不足。超过阻塞超时时间;消息取出来、并提交了新的消息offset值后,还没来得及消费就挂掉了

避免消息丢失:

  • 同步模式下,使用应答机制-1;
  • 异步模式下,设置阻塞超时时间为无限大;

猜你喜欢

转载自blog.csdn.net/qq_30758629/article/details/86352467