一篇文章认识kafka

1.认识消息队列

在认识kafka之前,先明白一下消息队列的原理以及作用。

消息队列中间件是分布式系统中重要的组件,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。

目前在生产环境,使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。

2.消息队列的说明

目前我们的菜鸟驿站的运作就类似消息队列的作用。

异步:快递员要投递快递到用户手上,用户有可能在上班没办法即使赶回来,快递员也不可能一直等着用户,所以快递员就把快递放在菜鸟驿站,让用户自己去取,快递员就直接送其他快递去了,这就是异步。

流量削锋:用户可能买了好几个东西分几个公司的快递发过来,圆通、顺丰、中通这些快递都叫用户来取快递,用户一会去圆通、一会去找顺丰简直忙不过来,这时候快递统一放菜鸟驿站,用户就解决了过于繁忙的问题了。

应用耦合:用户取顺丰快递的时候,就不能做其他事了,顺丰也得等着用户,双方都被占据着时间,有了消息队列,都可以各干各的事,就解耦了。

3.消息队列的两种模式

p2p模式(点对点)

 

Pub/Sub模式(发布订阅模式)

 

4.kafka的说明

明白了消息队列的作用,就可以开始认识kafka了。 kafka是一个分布式消息队列。具有高性能、持久化、多副本备份、横向扩展能力。生产者往队列里写消息,消费者从队列里取消息进行业务逻辑。一般在架构设计中起到解耦、削峰、异步处理的作用。 kafka对外使用topic的概念,生产者往topic里写消息,消费者从读消息。为了做到水平扩展,一个topic实际是由多个partition组成的,遇到瓶颈时,可以通过增加partition的数量来进行横向扩容。 单个parition内是保证消息有序。每新写一条消息,kafka就是在对应的文件append写,所以性能非常高。

4.1kafka的术语

Kafka维护消息类别的东西是主题(topic)

我们称发布消息到Kafka主题的进程叫生产者(producer)

我们称订阅主题、获取消息的进程叫消费者(consumer)

Kafka是由多个服务器组成的机器,每个服务器称作代理(broker)

每个节点的作用流程如下图所示:

 

 

ZooKeeper,它是一个开源的分布式协调框架,它可以将那些容易出错的分布式一致性服务封装起来,构成一个高效、可靠、简单易用的结构提供给用户使用

4.2kafka的工作流

producer就是生产者,是数据的入口。注意看图中的红色箭头,Producer在写入数据的时候永远的找leader,不会直接将数据写入follower!那leader怎么找呢?写入的流程又是什么样的呢?看下图:

 

上面说到数据会写入到不同的分区,那kafka为什么要做分区呢?相信大家应该也能猜到,分区的主要目的是:

1、 方便扩展。因为一个topic可以有多个partition,所以我们可以通过扩展机器去轻松的应对日益增长的数据量。

2、 提高并发。以partition为读写单位,可以多个消费者同时消费数据,提高了消息的处理效率。

熟悉负载均衡的朋友应该知道,当我们向某个服务器发送请求的时候,服务端可能会对请求做一个负载,将流量分发到不同的服务器,那在kafka中,如果某个topic有多个partition,producer又怎么知道该将数据发往哪个partition呢? kafka中有几个原则:

1、 partition在写入的时候可以指定需要写入的partition,如果有指定,则写入对应的partition。

2、 如果没有指定partition,但是设置了数据的key,则会根据key的值hash出一个partition。

3、 如果既没指定partition,又没有设置key,则会轮询选出一个partition。

保证消息不丢失是一个消息队列中间件的基本保证,那producer在向kafka写入消息的时候,怎么保证消息不丢失呢?其实上面的写入流程图中有描述出来,那就是通过ACK应答机制! 在生产者向队列写入数据的时候可以设置参数来确定是否确认kafka接收到数据,这个参数可设置的值为0、1、all。

0代表producer往集群发送数据不需要等到集群的返回,不确保消息发送成功。安全性最低但是效率最高。

1代表producer往集群发送数据只要leader应答就可以发送下一条,只确保leader发送成功。

all代表producer往集群发送数据需要所有的follower都完成从leader的同步才会发送下一条,确保leader发送成功和所有的副本都完成备份。安全性最高,但是效率最低。

4.3partition

每个topic都可以分为一个或多个partition

Partition在服务器上的表现形式就是一个一个的文件夹,每个partition的文件夹下面会有多组segment文件,每组segment文件又包含.index文件、.log文件、.timeindex文件(早期版本中没有)三个文件 log文件就实际是存储message的地方,而index和timeindex文件为索引文件,用于检索消息。

 

4.4Message

log文件就实际是存储message的地方。

我们在producer往kafka写入的也是一条一条的message,那存储在log中的message是什么样子的呢?消息主要包含消息体、消息大小、offset、压缩类型……等等!我们重点需要知道的是下面三个:

1、 offset:offset是一个占8byte的有序id号,它可以唯一确定每条消息在parition内的位置!

2、 消息大小:消息大小占用4byte,用于描述消息的大小。

3、 消息体:消息体存放的是实际的消息数据(被压缩过),占用的空间根据具体的消息而不一样

posted @ 2025-05-14 15:12  寻虫测试  阅读(11)  评论(0)    收藏  举报