为什么要了解这些名词的解释呢?因为在学一个新的知识或者领域的时候,我们需要知道它所定义的概念和名词意思,因为只有这样我们才能理解和掌握这个新的知识点,才能更加系统的掌握这个技术。

一.名词解释

 1.broker

Kafka单个节点称为broker,一个Kafka服务就是一个broker,多个broker可以组成一个Kafka集群.

 2.topic (主题)

 topic相当于传统消息系统MQ中的一个队列queue,producer端发送的message必须指定是发送到哪个topic上.在一个大型的应用系统中, 可以根据功能的不同,区分不同的topic(订单的topic,登录的topic,金额的topic等等)

 3. partition(分区)

一个topic下面可以有多个partition,kafka在接收到message后,会将这个message进行load blance根据(hash(message)%[broker_num])均匀的将这个message分配在不同的partition上。
partition的配置个数一般与kafka的集群数保持一致即可(即broker的数量)

   4.partition replica (分区副本)

partition replica 是partition 的副本数据,是为了防止数据丢失的一种优化,partition 不会和 replica 在同一台broker上。Replica 的数量与partition数量保持一致即可做到高可用

  5. Segment(片断)

partition 在物理结构上可以分为多个segment,每个segment 上存放着message信息

  6.producer

生产message,发送到topic上

  7.consumer

订阅指定的topic,消费topic上面的message信息

  8.Consumer group

多个consumer 可以组成一个consumer group

二.名词的作用解释

   1.partition 

kafka的message是1个key-value对的形式,或者只有topic 和value.当没有key的时候默认是null.大多数情况下都会分配1个key,这个key有2方面信息:1.元数据信息2.帮助partition分区,把这个key当成了路由,同一批数据写进一个partition上一个message 就是一个producer record(生产记录)对象,必须包含的有topic和value这2个参数,partition和key是可以不存在的所有的message是同一个key,将会被分配到同一个partition上当一个key为null的时候,它将会使用默认的partition,这个partition的作用是它会随机的把这个key所对应的producer record 放到其中的1个prtition中 尽量的使topic上的数据分布均匀,以防止数据倾斜如果显示的指定了一个key,那么这个partition它会根据这个key的hash值,再根据partition的数量取模,决定message存放到topic上的哪个partition中下面我们做个测试:当存入的message有key 和无key 时数据发送到partition的位置如何?

当存入的message有key存在时

/*** * @des        测试kafka partition 分区信息                              * @author  zhao* @date    2019年6月27日上午12:17:55**/
public class PartitionExample {private final static  Logger LOG = LoggerFactory.getLogger(PartitionExample.class);public static void main(String[] args) throws InterruptedException, ExecutionException {Properties properties = initProp();KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties);
        ProducerRecord<String, String> record = new ProducerRecord<String, String>("test_partition","appointKey","hello");   //指定key时Future<RecordMetadata> future = producer.send(record);RecordMetadata recordMetadata = future.get();LOG.info(">>>>>>>>>>>>>>>>>> {}",recordMetadata.partition());  record = new ProducerRecord<String, String>("test_partition","appointKey","world");future = producer.send(record); recordMetadata = future.get();LOG.info(">>>>>>>>>>>>>>>>>> {}",recordMetadata.partition());producer.flush();producer.close();System.out.println("====================================");}private static Properties initProp() {Properties prop = new Properties();prop.put("bootstrap.servers", "192.168.199.11:9092,192.168.199.12:9092,192.168.199.13:9092");prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");return prop;}
}

/从日志中可以看出是随机发送到partition上的

22:21:06.231 [main] INFO com.zpb.kafka.PartitionExample - >>>>>>>>>>>>>>>>>> 1

22:21:06.258 [main] INFO com.zpb.kafka.PartitionExample - >>>>>>>>>>>>>>>>>> 0

当存入的message无key存在时

/*** * @des        测试kafka partition 分区信息                              * @author  zhao* @date    2019年6月27日上午12:17:55**/
public class PartitionExample {private final static  Logger LOG = LoggerFactory.getLogger(PartitionExample.class);public static void main(String[] args) throws InterruptedException, ExecutionException {Properties properties = initProp();KafkaProducer<String, String> producer = new KafkaProducer<String, String>(properties);
        ProducerRecord<String, String> record = new ProducerRecord<String, String>("test_partition", "hello");  Future<RecordMetadata> future = producer.send(record);RecordMetadata recordMetadata = future.get();LOG.info(">>>>>>>>>>>>>>>>>> {}",recordMetadata.partition());record = new ProducerRecord<String, String>("test_partition","world"); future = producer.send(record); recordMetadata = future.get();LOG.info(">>>>>>>>>>>>>>>>>> {}",recordMetadata.partition());producer.flush();producer.close();System.out.println("====================================");}private static Properties initProp() {Properties prop = new Properties();prop.put("bootstrap.servers", "192.168.199.11:9092,192.168.199.12:9092,192.168.199.13:9092");prop.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");prop.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");return prop;}
}

//从日志中可以看出发送到了同一个partition中

22:29:29.963 [main] INFO com.zpb.kafka.PartitionExample - >>>>>>>>>>>>>>>>>> 2

22:29:29.969 [main] INFO com.zpb.kafka.PartitionExample - >>>>>>>>>>>>>>>>>> 2

通过以上测试得出:  当一个key或者一批key映射同一partition时,所有的partition都要计算映射关系,不一定指的是可用的partition,因为在多个partition中,当某个partition挂掉时,也要参加到计算中,这就意味着,当你写数据时,如果是发送到了这个挂掉的partition上时,会发送失败
在一个conusmer group里面只有一个consumer client 读其中的一个partition,不可能存在多个group里面多个consumer读同一个partition 

转载于:https://www.cnblogs.com/MrRightZhao/p/11094707.html

kafka 名词解释及原理解析过程(三)相关推荐

  1. java_security之base64原理解析以及三种代码的实现方式

    一. Base64编码由来 为什么会有Base64编码呢?因为有些网络传送渠道并不支持所有的字节,例如传统的邮件只支持可见字符的传送,像ASCII码的控制字符就 不能通过邮件传送.这样用途就受到了很大 ...

  2. Kafka Streams流式原理解析

    前言 本篇文章会从Kafka的核心流式计算原理进行分析,Kafka Streams Low-level processor API 和 核心概念,以及常见的应用场景分析 流式计算 通过业务场景去分析流 ...

  3. vector 不初始化时什么状态_Vue原理解析(三):初始化时created之前做了什么?...

    让我们继续this._init()的初始化之旅,接下来又会执行这样的三个初始化方法: initInjections(vm) initState(vm) initProvide(vm) 5. initI ...

  4. LTE系统名词解释及上下行过程

    学习<深入理解LTE-A>笔记 UE:用户 eNodeB(eNB):书中指代与用户链接的基站 基础名词 PLMN:运营商 PSS:Primary Synchronization Signa ...

  5. DNS原理/解析过程

    DNS协议属于应用层 , 使用UDP协议传输( 服务器之间的备份使用TCP ) , 作用在于 将域名映射为IP地址 第一步,浏览器缓存 当用户在浏览器输入 www.baidu.com时 , 浏览器会先 ...

  6. Java类加载原理解析(转)

    1       基本信息 摘要: 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加 ...

  7. Java类加载原理解析

    Java类加载原理解析 基本信息摘要: 每个java开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java ...

  8. 消息系统kafka原理解析

    Kakfa起初是由LinkedIn公司开发的一个分布式的消息系统,后成为Apache的一部分,它使用Scala编写,以可水平扩展和高吞吐率而被广泛使用.目前越来越多的开源分布式处理系统如Clouder ...

  9. DNS原理及解析过程详解

    目录 1 域名系统概述 2 因特网的域名结构 3 域名服务器 4 域名的解析原理过程 4.1 DNS解析原理 4.2 域名解析过程 5 查询过程 5.1 演示整个查询过程 5.2 关于DNS解析的TT ...

最新文章

  1. Silverlight+WCF 新手实例 象棋 棋盘(二)
  2. 3.6 迁移故障恢复
  3. HDU 5734 Acperience (公式推导) 2016杭电多校联合第二场
  4. 服务器邮箱群发,独立IP独立账号日发万封的邮件群发服务器
  5. 英文投稿成功接收的经验
  6. 清北学堂模拟赛d6t3 反击数
  7. 使用Visio Viewer载入数据库中的Visio图
  8. delphi刷新界面所选行丢失问题
  9. sqlite3学习笔记-方法介绍和测试代码
  10. ffmpeg打开音频设备
  11. 中国光伏产业将面临何种形势?
  12. python如何读取csv文件中的某一张表_python 读取csv文件中某一段月份中的数据?...
  13. AC敏捷控制器及准入控制技术对比
  14. mysql数据完整性实验报告,数据库原理实验报告(Mysql)
  15. 电脑打不开计算机设备管理,如何解决 设备管理器打不开的问题 设备管理器打不开怎么解决...
  16. 经典问题:数据有误,一定要重传吗?
  17. 想利用业余时间学习计算机知识,但是不想学习编程该怎么学习
  18. sap进阶系列(16):第一篇:财务总览之全面预算管理
  19. bp神经网络是什么网络,神经网络和bp神经网络
  20. 【前端 HTML+CSS+JavaScript(JS)】DOM练习-checkbox实现全选 带注释/总结

热门文章

  1. helm3添加harbor仓库:带鉴权--username --password
  2. Go的GAPATH详解
  3. Python爬虫基础:简单的爬虫入门示例(urllib库)
  4. Python Django 原生SQL查询(游标Cursor)
  5. Elasticsearch的智能判断:动态添加数据映射
  6. MySQL自定义变量的使用
  7. idea设置启动时打开欢迎页
  8. linux 句柄_linux 文件句柄数查看命令
  9. 快速了解 UML 类图
  10. Qt for Android 动态申请权限