向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. 使用MVVM DataTemplate在WPF XAML视图之间切换

    原文 使用MVVM DataTemplate在WPF XAML视图之间切换 更新:这个技术的改进版本,一个不创建视图,可以在以下链接找到: http://www.technical-recipes.c ...

  2. HDU 4357 String change 法冠军

    意甲冠军: 鉴于a串b串,问我们能否a变b串 办法:自选a的2快报,ascil+=1 然后交换位置,能够操作自如倍. 3个月3以上就能T^T 2法官将着眼于暴力 #include <cstdio ...

  3. JQuery在一个简单的表单验证的例子

    html代码例如以下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  4. NSURLSession 网络库 - 原生系统送给我们的礼物

    大家在进行iOS开发的时候一定会用到网络操作.但由于早期原生的 NSURLConnection 操作起来有很多不便,使得大家更愿意使用第三方库的解决方案,比如鼎鼎大名的 AFNetworking.正是 ...

  5. js 层的显示和隐藏

    <!DOCTYPE html><html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  6. 最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保留一块内存

    申请效率的比较 栈:由系统自动分配,速度较快.但程序员是无法控制的. 堆:是由new分配的内存,最好的方式是用VirtualAlloc分配虚拟内存,它既不是在堆也不是在栈,而是直接在进程的地址空间中保 ...

  7. python socket 客服端服务端编程

    客服端编程 import socket try: s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) except socket.error a ...

  8. wpf 快速建立可以拖动对象

    1.引用两个.net 程序集 2.xaml name space导入 xmlns:i ="http://schemas.microsoft.com/expression/2010/inter ...

  9. xcode缓存清理

    移除对旧设备的支持 影响:可重新生成:再连接旧设备调试时,会重新自动生成. 路径: ~/Library/Developer/Xcode/iOS DeviceSupport 如果你不是在wb145230 ...

  10. vxworks下libpcap的移植

    linux下的libpcap应用能够成熟的使用在第三方的应用中,但基于vxworks开发的项目中需要使用libpcap的部分功能则无相应的实现. 研究了下libpcap向vxworks的移植,并且小有 ...