kafka初识

Kafka总结

  1. 是什么
    由java和scala语言编写的,基于hadoop架构,
    一种高吞吐量,分布式,支持partition分区,多副本replica,基于zookeeper协调的发布订阅消息系统(Message Queue)

  2. 特点
    稳定性高:
    通过o(1)的磁盘数据结构提供消息的持久化,这种结果对于即时数以TB的消息储存也能够保持长时间的稳定性能
    高吞吐量,低延迟
    即时是非常普通的硬件kafka也可以支持每秒数百万的消息
    延迟最低只有几毫秒
    高并发
    支持数千个客户端同时读写
    容错性高
    消息的负载均衡的储存与消费
    支持通过卡夫卡服务器集群来分区储存,分布式消费消息的机制
    良好支持hadoop并行计算
    支持hadoop并行数据加载

  3. 应用场景
    应用分类
    构造实时流数据管道,在系统/应用之间可靠的获取数据:mq
    构造实时流式应用程序,对这些数据进行转换或者其它操作:kafka stream topic 和 topic之间内部进行变换

经典案例
第一种应用较多:扮演mq角色,核心作用解耦
各种爬虫系统中的任务分发,数据回传,等生产者消费者场景
各种网站应用当中用户行为日志的收集与储存等生产者消费者场景

  1. 术语介绍

  2. Message
    俗称消息,就是消息数据,他通过kafka集群当中储存的真正实体数据
    由不同的数据渠道推送到kafka集群,或是消费者角色从kafka拉取消费数据的统称
    在kafka看来,所有过往数据都是message,也俗称kafka组件为message queue消息队列

  3. Broker
    Kafka集群包含一个或者多个服务器,这种服务器统一被称为broker,也就是中间人的解释

  4. Topic
    每条发布到kafka集群的消息都有一个类别,这个类别成为topic相当于给管道起了个名字
    物理上不同的topic的消息分开储存,逻辑上一个topic的消息虽然保存于一个或者多个broker上,但是用户只需指定消息的topic即可生产或者消费数据,而不必关系数据在何处:topic是一个抽象的概念

  5. Partition
    Partition是物理上的概念,每个topic包含一个或者多个partition
    每个partition都会默认有三个副本

  6. Segment
    Partition物理上由多个segment组成,每个segment存着message信息
    Partition文件分segment管理,减少单个大文件太大的问题,并方便更快速定位message在哪个segment当中
    定位segment后,再根据segment对应的index索引信息和message log日志文件快速定位和读取具体message消息

  7. Producer
    负责发布消息到kafka broker上

  8. Consumer
    消费者,向kafka broker读取消息的客户端

  9. 发布publish与订阅subscribe
    发布消息,即为生产消息,将生产出来的消息加入MQ当中
    订阅消息,由消费者主动提前定义消息的topic,一单该topic当中的消息有新增,则会主动通过消费者线程,此时消费者线程进入消息的处理过程

  10. Consumer group
    每个consumer属于一个特定的sonsumer group[
    可以为每个consumer指定group name 若不指定 group name 则数据默认的group
    每个消费者组共享订阅的topic消息,topic中的每个消息只会被一个consumer消费,不同组的可以消费相同的topic

  11. Offset
    偏移量,位移,分区中的消息都有一个递增的id,称之为offset,他唯一标识了分区中的消息

  12. 消息系统一般语义说明
    三种语义定义(适用于生产者和消费者两大场景)
    最多1次(at most once) 消息可能丢失,但不会重复投递
    最少一次(at least once) 消息不会丢失,但可能会重复投递
    严格一次(exactly once): 消息不丢失,不重复,且只会被分发一次

在生产者场景中的语义剖析
最多一次:
1.producer产生数据后,有可能在写数据的时候不成功,只管写入,不去确认ack回应
2.此时broker就会跳过这个发送失败的消息,该条数据就会丢失,也最终导致consumer无法消费
最少一次

  1. producer产生数据后,已写入到kafka broker集群中
  2. 但是broker的网络异常,没有返回ack确定应答消息
  3. 此时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次”是指在没有极特殊情况发生的情况下满足该语义。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值