《Kafka权威指南》读书笔记3 Kafka生产者
日常业务开发很重要、很常用的一章
提纲:如何使用Kafka生产者;如何创建KafkaProducer、ProducerRecords;如何将记录发给Kafka;如何处理从Kafka返回的错误;一些配置项;不同的分区方法、序列化器,以及它们的自定义。
Kafka提供了生产者的API。
ProducerRecord → 序列化器→分区器 → 批次→发送→broker→broker响应
【3.2 创建Kafka生产者】
bootstrap.servers
连接的broker地址,格式 host:port,多个用英文逗号分隔。只要配一个broker,生产者就能根据这个线索找到其他broker。建议至少配俩,搞个备用。
key.serializer
前面说过,broker接受的键值都是字节数组,所以java对象要转换。
value.serializer
值的序列化,必须要指定序列化器
【ProducerRecord 】含义: 发送给Kafka Broker的key/value 值对;
这玩意儿就是被发的消息全貌,叫生产者记录
内部数据结构:
-- Topic (名字)
-- PartitionID ( 可选)
-- Key( 可选 )
-- Value
生产者记录(简称PR)的发送逻辑:
<1> 若指定Partition ID,则PR被发送至指定Partition
<2> 若未指定Partition ID,但指定了Key, PR会按照hasy(key)发送至对应Partition
<3> 若既未指定Partition ID也没指定Key,PR会按照round-robin模式发送到每个Partition
<4> 若同时指定了Partition ID和Key, PR只会发送到指定的Partition (Key不起作用,代码逻辑决定)
生产者记录(PR)的实现:
针对发送逻辑,提供三种构造函数形参:
-- ProducerRecord(topic, partition, key, value)
-- ProducerRecord(topic, key, value)
-- ProducerRecord(topic, value)
【发送消息 3种方式】
发送并忘记
—— 只管发,不管到了没有
同步发送
—— send()以后,返回一个Future对象,用get()等待返回的RecordMetadata()对象,对象里有offset;若返回不允许重试的异常or超过重试次数,就会抛异常。
比如无主no leader异常可以通过为分区选首领解决,所以是可重试异常;
连接异常,通过重新再次建立连接解决,是可重试异常;
消息过大,不重试
异步发送
—— send(),指定一个回调函数,服务器响应时调用这个函数;
发消息更快,
注意看第4点,send()的时候,传了一个回调的对象
【3.4 生产者的配置】
从第37页开始,写了12个配置项,用到的时候再看
【3.5 序列化器】
Kafka提供了默认的字符串、整型、字节数组的序列化器,
【3.5.1 自定义序列化器】——不建议使用
这里说怎么自定义开发序列化器。
讲道理,序列化器,这个词儿真拗口。
有几个序列化框架,Avro(强烈推荐)、Thrift、Protobuf、或自定义。
自定义的话,就比如,把入参模型的A字段序列化成4字节整数、B字段序列化成4字节整数……
如果模型变更,序列化方法就得重写。
【3.5.2 使用Avro序列化】
Apache Avro,一种与编程语言无关的序列化格式。数据被序列化成二进制文件(常用)/JSON文件。他的scheme通过JSON来描述。
后面没看懂。
【3.6 分区】
没有指定key的时候,消息会被随机的发到topic的各个分区上。分区器来干这个活,它用轮询Round Robin算法将消息均衡的各个分区上。
指定key的时候,且使用默认分区器,Kafka会对key进行散列,用的是Kafka自己的散列算法,所以不受Java版本的影响。然后把消息映射到特定分区,同一个key总是被映射到同一个分区上。
获取的是所有的分区,不只是可用的分区,所以如果有的分区挂了,就会发生错误。
分区数量不变时,key和partition之间的映射就不变。如果分区增加了,可能用户0123的旧数据在分区34,新记录写到分区99了。
可以搞自定义分区策略,比如把key为Banana的消息固定写入最后个分区。我当前没有看到这样使用的场景。
《Kafka权威指南》读书笔记3 Kafka生产者相关推荐
- mysql数据库权威指南_MySQL_MySQL权威指南读书笔记(三),第二章:MYSQL数据库里面的数 - phpStudy...
MySQL权威指南读书笔记(三) 第二章:MYSQL数据库里面的数据 用想用好MYSQL,就必须透彻理解MYSQL是如何看待和处理数据的.本章主要讨论了两个问题:一是SQL所能处理的数据值的类型:二是 ...
- MongoDB权威指南读书笔记——CRUD
插入并保存文档 插入是向MongoDB中添加数据的基本方法.可以使用Insert方法向目标集合插入一个文档:db.foo.insert({"bar" : "baz&quo ...
- HTTP权威指南读书笔记
<<HTTP权威指南>>读书笔记 第一部分:Web的基础 第1章:HTTP概述 主要内容 1.什么是HTTP 2.HTTP的基本组件 HTTP HTTP:HTTP(Hypert ...
- HTML5权威指南----读书笔记
<!DOCTYPE html> <html> <head><meta name = 'keywords' content="HTML5权威指南--- ...
- 初识Kafka-概念速览|安装与配置—《Kafka权威指南》笔记
文章目录 初识Kafka 消息 批次 模式 主题与分区 生产者和消费者 broker和集群 保留消息 多集群 Kafka数据生态 安装与配置 安装 Java 安装 Zookeeper Zookeepe ...
- 计算机网络和http权威指南 读书笔记
计算机网络笔记 网络层 网络层向上提供无连接的,尽最大努力交付的数据报服务 网络层不提供数据质量承诺 物理层使用的中间设备叫转发器repeater 数据链路层叫网桥bridge 网络层叫路由器rout ...
- MapReduce总结 + 相关Hadoop权威指南读书笔记(未完......欢迎补充,互相学习)
文章目录 MapReduce概述 MapReduce优缺点 MapReduce核心思想 MapReduce进程 MapReduce编程规范 WordCount 案例实操 本地测试 集群测试 Hadoo ...
- 《kafka权威指南》之深入Kafka
文章目录 集群节点 节点ID 控制器 复制 处理请求 物理存储 分区分配 文件管理 文件格式 索引 清理日志 删除消息 Kafka 如何进行复制 Kafka 如何处理来自生产者和消费者的请求 Kafk ...
- android开发读书笔记,android开发权威指南读书笔记
第17章 Fragment 1.在res目录下增加 layout-sw600dp 目录,用于存放7英寸及以上尺寸屏幕的布局文件.10英寸以上平板用 sw720dp.如果是更小的屏幕,如 480*800 ...
- java性能权威指南中文_Java性能权威指南读书笔记--之一
JIT(即时编译) 解释型代码:程序可移植,相同的代码在任何有适当解释器的机器上,都能运行,但是速度慢. 编译型代码:速度快,电视不同CPU平台的代码无法兼容. java则是使用java的编译器先将其 ...
最新文章
- SAP RETAIL 商品主数据POS视图
- 计算机网络ip地址的分类
- 为什么 M1 和 Mac 是绝配?
- mysql查看存储过程工作记录20130711
- 《Groovy语言规范》-语法(三)
- 利用公众号 + WeRoBot开发一款AI应用
- 使用java将字符串写入到指定的文件中
- Scala程序将字符串转换为整数
- ubuntu下面如何切换virtual_box的鼠标
- [动态规划] leetcode 10 正则表达式匹配
- Python Imaging Library: ImageMath Module(图像数学运算模块)
- 清理300多台MySQL数据库的过期binlog日志
- java 根据身份证计算年龄(周岁)
- 饥荒联机一直显示正在启动服务器,饥荒联机版启动服务器时间长 | 手游网游页游攻略大全...
- antd4.0中Form使用initialValue
- javascript-异步之Promise then和catch
- 打开我的收藏夹 -- Python时间序列分析篇
- matlab导弹追踪,导弹追踪代码
- 拉格朗日乘数法 和 KTT条件
- 黑客急于利用微软的零日漏洞
热门文章
- SQL SERVER添加表注释、字段注释
- 联想笔记本启动u盘linux系统下载,制作linux启动u盘(rufus)
- [32位汇编系列]004 - 对话框资源的使用(2)
- Python 调用中控门禁并包装成webservice供移动设备调用。
- 【Unity开发笔记】导入大地图
- Ubuntu16.04 开机出现检测到系统程序出现问题
- 计算机管理员工作内容,系统管理员岗位工作职责
- 高清加载巨图方案-拒绝压缩图片
- 陈力:传智播客古代 珍宝币 泡泡龙游戏开发第42讲:PHP数据库开发案例
- 基于php的网上鲜花销售系统论文,网上鲜花销售系统 毕业设计论文