向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. Method for training dynamic random access memory (DRAM) controller timing delays

    Timing delays in a double data rate (DDR) dynamic random access memory (DRAM) controller (114, 116) ...

  2. ASP.NET Core & Docker & Jenkins 零基础持续集成实战

    原文:ASP.NET Core & Docker & Jenkins 零基础持续集成实战 一.本系列教程说明 源代码管理工具:Gogs 持续集成工具:Jenkins 容器:Docker ...

  3. override 与overload 的差别

    方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现.   重写(Overriding)是父类与子类之间多态性的一种表现,而重载(Overloading)是一个 ...

  4. node lesson3

    var express = require('express'); var superagent = require('superagent'); var cheerio = require('che ...

  5. 1 Task的简单实用

    Task是thread和threadpool两者结合的产物,吸收了二者的优点  进一步添加了一些新的 优秀的功能. using System; using System.Threading.Tasks ...

  6. Java和Flex积分误差(两)

    1.错误原因 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  7. 常用cl编译命令参数解释

    紧接前文,第一行cl命令如下: 1>  cl /c /IC:\...\include /ZI /nologo- /W3 /WX- /sdl /Od /Oy- /D WIN32 /D _DEBUG ...

  8. 去掉 Windows 中控件的虚线框(当当 element == QStyle::PE_FrameFocusRect 时,直接返回,不绘制虚线框)

    在 Windows 中,控件得到焦点的时候,会显示一个虚线框,很多时候觉得不好看,通过自定义 QProxyStyle 就可以把这个虚线框去掉. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  9. C#彩色艺术化二维码样式设计(仅说思路)

    原文:C#彩色艺术化二维码样式设计(仅说思路) 仅讲思路,想要源码的请绕道.   一.样式 1.先看各种二维码的样式吧: (1)最简单的样式--黑白样式,如下图: 图1  最平常见到的二维码样式(如果 ...

  10. JS enter代替tab,只有部分键可以代替

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...