Kafka笔记3
向Kafka写入消息从创建一个ProducerRecord对象开始,ProducerRecord需要包含目标主题和要发送的内容,我们还可以指定键或分区,在发送ProducerRecord对象时,生产者要先把键和值对象序列化成字节数组。
接下来数据被传给分区器,如果ProducerRecord指定了分区,那么分区器就不会做任何事情,直接把指定的分区返回,如果没有指定分区,那么分区器会根据ProducerRecord的键来选择一个分区,选好分区以后,生产者就知道该往哪个主题和分区发送这条记录了,接着记录被添加到一个记录批次里,这个批次的所有内容都会被发送到相同的主题和分区,有一个独立的线程负责把这些记录批次发送到相应的broker上。
服务器在收到消息时会返回一个响应,如果消息成功写入,就返回一个RecordMetaData对象,它包含主题和分区消息,以及记录在分区的偏移量,如果写入失败,返回一个错误。生产者收到错误后回尝试重新发送消息。
Kafka生产者有三个必选属性:
bootstrap.servers
该属性指定broker的地址清单,地址格式host:port,建议至少提供两个broker的信息,逗号分隔。
key.serializer
broker希望接收到的消息的键和值都是字节数组,生产者接口允许使用参数化类型,因此可以把Java对象作为键和值发送给broker。这样代码具有良好的可读性,不过生产者需要知道如果把这些Java对象序列化为字节数组。
key.serializer必须设置为一个实现了org.apache.kafka.common.serialization.Serializer接口的类,生产者会使用这个类把键值对象转换成字节数组。Kafka客户端默认实现了ByteArraySerializer,StringSerializer和IntegerSerializer.
Value.serializer
如果键值不同类型,就必须指定不同的序列号器。
发送消息主要有三种方式:
1.发送并忘记
把消息发送给服务器,并不关心他是否到达,大多数情况下消息会到达,但也可能回丢失部分消息。
2.同步发送
使用send 方法发送消息,它会返回一个Future对象,调用get方法进行等待,就可以知道消息是否发送成功。
3.异步发送
调用send 方法,并指定一个回调函数,服务器在返回响应时调用该函数。为了使用回调,需要一个实现了org.apache.kafka.clients.producer.Callback接口的类。
生产者的配置
1.acks
Acks参数指定了必须要有多少分区副本收到消息,生产者才会认为写入是成功的,这个参数对消息丢失的可能性有重要影响。
acks=0
生产者在成功写入消息之前不会等待任何来自服务器的响应,也就是说,如果服务器没有收到消息,生产者无从得知,消息就丢失了,当然生产者因为不需要等待服务器响应,所以可以从网络支持的最大速度发送消息,从而达到很高的吞吐量。
acks=1
只要集群的首领节点收到消息,生产者就会得到服务器的响应,如果消息无法到达首领节点,生产者就会重发,如果此时首领节点崩溃,重新选举,则消息还是会丢失。这个时候的吞吐量取决于同步发送还是异步发送。即便是异步发送,吞吐量还是会收到发送中消息数量的限制,比如生产者在收到服务器响应之前可以发送多少消息。
acks=all
只有当所有参与复制的节点全部收到消息,生产者才会收到来自服务器的响应。这种模式最安全,不会丢失消息。当然延迟最高,速度也最慢。
2.buffer.memory
该参数用于设置生产者内存缓冲区的大小,生产者用它缓冲要发送到服务器的消息。如果应用程序发送消息的速度超过了发送到服务器的速度,会导致生产者内存空间不足,这个时候send方法要被阻塞,要么抛出异常。
3.compression.type
默认情况下消息不被压缩,该参数可以设置为snappy,gzip,lz4,使用压缩可以降低网络传输开销和存储开销,而这往往是向Kafka发送消息的瓶颈所在。
4.retries
生产者从服务器收到的错误有可能是临时性错误,这种情况下retries参数的值决定了生产者可以重发消息的次数,达到这个次数,如果消息依然没有成功发送,就会被放弃重试,返回错误。默认情况下,每次重试之前等待100ms(可以通过修改retry.backoff.ms改变),建议这个时间设置得要不Kafka从崩溃中恢复的时间要长
5.batch.size
当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次。该参数指定了一个批次可以使用的内存大小,按照字节数计算,不会造成延迟,只是会占用更多内存。
6.linger.ms
该参数指定了生产者在发送批次之前等待的最大时间,Kafka会在批次填满或者linger.ms到达上限时发送。
服务器用它识别消息的来源
8.max.in.flight.requests.per.connection
该参数指定了生产者接受到服务器响应之前可以发送多少个消息,它的值越高,就会占用更多内存,不过也会提升吞吐量,把它设为1可以保证消息按照发送的顺序写入服务器,即使发送了重试。
9.timeout.ms,request.timeout.ms和metadata.fetch.timeout.ms
request.timeout.ms指定了生产者发送数据时等待服务器返回响应的时间
metadata.fetch.timeout.ms指定了生产者在获得元数据时等待服务器返回响应的时间
timeout.ms指定了broker 等待同步副本返回消息确认的时间,与acks的配置相匹配——如果在指定时间内没有收到同步副本的确认,那么broker就会返回错误。
10.max.block.ms
该参数指定了调用send方法或者使用partitionFor获取元数据时生产者的阻塞时间,当生产者发送缓冲区已满,或者没有可用的元数据时,这些方法就会阻塞,阻塞时间超过max.block.ms时就会抛出超时异常。
11.max.request.size
该参数用于空着生产者发送的请求大小,它指定发送单个消息的最大值,也可以指定单个请求里所有消息总的大小。
12.receive.buffer.bytes和send.buffer.bytes
这两个参数分别指定了tcp socket接收和发送数据包的缓冲区的大小,如果设置为-1,就使用操作系统的默认值,如果生产者或消费者与broker处于不同数据中心,那么可以适当增大这些值。
Kafka笔记3的更多相关文章
- Kafka笔记整理(三):消费形式验证与性能测试
Kafka消费形式验证 前面的<Kafka笔记整理(一)>中有提到消费者的消费形式,说明如下: .每个consumer属于一个consumer group,可以指定组id.group.id ...
- Kafka笔记整理(一)
Kafka简介 消息队列(Message Queue) 消息 Message 网络中的两台计算机或者两个通讯设备之间传递的数据.例如说:文本.音乐.视频等内容. 队列 Queue 一种特殊的线性表(数 ...
- Kafka笔记—可靠性、幂等性和事务
这几天很忙,但是我现在给我的要求是一周至少要出一篇文章,所以先拿这篇笔记来做开胃菜,源码分析估计明后两天应该能写一篇.给自己加油~,即使没什么人看. 可靠性 如何保证消息不丢失 Kafka只对&quo ...
- Kafka笔记
最近做的一个项目需要跟Kafka打交道,学习了很多相关知识,就到这里来汇总一下. kafka是一个传递消息的系统,原本是用来快速记录海量log的,现在也经常用作消息队列.它主要由三个部分组成,prod ...
- kafka笔记-Kafka在zookeeper中的存储结构【转】
参考链接:apache kafka系列之在zookeeper中存储结构 http://blog.csdn.net/lizhitao/article/details/23744675 1.topic注 ...
- Kafka笔记--指定消息的partition规则
参数的设定:参考资料 不错的资料:http://blog.csdn.net/honglei915/article/details/37697655 http://developer.51cto.com ...
- Kafka笔记--监控系统KafkaOffsetMonitor
KafkaOffsetMonitor下载链接: http://download.csdn.net/detail/changong28/7930337github官方:https://github.co ...
- Kafka笔记--使用ubuntu为bocker(服务器)windows做producer和comsumer(客户端)
原文连接:http://www.cnblogs.com/davidwang456/p/4201875.html 程序仍然使用之前的一篇博文中的例子 :http://www.cnblogs.com/gn ...
- Kafka笔记--参数说明及Demo
参考资料:http://blog.csdn.net/honglei915/article/details/37563647参数说明:http://ju.outofmemory.cn/entry/119 ...
- Kafka笔记--分布式环境搭建
部署: http://www.cnblogs.com/likehua/p/3999538.html http://blog.csdn.net/kimmking/article/details/8263 ...
随机推荐
- linux tesseract识别名片
用tesseract识别名片,无任何训练 数字,字母识别的准确率比较高,没有错误,规范的汉字识别的还可以,比如名片背面,正面的就错误比较多了: 没有任何训练,识别的还算可以了:我们主要要的电话和QQ ...
- C#中的并发编程知识
= 导航 顶部 线程 Task async/await IAsyncResult Parallel 异步的回调 顶部 线程 Task async/await IAsyncResult Pa ...
- SWFTools PDF转换为SWF
前言 在iText 制作PDF这篇博文中只是简单的介绍了如何制作PDF,为了能让PDF在Web页面中显示,我还需要通过SWFTools工具将PDF文件转换为SWF文件,然后通过SWF文件显示在Web网 ...
- python 强制类型转换 以及 try expect
强制类型转换: 字符串 --> 整型: 字符串 第一个 是 + 或者 - ,会直接去掉 符号 ,返回 数字 如: a = '+123456' s = int(a) print(s) s ...
- 1.开始第一个MVC项目
安装就不说了 1.在指定路径创建好项目文件夹之后,打开cmd,进去这个文件夹路径下 输入命令 dotnet new mvc 就会在文件夹内创建一个mvc项目 2.创建好项目之后 直接在这个路径下输入 ...
- WPF 3D model - Sphere, Cone, and Cylinder
原文:WPF 3D model - Sphere, Cone, and Cylinder Extending Visual3D - Sphere, Cone, and Cylinder http: ...
- OpenGL(五) 三维变换之模型视图矩阵
计算机三维图形学中,一个基本的任务是如何描述三维空间中一个物体位置的变化,也就是如何 描述物体的运动.通常情况下,物体位置的变化包含三个基本的变化:平移.旋转和缩放,物体的运动也可以用这三个基本的运动 ...
- WPF中TextBlock文本换行与行间距
原文:WPF中TextBlock文本换行与行间距 换行符: C#代码中:\r\n 或 \r 或 \n XAML中: 或 注:\r 回车 (carriage return 缩写),\n 新行 (new ...
- 【C#】解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题
原文:[C#]解决MouseHook捕获鼠标动作,在有些电脑上SetWindowsHookEx失败返回0的问题 最近在debug鼠标位置捕获的功能时发现在其中的一台开发电脑上,SetWindowsHo ...
- 使用tratto进行CISCO网络设备的管理
测试环境: CSR1000V CentOS7.4 X64 Step 1:在CentOS7上安装python 3.0环境 [root@docker ~]# python3 -VPython 3.7.0[ ...