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)
随机推荐
- [转帖]15.1. 插件dblink简介
https://help.kingbase.com.cn/v8.6.7.12/development/sql-plsql/ref-extended-plug-in/dblink.html dblink ...
- [转帖]内存随机访问也比顺序慢,带你深入理解内存IO过程
https://zhuanlan.zhihu.com/p/86513504 平时大家都知道内存访问很快,今天来让我们来思考两个问题: 问题1: 内存访问一次延时到底是多少?你是否会进行大概的估算? 例 ...
- [转帖]Zen4架构+5nm制程+96核心 第四代AMD EPYC处理器强势来袭
https://new.qq.com/rain/a/20221111A098QE00 不得不承认,技术的持续突破和迭代,使得AMD处理器在近年来得到了"喷气机式"的增长,无论是 ...
- SQLSERVER2008R2 本地客户端无法连接的问题
sqlserver 数据库无法连接问题. 1. 问题现象与简单分析 今天同事找我说一个 SQLSERVER2008R2的测试环境无法连接了. 提示信息为: 当时猜测是 数据库的 配置出问题了. 去查看 ...
- 原生js拖拽元素(onmouseup不能够触发的原因)
我们经常会遇见拖拽某一个元素的场景,拖拽也是很常用的: 这次拖拽遇见一个问题,有时在拖拽的时候吗,鼠标松开,元素仍然可以拖拽: 经过查阅资料,发现: 会触发H5原生的拖拽事件.并且不会监听到onmou ...
- 【JS 逆向百例】有道翻译接口参数逆向
逆向目标 目标:有道翻译接口参数 主页:https://fanyi.youdao.com/ 接口:https://fanyi.youdao.com/translate_o?smartresult=di ...
- Java中的基本数据类型和包装类型的这些知识,你都知道吗?
Java中的基本数据类型和包装类型 Java 中的基本数据按类型可以分为四大类:布尔型.整数型.浮点型.字符型: 这四大类包含 8 种基本数据类型. 布尔型:boolean 整数型:byte.shor ...
- 5.10 Windows驱动开发:摘除InlineHook内核钩子
在笔者上一篇文章<内核层InlineHook挂钩函数>中介绍了通过替换函数头部代码的方式实现Hook挂钩,对于ARK工具来说实现扫描与摘除InlineHook钩子也是最基本的功能,此类功能 ...
- Python 实现文件关键字扫描
第一段代码用户传入一个文件夹,自动扫描文件夹内特定文件是否存在某些关键字,如果存在则输出该文件的路径信息. # coding=gbk import sys,os,re def spider(scrip ...
- 由反射引出的Java动态代理与静态代理
写在开头 在<深入剖析Java中的反射,由浅入深,层层剥离!>这篇文章中我们讲反射时,曾提到过Java的动态代理中使用了反射技术,那么好,今天我们要就着反射的索引,来学习一下Java中的代 ...