Kafka学习

发布于:2025-03-05 ⋅ 阅读:(12) ⋅ 点赞:(0)

1. 消息队列

1.1 消息队列的作用

1.1.1 异步

可以结合快递员、消费者、菜鸟驿站来理解,菜鸟驿站就相当于是一个消息队列。这样做的好处是可以提高系统的响应速度、吞吐量。异步秒杀下单。

1.1.2 解耦

可以结合书本作者、读者、编辑部之间的关系来理解,比如说一本数是英文的,中国人看肯定是看中文得劲,法国人看肯定是法语得劲,但是作者也只会一种语言,也没必要去写不同语言的书,那么这个活就交给编辑部。消息队列就类似于编辑部,实现了不同服务之间的解耦减少了服务之间的影响,提高系统整体的稳定性以及可扩展性。

1.1.3 削峰

可以结合长江的水流来理解,每年长江都会有一段时间涨水,但是下游出水口的速度都是稳定的,如果不稳定,那么下游的百姓就会受难。所以就修理三峡大坝,把水存储起来,下游慢慢排水。所以消息队列的作用就是以稳定的系统资源应对突发的流量冲击。

1.1.4 实时日志处理

1.2 消息队列的模式

1.2.1 点对点模式

1.2.2 发布订阅模式

 2. kafka特点

3. kafka集群

在单机服务下,kafka已经具备了非常高的性能,TPS能够达到百万级别,但是在实际工作使用时,单机搭建的kafka会有很大的局限性。

一方面:消息太多,需要分开保存。kafaka是面向海量消息设计的,一个Topic下的消息会非常多,单机服务很难存得下来.这些消息就需要分成不同的Partition,分布到多个不同的Broker上,这样每个Broker就只需要保存一部分数据。

另一方面:服务不稳定,数据容易丢失。单机服务下,如果服务崩溃,那么消息就会丢失。但是为了保证数据安全,就给每个Partition配置一个或者多个备份,保证数据不丢失。也是主从分离,数据同步的形式进行,主节点负责响应客户端请求,从节点负责从主节点同步数据。

每个Broker之间应该知道彼此有哪些数据,因为不同Broker可能存储的是同一个Partition的数据,所以为了保证彼此之间知道对方的数据,就建立一个注册中心,即Zookeeper。

3.1 kafka集群搭建

4. kafka基础操作

4.1 创建topic

Kafka中所有消息都是保存在topic中,要生产消息到kafka中,首先必须要有一个确定的主题。

4.2 生产消息到Kafka

4.3 从Kafka消费消息

5. Java编程操作Kafka

5.1 同步生产消息到Kafka中

5.2 消费者消费消息

5.3 生产者使用异步方式生产消息

6. Kafka概念

1. broker

一个Kafka的集群通常由多个broker组成,这样才能实现负载均衡,以及容错。

broker是无状态的,他们是通过Zookeeper来维护集群状态。

一个Kafka的broker每秒可以处理数十万次读写,每个broker都可以处理TB消息而不影响性能。

2. zookeeper

zookeeper用来管理和协调broker,并且存储了Kafka的元数据,例如:有多少topic,partition、consumer。

zookeeper服务主要用于通知生产者和消费者Kafka集群中有新的broker加入、或者kafka集群中出现故障的broker。

3. producer生产者

生产者负责将数据推送给broker的topic。

4. consumer消费者

消费者负责从broker的topic中拉取数据,并自己进行处理。

5. consumer group消费者组

6. partition分区

7. replication副本

8. topic主题

9. offset偏移量

7. Kafka幂等性

7.1 概念

拿Http举例来说,一次或多次请求,得到的响应是一致的,换句话说,就是执行多次操作与执行一次操作的影响是一样的。

7.2 Kafka生产者幂等性

生产者重复问题:在生产者生产消息到partition,如果直接发送消息,kafka会将消息保存到分区中,但是kafka会返回一个ack给生产者,表示当前操作是否成功,是否已经保存了这条消息。如果ack响应的过程失败了,此时生产者就会重试,继续发送没有发送成功的消息,kafka又会保存一条一模一样的消息。

在Kafka中可以配置幂等性。

7.3 幂等性原理

原理:当Kafka开启幂等性后,在生产者生产消息时,会增加一个pid(生产者的唯一编号)和sequence number(针对消息递增的一个序列)。当生产者发送消息时,会连着pid和dequence number一起发送。Kafka接收到消息时,会将消息和pid、sequence number一起保存下来,如果ack响应失败了,生产者将重试。再次发送消息时,kafka会根据pid、sequence number判断是否需要再保存一条消息。就是通过判断生产者发送过来的sequence number是否小于等于partition中消息对应的sequence number,如果小于等于,就说明这个消息已经保存了。

8. 分区和副本机制

8.1 生产者分区写入策略

8.1.1 轮询策略

是在写入数据时没有key时,才会默认使用轮询策略。如果有key就是按key分区策略了。

8.1.2 随机策略(不用)

8.1.3 按key分配策略

8.1.4 乱序问题

在Kafka中,使用轮询策略和随即策略生产者写入数据时,当存在多个分区时,那么数据是分散在不同的partition中,数据是全局乱序的,但是在局部partition是有序的。如果只有一个分区,那就是有序的。而使用按key分配策略可以在一定程度上解决这个问题,但是该策略容易导致数据不一致,那就失去了kafka分布式的意义。

8.2 消费者组的Rebalance机制

8.2.1 什么是Rebalance机制?

在某些情况下,消费者组中的消费者消费分区发生变化时,会导致消费者分配不均匀,就会触发消费者组的Renalance机制,进行再均衡。

8.2.2 触发时机

消费者数量发生变化、topic数量发生变化(如删除了某个正在监听的topic)、partition的数量发生变化。

8.2.3 不良影响

当发生Rebalance时,所有的consumer将停止工作,共同参与再均衡,直到每个消费者都已经被分配到所需的分区,即Rebalance结束。

8.3 消费者分区分配策略

8.3.1 Range范围分配策略

时Kafka默认的。

8.3.2 RoundRobin轮询策略

逐个分配,分配完一轮后,再从第一个消费者开始。

8.3.3 Stricky粘性分配策略


网站公告

今日签到

点亮在社区的每一天
去签到