一、概念
1、定义
- 是一种高吞吐的、分布式的、支持分区的、多副本的、基于ZooKeeper协调的消息系统。
- LinkedIn贡献给apache的开源的流数据处理平台
-
2、2.x版本新变化
自从0.10及以后,定位为分布式的流数据处理平台,而不是单纯的消息队列
目标是大部分的公司使用其来实现告诉性能管道,流分析,数据集成等
二、相关特性
1、相关特性
稳定性高
- 通过O(1)的磁盘数据结构提供消息的持久化,这种结构使得既是是TB为单位的数据也能长时间的稳定存储。
- 高吞吐量、低延迟
- 即使是很普通的配置Kafka也能提供每秒数百万的消息,并且延迟最低只有几毫秒
- 高并发
- 支持数千个用户同时读写
- 容错性好
- 消息的负载均衡的写入与消费
- 支持通过kafka集群的分区的存储、分布式的消费
良好的支持hadoop并行计算
-
三、应用场景
构造实时流数据管道,可以在系统或者应用之间可靠的获取数据。(相当于消息队列即MQ,核心作用是解耦)
构建实时流式应用程序,对这些数据进行转换或者其他操作。(就是流处理)
四、Kafka相关的术语
1、Message
- 消息,就是Kafka集群当中存储的真正的实体数据。在Kafka的角度来看一切过往数据皆Message。
- 2、Broker
- Kafka集群包含一个或多个服务器,这些服务器统称为Broker。
- 3、Topic
- 每一条发送到kafka的数据都有一个类别,即Topic。相当于给一类消息管道起的名字。
- 物理上不同Topic的消息分开存储。但逻辑上使用丝毫不受影响。
- 4、Partition
- partition是物理上的概念,每个Topic有多个partition。
- 每个partition有三个副本,可以自定义修改。
- 5、segment
- 每个partition有多个segment,每个segment里都存着消息。
- partition分文件管理。避免单个文件过大的问题,并且方便快速定位message。
- 定位segment后,根据segment的index索引和log日志文件来定位并且读取message内容。
- 6、Producer
- 即生产者,发送消息到broker。
- 7、Consumer
- 即消费者,向broker读取消息的客户端。
- 8、发布与订阅
- 发布:即生产者将消息发送到消息队列的过程。
- 订阅:消费者提前规定需要的Topic。如果该topic当中有消息新增,则会主动通过消费者线程。
- 9、Consumer Group
- 每个Consumer属于一个特定的Consumer组。可以为其指定组。如果不指定即为默认的组。
- 每个消费者组中的消费者共享Topic。每个消息只会被一个消费者消费。
10、Offect
三种语义定义(生产者消费者均可以使用)
- 最多一次:可能会丢失,但不会重复投递
- 最少一次:可能会重复,但一定能收到
- 严格一次:不丢失,不重复,有且只会有一次发送成功。
- 在生产者中的分析
- 最多一次
- 在producer发送数据时没有接受ACK应答,broker就会跳过这个发送失败的消息,该数据就会丢失,消费者也无法消费这个数据。
- 最少一次
- 在producer发送数据后,broker网络异常,没有返回ACK请求。 此时producer会认为消息发送失败,会再发送一条消息。这时一条数据就被重复写入了多次。
- 严格一次
- 生产者有且只有一次发送成功
- 实现这种语义的方法
- 幂等性:多次完全相同的操作,操作一次和操作多次对结果没有影响。在kafka中,每次发送数据的操作有且只有一次时成功的。
- 分布式事务:通过分布式事务实现生产写入数据的原子性操作。
- 事务的四大特征:原子性,一致性,隔离性,持久性。
- 最多一次
- 在消费者中的分析
- 最多一次
- 消费者先读取数据,然后提交offset确认消费记录。然后再进行处理数据。如果还没来得及处理数据就异常了,新的消费者会接下去处理。这个消息就不会被消费。
- 最少一次
- 消费者先处理数据,然后处理数据,最后在提交offset。如果在offset之前宕机,则认定这条消息还没有被处理,下一个消费者还是会处理。
- 严格一次
- 先读取消息,然后再提交确认,然后再处理消息,然后再提交一次确认。
- 最多一次
-