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 ...
随机推荐
- Nginx得知——流程模型(worker流程)
流程模型 worker流程 master进程模型核心函数ngx_master_process_cycle()中调用了创建子进程函数ngx_start_worker_processes(),该函数源代码 ...
- chrome浏览器***
chrome浏览器***: "红杏"是一款 Chrome 浏览器插件.(PS:不用 Chrome 的同学赶紧去下载安装.那个***大家都懂得.)相较于其它***方式,"红 ...
- 简单使用.net core 自带的DI
1.创建一个web api项目 2.在项目中创建一个接口类 namespace LearnCore.CoreDI { public interface ILearnDI { string GetNam ...
- MySQL SYS CPU高的案例分析(二)
原文:MySQL SYS CPU高的案例分析(二) 后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压 ...
- 怎样正确的理解和解决 ORA-01843:not a valid month
今天码代码的时候遇到了这个问题,由于oracle用的比較少,所在查询了一下. 顿时傻眼,有非常多的贴子说是由于nls_date_language的问题,还要改会话级的NLS_DATE_LANGUAGE ...
- 关于禅道提示未安装VC++环境的问题(做个记录)
明明安装了VC++环境,总是提示未安装,这个问题有可能是你的mysql或其他服务开启影响的,关闭服务就可以了! 我这边是这个问题,把mysql和其他一些服务停止就好了.
- 利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件
虽说渐渐地Mac笔记本基本告别内置光驱时代了,随着网络的普及,使用到光驱的机会也渐少,但有时又难免需要光驱,比如二货出版社的随书光盘等…我们可以通过USB外置光驱将光盘内容提取为ISO文件保存到电脑里 ...
- MEF 插件式开发 - 小试牛刀
原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...
- Hermite曲线插值
原文 Hermite Curve Interpolation Hermite Curve Interpolation Hamburg (Germany), the 30th March 1998. W ...
- Post utf-8 请求
/// <summary> /// POST请求与获取结果 /// </summary> public static string HttpPost(string Url, s ...