kafka producer发送消息的时候,可以指定key,这个key的作用是为消息选择存储分区,key可以为空,当指定key且不为空的时候,kafka是根据key的hash值与分区数取模来决定数据存储到那个分区,那么当key为null的时候,kafka又是如何存储的呢?可能很多人都会说随机选择一个分区进行存储,但是具体是怎么实现的呢?虽然可以这么说,但是还不够严谨,下面通过kafka的源码来解读下key=null是怎么存储的:

从上面源码可以看出,当key=null时,kafka是先从缓存中取分区号,然后判断缓存的值是否为空,如果不为空,就将消息存到这个分区,否则重新计算要存储的分区,并将分区号缓存起来,供下次使用。

那么这个缓存时间是由什么决定呢,再来看下源码:

从上面源码可以看出,kafka定义了一个全局变量,这个变量值是配置参数中的topic.metadata.refresh.interval.ms设置的值,也就是说在这个时间内,key=null的消息都会往缓存起来的这个分区存储,当时缓存过时之后,就会重新计算分区号,将计算结果缓存起来。也就是说在key为null的情况下,Kafka并不是每条消息都随机选择一个Partition;而是每隔topic.metadata.refresh.interval.ms才会随机选择一次!

sarama指定key代码:

关于key和分区

在创建消息时既可以指定key也可以不指定。Key除了可以保存额外的信息之外,还用于决定消息将会写入哪个分区,也就是说具有相同key的消息都会保存在同一分区。

当key为空且使用默认的分区器时,消息会被随机发送到指定topic的其中一个可用分区,会使用round-robin算法均衡分区间的消息。

当key不为空且使用默认的分区器时,Kafka会计算该key的hash值(使用其自己的hash算法,因此当升级Java版本时hash值不会改变),并使用得到的hash值把消息映射到特定的分区。因为把一个key始终映射到同一分区是非常重要的,所以需要使用一个topic的所有分区来计算映射关系,而不仅仅是可用的分区。这意味着,如果当写入消息到一个不可用的分区时,会出现异常,但是这种情况很少见。

只要一个topic的分区数量不变,key与分区的映射关系就能保证一致。但是如果你添加一个新的分区到一个topic时,虽然存在的数据仍然会保存在原来的分区里,但具有相同key的新消息不能保证还会写入到原来的分区。所以在创建topic时最好预先定义好需要的分区数量,避免后期添加新的分区造成映射关系的不一致。

kafka的key为null时如何存储相关推荐

  1. KV结构的集合,在处理null值的存储上有细微的区别,下列哪些说法是正确的

    单选 KV结构的集合,在处理null值的存储上有细微的区别,下列哪些说法是正确的:答案在文末 A. TreeMap的key不可以为null B. TreeMap的key可以为null C. Concu ...

  2. Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的

    多选 Hashtable,HashMap,ConcurrentHashMap都是Map的实现类,它们在处理null值的存储上有细微的区别,下列哪些说法是正确的:答案在文末 A. Hashtable的K ...

  3. HashMap的key为Integer时为什么有序

    首先我们知道,HashMap遍历的顺序和插入的顺序是不一样的,而LinkedHashMap遍历的顺序和插入的顺序是一致的.看代码 import java.util.HashMap; import ja ...

  4. 「SAP技术」SAP MM 批次管理的物料创建DN时无存储地点就不能输入批次值?

    「SAP技术」SAP MM 批次管理的物料创建DN时无存储地点就不能输入批次值? 1, 如下交货单80018169(SO#10002993),行项目里storage location为空,batch字 ...

  5. python可变参数的特点_可变参数**kwargs传入函数时的存储方式为( )_学小易找答案...

    [单选题]抗结核药联合用药的目的是: [单选题]女性,50岁,患耐青霉素的金葡菌性心内膜炎,青霉素试敏阴性,既往有慢性肾盂肾炎,应选用: [填空题]固态下原子(或分子)呈( )排列而形成的聚集状态,称 ...

  6. Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?

    如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...

  7. 支付宝 报错 rsa_private read error : private key is NULL解决方法

    原因:  真机调试IOS支付宝功能GDB出现 rsa_private read error : private key is NULL提示 调试iOS 支付宝SDK的时候,执行demo.把 Partn ...

  8. MySQL中处理Null时要注意两大陷阱

    MySQL中处理Null时要注意两大陷阱 摘要:作为MySQL数据库管理员,我们经常要与Null做斗争.但是在这其中,你需要注意一下两大陷阱. MySQL数据库是一个基于结构化数据的开源数据库.SQL ...

  9. sql求和出现null时赋值为0

    今天在实现签到功能的时候,测试用了没有签到过的用户id,所以在查询总积分的过程中出现了积分为空值的异常,进过修改,将其签到积分的空值改为0值然后再存入Model中程序正常运行. sql求和出现null ...

最新文章

  1. LintCode 用递归打印数字
  2. python获取url文件名_python httplib / urllib获取文件名
  3. omnicppcomplete php,VIM 常用法 (三)
  4. Asterisk标准通道变量
  5. Python《爬取各种帅哥图片》
  6. 个人计算机的缩写英语,计算机中常用的英语缩写
  7. oracle完全卸载重装历程
  8. Eclipse------新建文件时没有JSP File解决方法
  9. AngularJS 开发辅助工具
  10. 通过ssh证书远程登录
  11. 美国数据科学家:重视非结构化数据分析 走出两大“经典”误区
  12. hdu5414(2015多校10)--CRB and String(字符串匹配)
  13. 【优化算法】大鼠群优化器算法(RSO)【含Matlab源码 1837期】
  14. Proteus8.9 仿真数码管 闪退问题及其解决方法
  15. C3:Unity3D制作智能家居设计软件——绘制户型(二)
  16. C++ 使用sqrt函数计算平方根
  17. nodejs中文件上传并限制图片大小
  18. javaweb的校园快递管理系统
  19. Pygame从0实战10(泡泡小游戏添加音效)
  20. 还在为写调查问卷发愁的你赶快来看看这个自动填写问卷(问卷星版)

热门文章

  1. Segments POJ 3304 直线与线段是否相交
  2. 百思不得姐第4天:文本框占位文字颜色
  3. FMS3 服务器集群虚拟服务器配置入门
  4. 织梦wap.php绑定域名,dedecms织梦cms 手机站移动端 绑定设置独立M或wap域名的方法...
  5. php判断数组是否存在字符串中,php判断数组元素中是否存在某个字符串的方法_php技巧...
  6. [渗透攻防] 一.从数据库原理学习网络攻防及防止SQL注入
  7. Masm for Windows集成开发环境编写汇编程序
  8. LeetCode Algorithm 1925. 统计平方和三元组的数目
  9. 974. Subarray Sums Divisible by K
  10. PAT (Basic Level) Practice (中文)1001 害死人不偿命的(3n+1)猜想 (15 分)