【kafka介绍,应用场景及注意事项】

文章目录

  • 前言
  • 一、kafka是什么?
  • 二、基础知识
    • 核心概念
  • 三、面试问题
    • kafka中的消息是否会丢失和重复消费
      • 消息发送
      • 消息消费
    • kafka为什么那么快
    • 消费者提交offset提交的是当前消息的offset还是offset+1
  • 四、kafka使用场景
  • 总结


前言

介绍一些kafka入门知识,及面试常见问题。


一、kafka是什么?

kafka是开源的分布式发布-订阅消息系统,最初由LinkedIn公司开发,后来成为apache项目的一部分,是一个分布式,可划分的,冗余备份的持久性的日志服务,主要处理流式数据。
为了解决消息间通信繁忙诞生,有解耦,异步,消峰的作用,可以理解是一个消息中间件(消息队列),发送方发送消息时,不直接发送接收方,先发送到中间件,接收方通过中间件获取。消费者通过topic主题得到想要的数据,生产者将不同主题的数据发布到中间件,在主题下有分区,分区可以分布在不同的服务器上,生产者将数据存储在主题的不同分区里,生产者产生的数据具体存储到哪里有两种模式,1、通过生产者指定分区,2、一个分区器算法,通过消息的键即一个标记来安排存储空间。所以一个消息抽象点理解带有主题、分区、键、值四个属性。消费者通过偏移量(offset)读取数据,即第几个,一个分区里,每个消息唯一,读取只能顺序读。borker里包含主题,分区,一个borker挂掉后其他borker可以顶替,保证了消息安全性。

二、基础知识

核心概念

  • producer 消息的生产者

  • broker 服务器(多个broker构成kafka集群)

  • topic 主题(消息的不同分类)

  • partition 分区(分布在多台机器上的broker中)

  • consumer group 消费者组,可以并行消费topic中的partition消息

  • customer 消息的消费者

  • offset 偏移量,第几个的意思,一个分区里,每个消息的偏移量是唯一的,消费者只能顺序读取。
    ISR、AR、OSR
    ISR 副本同步队列 AR 所有副本 OSR Out-of-Sync Replied 不同步应答 AR = ISR + OSR

  • QPS: Queries Per Second,意思是“每秒查询率”,是一台服务器每秒能够响应的查询次数

  • TPS:Transactions Per Second,意思是每秒事务数
    如果是对一个接口(单场景)压测,且这个接口内部不会再去请求其它接口,那么tps=qps,否则,tps≠qps

消息通过主题、分区、键、值决定去往哪个具体的分区。

分区消息分配规则:平均分配,多余的partition,有偶遇的进行从前往后平均分配。
零拷贝:用户态,内核态,磁盘
原:磁盘->内核buffer->application buffer->socket 内核buffer->网卡
kafka:磁盘->内核buffer->socket 内核buffer ->网卡


三、面试问题

按照面试频率顺序排列

kafka中的消息是否会丢失和重复消费

确定kafka消息丢失和重复,从消息发送和消息消费两个方面分析

消息发送

kafka消息发送有两种方式:同步sync和异步async,默认是同步方式,可通过producer.type属性进行配置,kafka通过配置requeset.required.acks属性来确认消息的生产

  • 0 不进行消息接受和确认成功
  • 1 当leader接受成功时确认
  • -1 leader和follower都接受成功时确认
    综上,有6中消息生产的情况,两种同步*三种方式=6
  • acks=0,不和kafka集群进行消息接受确认,当网络异常,缓冲区满了等情况时,消息可能丢失
  • acks=1 同步模式下,只有leader确认接受成功后,但挂掉了,副本没有同步,数据可能丢失

消息消费

kafka消息消费有两个consumer接口,low-level api和high-leve api

  • low-level api 消费者自己维护offset等值,可以实现对kafka的完全控制
  • high-level api 封装了对parition和offset的管理,使用简单
    如果使用了高级接口high-level pai,当消息消费者从集群中把消息取出来,并提交了新的消息offset后,还没来得及消费就挂掉,那么下次再消费时,之前没消费成功的消息就诡异消失了。
    解决办法:
    针对消息丢失:
    同步模式下,确认机制设置为-1,让消息写入leader和follower之后再确认消息发送成功,
    异步模式下,为防止缓冲区满,可以在配置文件设置不限制阻塞超时时间,当缓冲区满时让生产者一直处于阻塞状态。
    针对消息重复,将消息的唯一标识保存到外部介质中,每次消息时判断是否处理过即可。

kafka为什么那么快

顺序写,磁盘顺序写比随机写要快,寻址过程消耗时间减少
零拷贝技术
批量处理合并小请求,然后以流的方式进行交互
pull 拉模式,使用拉模式进行消息的获取,与消费端处理能力相符

消费者提交offset提交的是当前消息的offset还是offset+1

offset+1

四、kafka使用场景

kafka使用目的为了异步、消峰、解耦
解耦体现在各个业务方通过topic各自消费
消峰体现在即使有大批量的消息调用不会使系统受到影响,流量由消息队列承载
异步体现在吞吐量大幅度提高,未做真正的实际调用,接口RT(响应时间)会非常低。
例子:
报表系统统计各个商户的业绩,引入kafka,每个用户下单后,推送至kafak,消费者根据消息异步处理数据,将每条数据累加到每个商户的每天的每小时统计数据上。查询时不需要查询所有数据。

总结

以上就是今天要讲的kafka知识,有时还会碰到顺序读写的问题,解决思路其实和其他消息队列,或者批量处理数据思路一样,可以根据业务订单流水号进行取模分片,分片的数据不要有关联性,可以提高消费能力。

你可能感兴趣的:(面试,高并发,kafka)