kafka原理简介

kafka:高吞吐量分布式发布订阅式消息队列

kafka构架组件:

topic:消息存放的目录即主题

producer:生产消息到topic的一方

consumer:订阅topic消费消息的一方

broker:kafka的服务实例就是一个broker

在这里插入图片描述

存储机制在这里插入图片描述

kafka用topic对消息进行归类,每一个topic可以分为多个分区,分区中的消息不重复,每个分区又有很多个segment(段),segment是在磁盘上的一对文件,包含index和log文件,两种文件名相同后缀不同,每个topic的第一个segment的两种文件都是00000000000000000000.index和00000000000000000000.log,后面新产生的文件名都要以上一个segment中最后一条消息的offset(偏移量)结束。

kafka数据被消费后虽然不会被立即删除,但也不会一直保存,kafka根据两个设置定时检测做删除操作:

  1. 基于时间:log.retention.hours=168
  2. 基于大小:log.retention.bytes=1073741824

​满足任何一个都会删除之前的segment,记住不是删除某一个消息,删除的最小单位是segment。

AR 、ISR 、OSR概念

  • 分区中的所有副本统称为AR(Assigned Replicas)。
  • 所有与leader副本保持一定程度同步的副本(包括leader副本在内)组成ISR(In-Sync Replicas),ISR集合是AR集合中的一个子集。
  • 与leader副本同步滞后过多的副本(不包括leader副本)组成OSR(Out-of-Sync Replicas)

消息会先发送到leader副本,然后follower副本才能从leader副本中拉取消息进行同步,同步期间内follower副本相对于leader副本而言会有一定程度的滞后。前面所说的“一定程度的同步”是指可忍受的滞后范围,这个范围可以通过参数进行配置。,由此可见,AR=ISR+OSR。在正常情况下,所有的 follower 副本都应该与 leader 副本保持一定程度的同步,即 AR=ISR,OSR集合为空.

写流程

在这里插入图片描述
步骤
1.producer连接Zookeeper集群,从ZK中拿到对应topic的partition信息和partition的Leader的相关信息。

2.连接到对应Leader的broker。

3.将消息发送到partition的Leader上。

4.其他Follower从Leader上复制数据。

5.以此返回ACK(acknowledge,确认字符)。

6.直到所有ISR中的数据写完,才完成提交,整个写流程结束。

读流程

步骤
1.consumer连接Zookeeper集群,从ZK中拿到对应的topic的partition信息和partition的Leader的相关信息。

2.连接到对应Leader对应的broker。

3.consumer将自己保存的offset发送给Leader。

4.Leader根据offset等信息定位到segment(索引文件和日志文件)。

5.根据索引文件中的内容,定位到日志文件中该偏移量对应的开始位置读取相应长度的数据并返回给consumer。

kafka特性:

高吞吐量、低延迟:kafka每秒可以处理几十万条消息,延迟最低只有几毫秒。

可扩展性:kafka集群支持热扩展。

持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份,防止数据丢失。

容错性:允许集群中节点失败(最少有个副本本节点是好的)。

高并发:支持数千个客户端同时读写。

应用场景:

1、日志收集:收集各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer。

2、消息系统:解耦和生产者和消费者、缓存消息

3、用户活动跟踪:记录用户的各种活动。

4、运营指标:记录运营监控数据。包括收集各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告。

5、流式处理数据源:比如spark streaming和strom。

使用kafka实现数据消息的最多消费一次, 最少消费一次,甚至是精确消费一次?

最多消费一次:数据处理前保存偏移量
最少消费一次:数据处理后保存偏移量
精确消费一次:手动维护偏移量,放到一个事务中保证原子性(偏移量存mysql)

kafka的ACK机制
producer的消息发送确认机制,这直接影响到Kafka集群的吞吐量和消息可靠性。
ack有3个可选值,分别是1,0,-1。

ack=1:默认值,producer只要收到一个分区副本成功写入的通知,就认为推送消息成功。这个副本必须是leader副本。

ack=0:producer发送一次就不再发送,不管发送是否成功。

ack=-1:producer收到分区内所有副本的成功写入的通知才认为推送消息成功了。

注:ack参数是字符串类型,而不是整数

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值