向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到达上限时发送。

7.client.id

服务器用它识别消息的来源

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的更多相关文章

  1. Kafka笔记整理(三):消费形式验证与性能测试

    Kafka消费形式验证 前面的<Kafka笔记整理(一)>中有提到消费者的消费形式,说明如下: .每个consumer属于一个consumer group,可以指定组id.group.id ...

  2. Kafka笔记整理(一)

    Kafka简介 消息队列(Message Queue) 消息 Message 网络中的两台计算机或者两个通讯设备之间传递的数据.例如说:文本.音乐.视频等内容. 队列 Queue 一种特殊的线性表(数 ...

  3. Kafka笔记—可靠性、幂等性和事务

    这几天很忙,但是我现在给我的要求是一周至少要出一篇文章,所以先拿这篇笔记来做开胃菜,源码分析估计明后两天应该能写一篇.给自己加油~,即使没什么人看. 可靠性 如何保证消息不丢失 Kafka只对&quo ...

  4. Kafka笔记

    最近做的一个项目需要跟Kafka打交道,学习了很多相关知识,就到这里来汇总一下. kafka是一个传递消息的系统,原本是用来快速记录海量log的,现在也经常用作消息队列.它主要由三个部分组成,prod ...

  5. kafka笔记-Kafka在zookeeper中的存储结构【转】

    参考链接:apache kafka系列之在zookeeper中存储结构  http://blog.csdn.net/lizhitao/article/details/23744675 1.topic注 ...

  6. Kafka笔记--指定消息的partition规则

    参数的设定:参考资料 不错的资料:http://blog.csdn.net/honglei915/article/details/37697655 http://developer.51cto.com ...

  7. Kafka笔记--监控系统KafkaOffsetMonitor

    KafkaOffsetMonitor下载链接: http://download.csdn.net/detail/changong28/7930337github官方:https://github.co ...

  8. Kafka笔记--使用ubuntu为bocker(服务器)windows做producer和comsumer(客户端)

    原文连接:http://www.cnblogs.com/davidwang456/p/4201875.html 程序仍然使用之前的一篇博文中的例子 :http://www.cnblogs.com/gn ...

  9. Kafka笔记--参数说明及Demo

    参考资料:http://blog.csdn.net/honglei915/article/details/37563647参数说明:http://ju.outofmemory.cn/entry/119 ...

  10. Kafka笔记--分布式环境搭建

    部署: http://www.cnblogs.com/likehua/p/3999538.html http://blog.csdn.net/kimmking/article/details/8263 ...

随机推荐

  1. Nginx得知——流程模型(worker流程)

    流程模型 worker流程 master进程模型核心函数ngx_master_process_cycle()中调用了创建子进程函数ngx_start_worker_processes(),该函数源代码 ...

  2. chrome浏览器***

    chrome浏览器***: "红杏"是一款 Chrome 浏览器插件.(PS:不用 Chrome 的同学赶紧去下载安装.那个***大家都懂得.)相较于其它***方式,"红 ...

  3. 简单使用.net core 自带的DI

    1.创建一个web api项目 2.在项目中创建一个接口类 namespace LearnCore.CoreDI { public interface ILearnDI { string GetNam ...

  4. MySQL SYS CPU高的案例分析(二)

    原文:MySQL SYS CPU高的案例分析(二) 后面又做了补充测试,增加了每秒context switch的监控,以及SQL执行时各步骤消耗时间的监控. [测试现象一] 启用1000个并发线程的压 ...

  5. 怎样正确的理解和解决 ORA-01843:not a valid month

    今天码代码的时候遇到了这个问题,由于oracle用的比較少,所在查询了一下. 顿时傻眼,有非常多的贴子说是由于nls_date_language的问题,还要改会话级的NLS_DATE_LANGUAGE ...

  6. 关于禅道提示未安装VC++环境的问题(做个记录)

    明明安装了VC++环境,总是提示未安装,这个问题有可能是你的mysql或其他服务开启影响的,关闭服务就可以了! 我这边是这个问题,把mysql和其他一些服务停止就好了.

  7. 利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件

    虽说渐渐地Mac笔记本基本告别内置光驱时代了,随着网络的普及,使用到光驱的机会也渐少,但有时又难免需要光驱,比如二货出版社的随书光盘等…我们可以通过USB外置光驱将光盘内容提取为ISO文件保存到电脑里 ...

  8. MEF 插件式开发 - 小试牛刀

    原文:MEF 插件式开发 - 小试牛刀 目录 MEF 简介 实践出真知 面向接口编程 控制反转(IOC) 构建入门级 MEF 相关参考 MEF 简介 Managed Extensibility Fra ...

  9. Hermite曲线插值

    原文 Hermite Curve Interpolation Hermite Curve Interpolation Hamburg (Germany), the 30th March 1998. W ...

  10. Post utf-8 请求

    /// <summary> /// POST请求与获取结果 /// </summary> public static string HttpPost(string Url, s ...