Kafka总结
-
是什么
由java和scala语言编写的,基于hadoop架构,
一种高吞吐量,分布式,支持partition分区,多副本replica,基于zookeeper协调的发布订阅消息系统(Message Queue) -
特点
稳定性高:
通过o(1)的磁盘数据结构提供消息的持久化,这种结果对于即时数以TB的消息储存也能够保持长时间的稳定性能
高吞吐量,低延迟
即时是非常普通的硬件kafka也可以支持每秒数百万的消息
延迟最低只有几毫秒
高并发
支持数千个客户端同时读写
容错性高
消息的负载均衡的储存与消费
支持通过卡夫卡服务器集群来分区储存,分布式消费消息的机制
良好支持hadoop并行计算
支持hadoop并行数据加载 -
应用场景
应用分类
构造实时流数据管道,在系统/应用之间可靠的获取数据:mq
构造实时流式应用程序,对这些数据进行转换或者其它操作:kafka stream topic 和 topic之间内部进行变换
经典案例
第一种应用较多:扮演mq角色,核心作用解耦
各种爬虫系统中的任务分发,数据回传,等生产者消费者场景
各种网站应用当中用户行为日志的收集与储存等生产者消费者场景
-
术语介绍
-
Message
俗称消息,就是消息数据,他通过kafka集群当中储存的真正实体数据
由不同的数据渠道推送到kafka集群,或是消费者角色从kafka拉取消费数据的统称
在kafka看来,所有过往数据都是message,也俗称kafka组件为message queue消息队列 -
Broker
Kafka集群包含一个或者多个服务器,这种服务器统一被称为broker,也就是中间人的解释 -
Topic
每条发布到kafka集群的消息都有一个类别,这个类别成为topic相当于给管道起了个名字
物理上不同的topic的消息分开储存,逻辑上一个topic的消息虽然保存于一个或者多个broker上,但是用户只需指定消息的topic即可生产或者消费数据,而不必关系数据在何处:topic是一个抽象的概念 -
Partition
Partition是物理上的概念,每个topic包含一个或者多个partition
每个partition都会默认有三个副本 -
Segment
Partition物理上由多个segment组成,每个segment存着message信息
Partition文件分segment管理,减少单个大文件太大的问题,并方便更快速定位message在哪个segment当中
定位segment后,再根据segment对应的index索引信息和message log日志文件快速定位和读取具体message消息 -
Producer
负责发布消息到kafka broker上 -
Consumer
消费者,向kafka broker读取消息的客户端 -
发布publish与订阅subscribe
发布消息,即为生产消息,将生产出来的消息加入MQ当中
订阅消息,由消费者主动提前定义消息的topic,一单该topic当中的消息有新增,则会主动通过消费者线程,此时消费者线程进入消息的处理过程 -
Consumer group
每个consumer属于一个特定的sonsumer group[
可以为每个consumer指定group name 若不指定 group name 则数据默认的group
每个消费者组共享订阅的topic消息,topic中的每个消息只会被一个consumer消费,不同组的可以消费相同的topic -
Offset
偏移量,位移,分区中的消息都有一个递增的id,称之为offset,他唯一标识了分区中的消息 -
消息系统一般语义说明
三种语义定义(适用于生产者和消费者两大场景)
最多1次(at most once) 消息可能丢失,但不会重复投递
最少一次(at least once) 消息不会丢失,但可能会重复投递
严格一次(exactly once): 消息不丢失,不重复,且只会被分发一次
在生产者场景中的语义剖析
最多一次:
1.producer产生数据后,有可能在写数据的时候不成功,只管写入,不去确认ack回应
2.此时broker就会跳过这个发送失败的消息,该条数据就会丢失,也最终导致consumer无法消费
最少一次
- producer产生数据后,已写入到kafka broker集群中
- 但是broker的网络异常,没有返回ack确定应答消息
- 此时producer会认为数据没有写入成功,则producer会再次写入数据,等价于一条数据被重复写入多次
严格一次 exactly once exactly once semantic EOS
生产者有且仅有一次将消息成功发送给broker
这种情况使我们想要的,也就是精准生产一次
该语义的实现方法:如何实现数据的精准写入kafka集群
幂等性
标准定义
多次完全相同的操作,只会有一次真正生效,而且不会因为多次做重复操作而产生的副作用
Kafka场景定义
在kafka中,生产者在生产消息发送到broker过程中,完全相同一条消息因为网络等不可控原因导致重复发送等情况,不管发送多少次,最终有且仅有一次是成功的
Kafka实现的方式
通过引入producerID以及sequence number支持幂等性
分布式事务 通过分布式事务实现生产写入数据的原子性操作
事务的4大特性 atom:原子性
Consistency一致性
Lsolated:隔离性
Durability:持久性
* 在消费者场景中的语义剖析
*
最多1次(At most once)
*
消费者先读取数据,然后提交offset确认消费记录,最后在处理数据。
*
如果在提交确定offset成功后,还没有及时的处理数据,就异常了,则新的consumer继续从这个offset处理,则还没来得及处理的数据,就永远不会被处理
*
结果是“最多消费一次”
*
最少1次(At least once)–默认采用该语义策略
*
消费者先读取数据,然后处理数据,最后提交offset确定消费。
*
如果在提交offset之前就异常退出,则确定消费的ACK失败,则新的consumer会重复的来消费这条数据。
*
结果是“最少1次”
*
严格1次(Exactly once)
*
消费者通过将提交分成两个阶段来解决
*
先读取数据后,先提交offset确认已读取消息一次待正式处理,然后消息处理成功后,再提交一次确认消费成功一次
*
Kafka Streams模块也实现了该语义功能
*
补充说明
*
关于“严格1次”的说明,理论上是没有绝对的“严格1次”,所谓的“严格1次”是指在没有极特殊情况发生的情况下满足该语义。