使用kafka可以对系统

​ 解耦、

​ 流量削峰、

​ 缓冲

可以实现系统间的异步通信等。

在活动追踪、消息传递、度量指标、日志记录和流式处理等场景中非常适合使用kafka

图片

组件释义备注
Broker服务代理节点其实就是一个kafka实例或服务节点,多个broker构成了kafka cluster
Producer生产者也就是写入消息的一方,将消息写入broker中
Consumer消费者也就是读取消息的一方,从broker中读取消息
Consumer Group消费组一个或多个消费者构成一个消费组,不同的消费组可以订阅同一个主题的消息且互不影响
ZooKeeperkafka使用zookeeper来管理集群的元数据,以及控制器的选举等操作
Topic主题每一个消息都属于某个主题,kafka通过主题来划分消息,是一个逻辑上的分类。
Partition分区同一个主题下的消息还可以继续分成多个分区,一个分区只属于一个主题
Replica副本一个分区可以有多个副本来提高容灾性。
Leader and Follower主从分区有了多个副本,那么就需要有同步方式。kafka使用一主多从进行消息同步,主副本提供读写的能力,而从副本不提供读写,仅仅作为主副本的备份。
Offset偏移分区中的每一条消息都有一个所在分区的偏移量,这个偏移量唯一标识了该消息在当前这个分区的位置,并保证了在这个分区的顺序性,不过不保证跨分区的顺序性。

简单来说,作为消息系统的kafka本质上还是一个数据系统。既然是一个数据系统,那么就要解决两个根本问题:

  • 当我们把数据交给kafka的时候,kafka怎么存储;

  • 当我们向kafka要回数据的时候,kafka怎么返回。

    图片

目前大多数数据系统将数据存储在磁盘的格式有追加日志型以及B+树型。而kafka采用了追加日志的格式将数据存储在磁盘上,整体的结构如下图:

图片

追加日志的格式可以带来写性能的提升(毕竟只需要往日志文件后面追加就可以了),但是同时对读的支持不是很友好。为了提升读性能,kafka需要额外的操作。

关于kafka的数据是如何存储的是一个比较大的问题,这里先从逻辑层面开始。

Topic+Partition的两层结构

Offset

发送方式

消息的发送有三种方式:

  • 发后即忘(fire and forget):只管发送不管结果,性能最高,可靠性也最差;

  • 同步(sync):等集群确认消息写入成功再返回,可靠性最高,性能差很多;

  • 异步(async):指定一个callback,kafka返回响应后调用来实现异步发送的确认。

其中前两个是同步发送,后一个是异步发送。不过这里的异步发送没有提供callback的能力。

那么生产者发送消息之后kafka怎么才算确认呢?这涉及到acks参数:

  • acks = 1, 默认值1,表示只要分区的leader副本成功写入就算成功;

  • acks=0,生产者不需要等待任何服务端的响应,可能会丢失数据;

  • acks=-1或acks=all,需要全部处于同步状态的副本确认写入成功,可靠性最强,性能也差。

参考