zoukankan      html  css  js  c++  java
  • Kafka系列二 kafka相关问题理解

    1、kafka是什么

      类JMS消息队列,结合JMS中的两种模式,可以有多个消费者主动拉取数据,在JMS中只有点对点模式才有消费者主动拉取数据。 kafka是一个生产-消费模型。
      producer:生产者,只负责数据生产,生产者的代码可以集成到任何系统中。数据的分发策略由producer决定,默认是Defaultpartition Utils.abs(key.hashCode)%numPartitions.
      Broker;当前服务器上的kafka进程,俗称拉皮条。只管数据存储,不管是谁消费。在集群中每个broker都有一个唯一的brokerid,不得重复。
      Topic:目标发送的目的地,这是一个逻辑上的概念,落到磁盘上是一个Partition的目录。partition的目录中有多个segment组合(index,log)
          一个Topic对应多个partition[0,1,2,3],一个Partition对应多个segment组合。一个segment有默认的大小是1G。
          每个Partition可以设置多个副本,会从所有的副本中选取一个leader出来。所有读写操作都是通过leader来进行的。特别强调,和mysql中主从有区别,mysql做主从是为了读写分离,在kafka中读写操作都是leader。
      Consumer:数据消费者,Consumer可以有多个,每个consumer消费的数据都是一样的。
      ConsumerGroup;可以把多个consumer线程划分为一个组,组里面所有成员共同消费一个topic的数据,组员之间不能重复消息。

    2、kafka生产数据时的分组策略

      默认是Defaultpartition Utils.abs(key.hashCode)%numPartitions.
      上文中的key是producer在发送数据时传入的,producer.send(KeyMessage(topic,mypartitionKey,messageContent))

    3、Kafka如何保证数据的完全生产?

      ack机制:broker表示发来的数据已确认接收无误,表示数据已经保存到磁盘。
          0 :不等待broker返回确认信息。
          1 :等待topic中某个partition leader保存成功的状态反馈。
          -1:等待topic中某个partiton 所有副本都保存成功的状态反馈

    4、broker如何保存数据?

      在理论环境下,broker按照顺序读写的机制,可以每秒保存600M的数据。主要通过pagecache机制,尽可能的利用当前物理机器上的空闲内存来做缓存。当前topic所属的broker,必定有一个该topic的partition,partition是一个磁盘目录。partition的目录中有多个segment组合(index,log)

    5、partition如何分布在不同的broker上。

    list(kafka01,kafka02,kafka03)//broker列表
    int partitions=4;//partitions个数
    for(int i=0;i<partitions;i++){
    brIndex=i%broker;
    hostname=list.get(brIndex)
    }

    6、consumerGroup的组员和partition之间如何做负载均衡?

      最好是一一对应,一个partition对应一个consumer。如果consumer的数量过多,必然有空闲的consumer

      算法:
      假如topic1,具有如下partitions: P0,P1,P2,P3
      加入group中,有如下consumer: C1,C2
      首先根据partition索引号对partitions排序: P0,P1,P2,P3
      根据consumer.id排序: C0,C1
      计算倍数: M = [P0,P1,P2,P3].size / [C0,C1].size,本例值M=2(向上取整)
      然后依次分配partitions: C0 = [P0,P1],C1=[P2,P3],即Ci = [P(i * M),P((i + 1) * M -1)]

    7、如何保证kafka消费者消费数据是全局有序的?

      伪命题
      如果要保证消费有序,必须保证生产有序,存储有序,消费有序。
      由于生产可以做集群,存储可以分片,消费可以设置为一个consumerGroup,就需要全局全局有序,就需要保证每个环节都有序。
      只有一个可能,就是一个生产者,一个partition,一个消费者。这种场景和大数据应用相悖。

  • 相关阅读:
    文本比较算法Ⅴ——回顾贴,对前面几篇文章的回顾与质疑
    键盘监控的实现Ⅱ——容易产生误解的CallNextHookEx函数
    利用WPF建立自适应窗口大小布局的WinForm窗口
    计算机中的颜色XIII——颜色转换的快速计算公式
    键盘监控的实现Ⅲ——按键消息的修改(映射)
    计算机中的颜色XI——从色相值到纯色的快速计算(新的公式)
    Dot Net中InputLanguage对象的使用限制
    计算机中的颜色XII——快速计算纯色的色相值(新的公式)
    关于房产中介网的设计随想
    java笔记:熟练掌握线程技术基础篇之解决资源共享的问题(中)前篇
  • 原文地址:https://www.cnblogs.com/zhaobingqing/p/8577262.html
Copyright © 2011-2022 走看看