浅谈kafka

1. kafka介绍

kafka是一个分布式liushi流式处理平台,什么是流式处理平台呢,它有以下几个特点:

a. 类似消息系统,提供事件流的发布和订阅

b. 存储事件流数据的节点具有故障容错的特点,Kafka 会把消息持久化到磁盘,有效避免了消息丢失的⻛险

c. 能够对实时的事件流进行流式地处理和分析,提供了⼀个完整的流式处理类库

2. kafak如何实现这三个特点呢:

1. 消息系统 :主要有两种消息模型,队列和发布订阅; Kafka 使用消费组( consumer group )统一了这两种消息模型。
 
                       使用队列模型时,可以将处理工作平均分配给消费者组中的成员;
 
                       使用发布订阅时,可以将消息广播给多个消费者组,采用多个消费者组合多个消费者,既可以线性扩展消息的处理能力,也允许消息被多个消费组订阅。
 
2. 队列模式(也叫作点对点模式):多个消费者读取消息队列,每条消息只发送给 个消费者。
 
3. 发布-订阅模式(pub/sub):多个消费者订阅主题,主题的每条记录会发送给所有的消费者。
 
4. 存储系统:消息队列要做到 “发布消息” 和 “消费消息” 的解耦合,实际上都是在做存储系统的角色,而且支持持久化。 并且kafka支持阻塞式的发布消息,直到这条消息完全的复制到多个节点上,才认为消
 
                  息写入成功。

5.  流处理系统:Kafka流处理(KafkaStreams )为开发者提供了完整的流处理API ,比如流的聚合、连接、各种转换操作,处理乱序或迟来的数据、重新处理输入数据窗口和状态操作等
 
6.  将消息系统、存储存储、流处理系统组合在一起: Kafka将消息系统、存储系统、流处理系统组合,构成了以kafka为中心的流式数据处理平台。提供以下四种API
 
                 a.  生产者 producer:应用程序发布事件流到iJKafka 个或多个主题
                 b.  消费者 consumer:应用程序订阅Kafka的一个或多个主题,并处理事件流
                 c.  连接器 connector:将Kafka主题和已有数据源进行连接,数据可以互相导人和导出
                 d.  流处理 processor:Kafka主题消费输入流,经过处理后,产生输州流到输出主题

3. ProducerConsumerBrokerTopicPartition

      1. Producer(⽣产者) : 产⽣消息的⼀⽅。
 
      2. Consumer (消费者) : 消费消息的⼀⽅。
 
      3. Broker (代理) : 可以看作是⼀个独⽴的 Kafka 实例。多个 Kafka Broker 组成⼀个 Kafka Cluster。
           
           broker中包含了 topic(主题) 和 partition(分区) 两个概念:
             
               a.  生产者将消息发送给指定的主题,消费者通过订阅指定的主题来进行消费信息
         
               b.  分区属于主题的一部分,一个主题可以有多个分区,并且同一个主题可以跨越分布在多个broker,意味着分区也分布在多个 broker,这里的分区可以理解为消息队列中的队列。
 

4.  Replica kafak多副本

       Kafka 为分区(Partition)引⼊了多副本(Replica)机制,分区中的多个副本之间会有⼀个 leader,其他副本为 follower。消息会被发送到 leader 副本,然后 follower 副本从 leader 拉取消息进⾏同步。
 
并且生产者和消费者只与leader副本交互,其他副本只是leader的备份,当leader副本发生故障时,会从follower副本中选举新的leader(需具备选举条件:副本同步程度达到要求)
 
kafka的多副本保证了kafka消息的存储的安全性,但同时增加了存储消耗;多分区意味着消息可以分布在不同的broker上,提供了较好的并发能力。
 

5. Kafka 如何保证消息不丢失

           生产者在发送消息后,kafka提供了两种方式获取发送结果的api,一种是同步 sendResult.getRecordMetadata() ,

    另一种是异步方法 ListenableFuture<SendResult<String, Object>  future = kafkaTemplate.send(topic, obj); future.addCallback(..) ;

    另外可以设置发送失败的重试次数,retries 设置完成之后,当出现⽹络问题之后能够⾃动重试消息发送,避免消息丢失,并且设置重试时间间隔,保证短时间内不会快速的进行多次重试失败,导致最终发送

失败。

    哪种情况会丢失呢?    

         消息在被追加到分区时,会分配一个特定的偏移量offset,偏移量表示消费者消费到的分区的位置,kafka内部通过偏移量保证了消息的顺序。

        a.  而如果设置了消费后自动提交offset,那么当消费者刚拿到消息时,这时应用服务出现故障,消息并没有被真的消费掉,但offset自动提交了,这就会造成消息丢失。

            解决方案:手动提交offset,但这种方式会导致消费完成后尚未提交offset时,系统故障,当重新启动时,消息被二次消费。

        b.  我们已经直到kafka通过多副本保证消息的安全性,正是这种多副本的方式,有可能会导致消息丢失,原因是:消息在发送到leader副本后,follower副本尚未同步完成,leader所在的broker出现故障挂

掉了,这时follower副本重新选举一个leader对外提供服务,但是leader刚收到的消息没有被同步到这个副本,就造成了消息丢失。

           解决方案:设置 acks = all ,此处默认为1,即发送到leader时就成功,设置成all,意味着所有的副本同步完成才算成功。

                             设置 replication.factor >= 3 ,保证每个分区至少有三个副本,虽然造成数据冗余,但数据更加安全。

                             设置 min.insync.replicas > 1,代表消息至少被写入两个副本才算成功。默认值为1。

6如何保证消息不重复消费

      解决方案:业务幂等性,重复消费其实造成的结果是,业务被重复处理,所以消息不重复消费不是kafka来保证的,这是需要结合相关业务,考虑架构设计或者业务设计来控制的。

      例如:消费消息时存储消息唯一ID, 下次消费时校验ID,此处需结合实际情况,进行可靠设计,一般推荐redis存储,速度快

7. kafka为什么快呢?

      a. kafka使用顺序读写机制

          kafka的数据保存在磁盘上,但又保持了和内存处理一样的读取写入速度,原因是:因为硬盘的每次读写都会寻址,写入;寻址是一次机械操作,随机(I/O )读写非常耗时 ,但顺序 I/O 速度很快,没有

 耗时的寻址动作,所以kafka选择了顺序读写(I/O )。这是kafka分区消息采用文件尾加的原因。

      b. 基于MMFiles(mmap)内存映射文件的存储

          但是顺序写入,磁盘操作速度也远远小于内存操作,所以这里采用了操作系统的分页存储技术,利用内存来提高I/O效率;

          mmap即内存映射文件,在64位操作系统中表示了20G的数据文件,工作原理是利用操作系统的page实现文件到物理内存的直接映射,对物理内存的操作会同步到硬盘上(操作系统自己选择时机);

 通过mmap,读写硬盘就像读写内存(虚拟内存)一样速度很快;

         写到mmap的数据并没有被真的写到硬盘中,操作系统会在接收到flush命令时将数据写入到硬盘中,Kafka提供了一个参数 producer.type 来控制是不是flush,所以就有了异步刷盘和同步刷盘;

Kafka写入到mmap之后就立即flush然后再返回叫 同步 (sync);写入mmap之后立即返回不调用flush叫 异步 (async)。

      c. kafka在读取时做了优化,基于sendfile实现Zero Copy

          传统read/write方式进行网络文件传输的方式 : 硬盘—>内核buf—>用户buf—>socket相关缓冲区—>协议引擎  , 在这个过程当中,文件数据实际上是经过了四次copy

kafka 2.1版本内核引进的sendfile已经减少了内核缓冲区到user缓冲区,再由user缓冲区到socket相关缓冲区的文件copy。

 

.. 
 
 
 
 
 
 
 
 
 
 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值