kafka学习笔记03-消息生产者producer
kafka学习笔记03-消息生产者producer
发送消息整体流程示意图
消息发送的流程示意图:

(From:High-level overview of Kafka producer components – Kafka the Definitive Guide Book , 中文书名:kafka权威指南)
一条消息写入 kafka,构造这条消息结构名称叫 ProduceRecord,ProduceRecord 的结构如上图。
大致流程说明:
- 先找到 kafka 集群的 bootstrap server,一般推荐一个kafka集群最少设置 2 个bootstrap server
- 找到一些发送数据需要的元信息,如 topics,partitions,replica-factor 等等信息
- 然后找到 broker 中的 leader topic ,把消息写入到 topic 中的 partiton 里
当然,这当中还有消息的序列化(serializer),分区器(partitioner)对数据的分区分配等步骤。
数据分区分配机制-数据负载均衡
生产者的数据主要发送到 topic 的分区(partition)里,一个 topic 可以有多个分区,同一个topic下的不同分区存储的消息不同,那怎么确定消息发送到哪一个分区partition?
这就需要一种算法来确定数据发送到哪个分区(partition)。
也就是将数据进行均匀分布,分配算法分配数据时不要导致某一个partition数据分配太多,而某一个分区数据又太少。
怎么做到生产数据的负载均衡,kafka 里的 partitioner (分区器)来负责客户端生产层面的负载均衡。
如果提供 key 值
partitioner 会根据 key 的哈希值(采用Murmur2Hash算法)对 partition 数量取模,根据该值决定把消息发送到哪个 partition 上,(hash(key) mod numpartitons)。如果没有提供 key 值
key 为 空(null,无值)时,kafka 2.4 之前有一种策略,轮询算法, 2. 4 之后,又提供了因为一种算法 黏性分区策略。
key 为 null 时,第一次调用时会随机生成一个整数,后面每次在这个整数上自增,然后这个值 对 partition 数量取模,这个就是轮询算法 - roundrobin。
kafka 2.4 之前默认的策略就是这个轮询主题的所有分区,将消息以轮询的方式发送到每一个分区上。
kafka 2.4 之后,社区又引进了 Sticky Partitioning Strategy(黏性分区策略),该策略能显著降低指定分区过程中的延时。具体信息看这里 KIP-480: Sticky Partitioner如果提供了 partition:
如果你指定了 partition分区,那么就用指定的这个分区,不用 hash(key) 的分区算法。
每个消息在被添加到分区partition时,会分配一个 offset ,叫偏移量,它是消息在分区中的唯一编号,也可以理解为数据库中某一张表的唯一id,kafka 通过 offset 保证了消息在某一分区的顺序,offset 不跨区,它只在一个分区内消息是有序。
比如有一个 topic 命名为:topic:student,配置了 3 个分区,分区为:p0,p1,p2,如下图:

old :表示存储的旧数据,也就是 offset 值小的数据。
new: 表示存储的新数据,新写入的数据,offset 值大的数据。
consumer: 消费者,可以消费 partition 分区的数据。这个可以看作一个消费组只有一个consumer的情况。
consumer group: 消费组,它可以保证每个分区只被组内的一个consumer(消费者)消费。
生产者的一些参数配置
生产端参数配置:http://kafka.apache.org/documentation/#producerconfigs
key.serializer:
key 的序列化
value.serializer :
值的序列化
acks:
acks 指的是有多少个副本接收到数据后发送 ack 成功,生产者才会认为数据接收成功。
- acks = 0,只管发不等服务端确认消息,不负责对发送的消息进行确认是否接收成功。也就是说发送过程中出了问题,导致服务器没有收到消息,生产者无从得知,消息也就丢失了。并且 retries 配置也不会起作用,每次 offset 返回的值都是 -1。
- acks = 1,只要集群的 Leader 接收消息并返回一条 ack 确认消息,就表明成功发送
- acks = all,这个不光要集群的 Leader 接收消息后发送 ack 确认消息,followers 也要发送确认消息,所有的 ack 发送成功,才表明数据发送成功。所以它的延迟比其他2项高。
它还可以设置为 -1, 即是 acks = -1。
buffer.memory:
设置生产者的内存缓冲区,缓冲要发送给服务器的消息。
compression.type:
对消息启用的压缩算法。默认情况下消息不会被压缩。
该参数可以设置为 snappy、gzip 和 lz4
retries:
发送消息遇到错误,重试的次数。
batch.size:
该参数指定了一个批次可以使用的内存大小,按照字节数计算
当有多个消息发到同一个分区时,生产者会把它放到同一个批次里。
bootstrap.servers:
连接到 kafka cluster 列表,也就是 broker 列表。默认为空。
设置:host1:port1,host2:port2,...
linger.ms:
在批量发送前的等待时间
client.id:
可以是任意字符串,服务器用来识别消息来源。可以设置为空,client.id=""
更多配置参数参考这里:http://kafka.apache.org/documentation/#producerconfigs
kafka学习笔记03-消息生产者producer的更多相关文章
- kafka 0.8.2 消息生产者 producer
package com.hashleaf.kafka; import java.util.Properties; import kafka.javaapi.producer.Producer; imp ...
- kafka 0.10.2 消息生产者(producer)
package cn.xiaojf.kafka.producer; import org.apache.kafka.clients.producer.*; import org.apache.kafk ...
- Kafka学习笔记3--Kafka的生产者和消费者配置
下载解压 kafka 后,在 kafka/config 下有 3 个配置文件与主题及其生产.消费相关. server.properties--服务端配置 producer.properties--生产 ...
- AMQ学习笔记 - 03. 消息的接收方式
概述 消息有两种接收方式:同步接收和异步接收. 同步接收:主线程阻塞式等待下一个消息的到来,可以设置timeout,超时则返回null. 异步接收:主线程设置MessageListener,然后继续做 ...
- kafka学习笔记(一)消息队列和kafka入门
概述 学习和使用kafka不知不觉已经将近5年了,觉得应该总结整理一下之前的知识更好,所以决定写一系列kafka学习笔记,在总结的基础上希望自己的知识更上一层楼.写的不对的地方请大家不吝指正,感激万分 ...
- 大数据 -- kafka学习笔记:知识点整理(部分转载)
一 为什么需要消息系统 1.解耦 允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束. 2.冗余 消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险.许多 ...
- Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer
Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...
- C++ GUI Qt4学习笔记03
C++ GUI Qt4学习笔记03 qtc++spreadsheet文档工具resources 本章介绍创建Spreadsheet应用程序的主窗口 1.子类化QMainWindow 通过子类化QM ...
- Redis:学习笔记-03
Redis:学习笔记-03 该部分内容,参考了 bilibili 上讲解 Redis 中,观看数最多的课程 Redis最新超详细版教程通俗易懂,来自 UP主 遇见狂神说 7. Redis配置文件 启动 ...
- Linux进程间通信IPC学习笔记之消息队列(SVR4)
Linux进程间通信IPC学习笔记之消息队列(SVR4)
随机推荐
- 金蝶Cosmic虚拟机简单使用与总结
背景 知己知彼 简单学习下友商发出来的测试软件 看看有否对自己现在的工作有所指导 也看看对方的部署方式有啥优缺点 当然了仅是测试, 不是生产软件可能有失真. 注意 我没有测试序列号, 登录系统耗时很久 ...
- 神通奥斯卡数据库是否兼容Oracle, 以及参数修改的办法
1. 最近公司要适配神通数据库, 但是因为一些功能异常.参数可能存在风险. 为了减少问题, 想着简单描述一下这些的处理. 开发和客户给的默认参数建议 1. 不选择 兼容oracle模式 2. 字符集选 ...
- 小记录 单选框的注意点 html中字符串拼接 el-upload手动上传 表格跳转 v-for动态添加背景色 控制label标签于文本框之间的间距
在element-ui中 单选框的v-model的值最好是一个字符串 否者可能不能够进行数据回填哈 单选框 的类型必须是字符串类型哈 在elemnet-ui中 如果你想从A页面拿到B页面中的值 可以有 ...
- vue过滤器(filter)的使用
过滤器分全局过滤器和局部过滤器 <div id="app"> <p>电脑价格:{{price | addPriceIcon}}</p> < ...
- JS ----- JS实用小功能
1.复制页面上文字功能 function copyIdCode() { var idcode = document.getElementById("personIdcodeCopy" ...
- 探索 GO 项目依赖包管理与Go Module常规操作
探索 GO 项目依赖包管理与Go Module常规操作 目录 探索 GO 项目依赖包管理与Go Module常规操作 一.Go 构建模式的演变 1.1 GOPATH (初版) 1.1.1 go get ...
- # 再次推荐github 6.7k star开源IM项目OpenIM性能测试及消息可靠性测试报告
本报告主要分为两部分,性能测试和消息可靠性测试.前者主要关注吞吐,延时,同时在线用户等,即通常所说的性能指标.后者主要模拟真实环境(比如离线,在线,弱网)消息通道的可靠性. 先说结论,对于容量和性能: ...
- 『Echarts』简介
目录 一.前言 二.『Echarts』简介 1. 什么是『Echarts』 三.数据可视化 四.『Echarts』 1.『Echarts』的作用 2.『Echarts』能绘制哪些图表 3.『Echar ...
- 总结一个问题:csdn发布文章页面为空或者创作内容管理为空
总结一个问题:csdn发布文章页面或者创作内容管理为空 解决方案: 打开chrome浏览器的设置: 点击清除数据: 选择高级里清除数据,一般24小时就可以了,不行就7天
- 人工智能创新挑战赛:助力精准气象和海洋预测Baseline[2]:数据探索性分析(温度风场可视化)、CNN+LSTM模型建模
"AI Earth"人工智能创新挑战赛:助力精准气象和海洋预测Baseline[2]:数据探索性分析(温度风场可视化).CNN+LSTM模型建模 1.气象海洋预测-数据分析 数据分 ...