首页 > 其他分享 > 【Spring-boot-route(十四)整合Kafka】

【Spring-boot-route(十四)整合Kafka】

时间:2023-02-14 11:37:18浏览次数:38  
标签:leader Spring route boot kafka topic follower 消息 分区

kafka简介

kafka是用Scala和Java语言开发的,高吞吐量的分布式消息中间件。高吞吐量使它在大数据领域具有天然的优势,被广泛用来记录日志。

kafka架构分析

 【Spring-boot-route(十四)整合Kafka】_kafka


注1:图中的红色箭头表示消息的流动过程,蓝色表示分区备份,绿色表示kafka集群注册到zookeeper。

注2:在kafka0.9版本之前,消费者消费消息的位置记录在zookeeper中,在0.9版本之后,消费消息的位置记录在kafka的一个topic上。

kafka名词简介:​

  1. Producer:消息生产者
  2. Consumer:消息消费者
  3. Consumer Group(CG):消费者组,一个topic可以有多个CG,每个Partition只会把消息发送给GG中的一个Consumer
  4. Broker:一台kafka服务器就是一个broker,一个broker有多个topic
  5. Topic:消息主题,消息分类,可看作队列
  6. Partition:分区,为了实现扩展,一个大的topic可能分布到多个broker上,一个topic可以分为多个partition,partition中的每条消息都会被分配一个有序的id(offset),每个partiton中的消息是有序的。
  7. Offset:kafka的存储文件都是按照offset.kafka来命名的,方便查找,第一个offset为0000000000.kafka。
  8. Leader:分区具有被备份,主分区
  9. Follower:从分区


1. 生产者分区策略

  1. 指定分区。
  2. 没有指定分区但有key值,将key的hash值与当前topic的分区个数进行取余得到分区。
  3. 如果既没有指定分区又没有指定key,第一次调用时随机生成一个整数(以后调用每次在这个整数上自增),将这个随机数与该topic的分区数取余得到分区。


2. 消息可靠性问题

采用ack确认机制来保证消息的可靠性。

kafka在发送消息后会同步到其他分区副本,等所有副本都接收到消息后,kafka才会发送ack进行确认。采用这种模式的劣势就是当其中一个副本宕机后,则消息生产者就不会收到kafka的ack。

kafka采用ISR来解决这个问题。


ISR:Leader维护的一个和leader保持同步的follower集合。

当ISR中的folower完成数据同步之后,leader就会向follower发送ack,如果follower长时间未向leader同步数据,则该follower就会被踢出ISR,该时间阀值的设置参数为​​replica.lag.time.max.ms​​,默认时间为10s,leader发生故障后,就会从ISR中选举新的leader。

注:本文所讲的kafka版本为0.11,在0.9版本以前成为ISR还有一个条件,就是同步消息的条数。


ack参数配置

0:生产者不等待broker的ack。

1:leader分区接收到消息向生产者发送ack。

-1(all):ISR中的leader和follower同步成功后,向生产者发送ack。


3. 消息一致性问题

假如leader中有10条消息,向两个follower同步数据,follower A同步了8条,follower B同步了9条。这时候leader宕机了,follower A和follower B中的消息是不一致的,剩下两个follower就会重新选举出一个leader。

  • LEO(log end offset):每个副本的最后一个offset
  • HW(high watermark):所有副本中最小的offset

为了保证数据的一致性,所有的follower会将各自的log文件高出HW的部分截掉,然后再从新的leader中同步数据。


4. 消息重复性问题

在kafka0.11版本中引入了一个新特性:幂等性。启用幂等性后,ack默认为-1。将生产者中的​​enable.idompotence​​设置为true,即启用了幂等性。

开启幂等性的Producer在初始化的时候会被分配一个PID,发往同一Partition的消息会附带Sequence Number。Broker端会对<PID,Partition,SeqNumber>做缓存,当具有相同主键的消息提交时,Broker只会缓存一条。但是每次重启PID就会发生变化,因此只能保证一次会话同一分区的消息不重复。


5. 消费者组分区分配策略

kafka有两种分配策略,一种是RoundRobin,另一种是Range

RoundRobin是按照消费者组以轮询的方式去给消费者分配分区的方式,前提条件是消费者组中的消费者需要订阅同一个topic。

Range是kafka默认的分配策略,它是通过当前的topic按照一定范围来分配的,假如有3个分区,消费者组有两个消费者,则消费者A去消费1和2分区,消费者B去消费3分区。


6. 消费者offset维护

Kafka 0.9 版本之前,consumer默认将offset保存在zookeeper中,0.9 版本开始,offset保存在kafka的一个内置topic中,该topic为​​_consumer_offsets​​。


7. 生产者事务

为了实现跨分区会话的事务,需要引入一个全局唯一的Tracscation ID,并将Producer 获得的PID与之绑定。这样当Producer重启后就可以通过正在进行的Transaction ID获得原来的PID。

为了管理Transcation ID,kafka引入了一个新的组件Transcation Coordinator。Producer就是通过和Transcation Coordinator交互获得Transction ID对应的任务状态。


Spring Boot 整合kafka

1. 引入kafka依赖

 【Spring-boot-route(十四)整合Kafka】_zookeeper_02

2. 配置kafka服务信息

 【Spring-boot-route(十四)整合Kafka】_zookeeper_03

3. 消费者

 【Spring-boot-route(十四)整合Kafka】_kafka_04

4. 生产者

 【Spring-boot-route(十四)整合Kafka】_kafka_05

此是spring-boot-route系列的第十四篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。


标签:leader,Spring,route,boot,kafka,topic,follower,消息,分区
From: https://blog.51cto.com/u_15874356/6056416

相关文章

  • 开心档-软件开发入门之Bootstrap4 安装使用
    Bootstrap4安装使用我们可以通过以下两种方式来安装Bootstrap4:使用Bootstrap4CDN。从官网 getbootstrap.com 下载Bootstrap4。 Bootstrap4CDN......
  • 最全的springboot注解
    1、SpringBoot/spring@SpringBootApplication:包含@Configuration、@EnableAutoConfiguration、@ComponentScan通常用在主类上;@Repository:用于标注数据访问组件,即DAO组件;@S......
  • 转载:Vue+springboot集成PageOffice实现在线编辑Word、excel文档
    说明:   PageOffice是一款在线的office编辑软件,帮助Web应用系统或Web网站实现用户在线编辑Word、Excel、PowerPoint文档。可以完美实现在线公文流转,领导批阅,盖章。......
  • spring boot学习笔记:第十章--实现AcApp端 -中
    这节课的内容是完善对局列表界面,排行榜界面和bot界面的设计。ctrl+shift+c点击后,出现想要的组件属性。exportclassGame{constructor(id,AcWingOS){con......
  • springboot自动配置原理以及spring.factories文件的作用详解
    一、springboot自动配置原理先说说我们自己的应用程序中Bean加入容器的办法:packagecom.ynunicom.dc.dingdingcontractapp;importcom.alibaba.druid.spring.boot.au......
  • Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 c
    FSouvenirs将询问离线,对原数组离散化,然后用权值线段树维护区间对应权值最大值,\(a_i\)的权值为\(i\),再用树状数组维护区间两数绝对值差的最小值。复杂度为\(\mathcal{......
  • 微服务学习计划——SpringCloud
    微服务学习计划——SpringCloud在学习并掌握了众多基础框架之后,我们的项目繁杂且难以掌握,那么我们就需要开启一门新的课程,也就是我们常说的微服务架构随着互联网行业的发......
  • Spring Boot RabbitMQ 应用场景
    1.前言消息队列是一个容器,可以对程序产生的消息进行存储。消息队列的主要用途是削峰、异步、解耦,我们用一个实际场景来解释下。有一家果汁生产企业,张三是采购员,负责采购......
  • Spring Cache注解
    SpringCache主要提供了两个重要的注解:@Cacheable:标识该方法的返回值是可以缓存的,如果缓存中存在,则直接返回缓存中的结果,否则,执行该方法,并将结果存入缓存。@CachePut......
  • Spring IOC官方文档学习笔记(十)之类路径扫描与组件管理
    1.@Component注解与其衍生注解(1)在Spring中,@Component注解用于说明某个类是一个bean,之后Spring在类路径扫描过程中会将该bean添加至容器中;@Component注解还有很多衍......