《spring实战》学习笔记——day4

kafka基本概念
kafka演化
kafka架构及原理

架构:
在这里插入图片描述
Partition中的offset:
offset

  • Kafka 运行在一个由一台或多台服务器组成的集群上,并且分区可以跨集群结点分布(图中每个broker都是一个节点)
  • 每个生产者发布新消息时都要指定消息的类别,即topic,每个topic又被分为多个Partition(避免队列过长,提高并发能力),每个 Partition 对应于一个 log 文件,该 log 文件中存储的就是 Producer 生产的数据。
  • 在每个Broker中,是以Partition为单位进行管理的。同一topic下的同一partition可以有多个副本,但只有一个为Leader,其他均为Follower。
  • 生产者将消息发送给Leader,消费者从Leader读取消息,Leader所在broker负责保证副本的同步
  • Offset:消费者消费的位置信息,监控数据消费到什么位置,当消费者挂掉再重新恢复的时候,可以从消费位置继续消费
  • Producer和Broker之间没有负载均衡机制。Broker和Consumer 之间利用ZooKeeper进行负载均衡。所有的Broker和Consumer都会在Zookeeper中进行注册,且Zookeeper会保存他们的一些元数据信息。如果某个Broker和Consumer发生了变化,那么所有其他的Broker和Consumer都会得到通知

存储机制
在这里插入图片描述
生产者生产的消息会不断追加到 log 文件末尾,为防止 log 文件过大导致数据定位效率低下,Kafka 采取了分片和索引机制。它将每个 Partition 分为多个 Segment,每个 Segment 对应两个文件:“.index” 索引文件和 “.log” 数据文件。
选举机制:
1.controller选举:
kafka在所有broker中选出一个controller,所有Partition的Leader选举都由controller决定。controller会将Leader的改变直接通过RPC的方式(比Zookeeper Queue的方式更高效)通知需为此作出响应的Broker。同时controller也负责增删Topic以及Replica的重新分配。

  • 启动时选择controller:第一个启动的代理节点,会在Zookeeper系统里面创建一个临时点/controller,并写入该节点的注册信息,使该节点成为控制器;其他的代理节点陆续启动时,也会尝试在Zookeeper系统中创建/controller节点,但是由于/controller节点已经存在,所以会抛出“创建/controller节点失败异常”的信息。创建失败的代理节点会根据返回的结果,判断出在Kafka集群中已经有一个控制器被成功创建了,所以放弃创建/controller节点,这样就确保了Kafka集群控制器的唯一性;
  • controller宕机时新选取机制:当控制器被关闭或者与Zookeeper系统断开连接时,Zookeeper系统上的临时节点就会被清除。Kafka集群中的监听器会接收到变更通知,各个代理节点会尝试到Zookeeper系统中创建一个控制器的临时节点。第一个成功在Zookeeper系统中创建的代理节点,将会成为新的控制器。每个新选举出来的控制器,会在Zookeeper系统中获取一个递增的controller_epoch值。
  • 优点:极大缓解Herd Effect问题、减轻Zookeeper负载、Controller与Leader及Follower间通过RPC通信,高效且实时
  • 缺点:引入Controller增加了复杂度、需要考虑Controller的Failover

2.Leader选择:

  • 选举算法的实现类似于微软的PacificA
  • leader所在broker宕机时:
    一旦有一个broker宕机了,kafka broker controller会读取该宕机broker上所有的partition在zookeeper上的状态,并选取ISR列表中的一个replica作为partition leader(如果ISR列表中的replica全挂,选一个幸存的replica作为leader;如果该partition的所有的replica都宕机了,则将新的leader设置为-1,等待恢复,等待ISR中的任一个Replica“活”过来,并且选它作为Leader;或选择第一个“活”过来的Replica(不一定是ISR中的)作为Leader

生产者属性:

  1. 分区:为了提高扩展适应性及并发性能,所以发送对象时需要指定发送对象的参数。topic:string 类型,NotNull。partition:int 类型,可选。timestamp:long 类型,可选。key:string 类型,可选。value:string 类型,可选。headers:array 类型,Nullable。

  2. 数据可靠性保证策略:
    收到确认:生产者发送消息后,对应Broker收到消息后需要向生产者发送ASK确认,否则生产者会重新发送。
    副本同步策略:关键问题在于何时发送ASK确认?
    (1)Leader收到消息后立马回复ACK确认。缺点:此策略在副本同步出问题,恰好本节点坏掉时,会出现数据丢失的问题。
    (2)全部副本同步完成后。缺点:延迟高,特别是某个副本出现问题,会阻塞,无法发送ACK。解决办法:Leader维护了一个动态的 in-sync replica set(ISR):和 Leader 保持同步的 Follower 集合。当 ISR 集合中的 Follower 完成数据的同步之后,Leader 就会给 Follower 发送 ACK。如果 Follower 长时间未向 Leader 同步数据,则该 Follower 将被踢出 ISR 集合,该时间阈值由 replica.lag.time.max.ms 参数设定。Leader 发生故障后,就会从 ISR 中选举出新的 Leader。
    (2)部分副本同步完成后。前两者方案的中和
    kafka设置了三种级别,供用户根据不同也许需求选择:0:不需要ACK确认;1:上述(1);-1:上述方案(2)

  3. 副本同步细节:
    在这里插入图片描述
    LEO:每个副本最大的 Offset。HW:消费者能见到的最大的 Offset,ISR 队列中最小的 LEO。
    Follower 故障:Follower 发生故障后会被临时踢出 ISR 集合,待该 Follower 恢复后,Follower 会 读取本地磁盘记录的上次的 HW,并将 log 文件高于 HW 的部分截取掉,从 HW 开始向 Leader 进行同步数据操作。
    等该 Follower 的 LEO 大于等于该 Partition 的 HW,即 Follower 追上 Leader 后,就可以重新加入 ISR 了。
    Leader 故障:Leader 发生故障后,会从 ISR 中选出一个新的 Leader,之后,为保证多个副本之间的数据一致性,其余的 Follower 会先将各自的 log 文件高于 HW 的部分截掉,然后从新的 Leader 同步数据。
    注意:这只能保证副本之间的数据一致性,并不能保证数据不丢失或者不重复。

消费者属性:

  • 两种模式:Consumer 采用 Pull(拉取)模式、Push(推送)模式从 Broker中读取数据。各有优劣,具体比较简单,不再详述。

  • 分区分配策略 :一个 Consumer Group 中有多个 Consumer,一个 Topic 有多个Partition,所以必然会涉及到 Partition 的分配问题,即确定哪个 Partition 由哪个 Consumer 来消费。
    ①Range(默认方式):
    在这里插入图片描述
    特点:按主题大概均分partition给消费者;缺点:可能出现分配不均衡
    ②RoundRobin
    在这里插入图片描述
    将分区所有partition作为一个整体进行 Hash 排序,消费者组内分配分区个数最大差别为 1,是按照组来分的,可以解决多个消费者消费数据不均衡的问题。但是,当消费者组内订阅不同主题时,可能造成消费混乱
    简单应用
    1.安装并启动zookeeper服务

  • 下载:http://mirror.bit.edu.cn/apache/zookeeper/

  • 修改配置: 将conf文件夹中的zoo_sample.cfg改名为zoo.cfg,并按需修改其中配置。比如端口号、dataDir以及dataLogDir等

  • 启动服务:windows系统下直接右键管理员身份运行bin目录下的zkServer.cmd(如果启动异常,可以在该文件最后加一行:pause,可以防止命令行闪退,查看报错原因)

部分安装包只包含服务端,部分包含客户端,对于含有客户端的包,可以java -jar 文件.jar运行客户端

2.安装并启动kafka

  • 下载:http://kafka.apache.org/downloads
  • 修改配置:打开config文件夹中的server.properties文件,修改关键配置zookeeper.connect=localhost:zookeeper服务端口号(本文两软件都安装在本地),其他参数可以使用默认值
  • 启动服务:打开cmd,切换到kafka安装目录,运行:
.\bin\windows\kafka-server-start.bat .\config\server.properties

在这里插入图片描述
没有问题的话就会启动成功,并且zookeeper服务也会有提示信息。
3.基于kafka的消息发送与接收

  • 依赖:
		<dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
<!--   注释掉版本是因为后续遇到了问题  <version>2.2.1.RELEASE</version>-->   
 </dependency>
  • 消息生产者:
    新建springboot项目,选择上web依赖,然后编写ProducerController类:
@Component
@Controller
public class ProducerController {
    @Resource
   private KafkaTemplate<String,String> kafkaTemplate;

   @Autowired
   //上述依赖未注释掉时,此行会报错(可能是版本兼容问题,具体原因未知)
   public ProducerController(KafkaTemplate<String,String> kafkaTemplate){
        this.kafkaTemplate=kafkaTemplate;
    }
    //发送消息方法
    @ResponseBody
    @RequestMapping("/send")
    public void send(String st) {
        kafkaTemplate.send("随便编号",st);
    }
}
  • 消息消费者:
    另外新建springboot项目,配置类似于生产者项目,完成后编写CustomerController类
@Controller
@Slf4j
public class CustomerController {

    @KafkaListener(topics = {"同上面的编号"})
    public void displayOrder(String st) {
        log.info("RECEIVED ORDER:  " + st);
    }
}

注:本实践传递参数只有一个,比较简单,当要传递为一个拥有多个属性的对象时,要考虑序列化等问题。
4.效果:
地址栏输入:
在这里插入图片描述
(该实践中,生产者对应springboot项目启用的是8080端口)
在消费者项目的控制台可以看到以下信息:
在这里插入图片描述
证明生产者消息被消费者监听到。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值