<cite id="fzn17"></cite>
<var id="fzn17"></var><cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var>
<menuitem id="fzn17"><span id="fzn17"><thead id="fzn17"></thead></span></menuitem>
<cite id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></cite><var id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></var>
<var id="fzn17"></var>
<menuitem id="fzn17"></menuitem>
<cite id="fzn17"><video id="fzn17"></video></cite>
|
|
51CTO旗下网站
|
|
移动端

2.3 重要的生产者参数

《深入理解Kafka:核心设计与实践原理》本书主要阐述了Kafka中生产者客户端、消费者客户端、主题与分区、日志存储、原理解析、监控管理、应用扩展及流式计算等内容。本节为大家介绍重要的生产者参数。

作者:朱忠华来源:电子工业出版社|2019-01-20 13:59

2.3 重要的生产者参数

在KafkaProducer 中,除了2.1.1 节提及的3 个默认的客户端参数,大部分的参数都有合理的默认值,一般不需要修改它们。不过了解这些参数可以让我们更合理地使用生产者客户端,其中还有一些重要的参数涉及程序的可用性和性能,如果能够熟练掌握它们,?#37096;?#20197;让我们在编写相关的程序时能够更好地进行性能调优与?#25910;?#25490;查。下面挑选一些重要的参数进行讲解。

1. acks

这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。acks 是生产者客户端中一个非常重要的参数,它涉及消息的可靠性和吞吐量之间的权衡。acks 参数有3 种类型的值(都是字符串类型)。

acks = 1。默认?#23548;?#20026;1。生产者发送消息之后,只要分区的leader 副本成功写入消息,那么它就会收到来自服务端的成功响应。如果消息无法写入leader 副本,比如在leader 副本崩溃、重新选举新的leader 副本的过程中,那么生产者就会收到一个错误的响应,为了避免消息丢失,生产者可以选择重发消息。如果消息写入leader 副本并返回成功响应给生产者,且在被其他follower 副本拉取之前leader 副本崩溃,那么此时消息还是会丢失,因为新选举的leader 副本中并没有这条对应的消息。acks 设置为1,是消息可靠性和吞吐量之间的折中方案。

. acks = 0。生产者发送消息之后不需要等待任何服务端的响应。如果在消息从发送到写入Kafka 的过程中出现某些异常,导致Kafka 并没有收到这条消息,那么生产者?#21442;?#20174;得知,消息也就丢失了。在其他配?#27809;?#22659;相同的情况下,acks 设置为0 可?#28304;?#21040;最大的吞吐量。

. acks = -1 或acks = all。生产者在消息发送之后,需要等待ISR 中的所有副本都成功写入消息之后才能够收到来自服务端的成功响应。在其他配?#27809;?#22659;相同的情况下,acks 设置为-1(all)可?#28304;?#21040;最强的可靠性。但这并不意味着消息就一定可靠,因为ISR 中可能只有leader 副本,这样就退化成了acks=1 的情况。要获得更高的消息可靠性需要配合min.insync.replicas 等参数的联动,消息可靠性分析的具体内容可以参考8.3 节。

注意acks 参数配置的值是一个字符串类型,而不是整数类型。举个例子,将acks 参数设置为0,需要采用下面这两?#20013;?#24335;:

  1. properties.put("acks", "0");  
  2. # 或者  
  3. properties.put(ProducerConfig.ACKS_CONFIG, "0"); 

而不能配置成下面这?#20013;?#24335;:

  1. properties.put("acks", 0);  
  2. # 或者  
  3. properties.put(ProducerConfig.ACKS_CONFIG, 0); 

这样会报出如下的异常:

  1. org.apache.kafka.common.config.ConfigException: Invalid value 0 for configuration  
  2. acks: Expected value to be a string, but it was a java.lang.Integer. 

2. max.request.size

这个参数用来限制生产者客户端能发送的消息的最大值,默认值为1048576B,即1MB。一般情况下,这个默认值就可?#26376;?#36275;大多数的应用场景了。笔者并不建议读者盲目地增大这个参数的配置值,尤其是在对Kafka 整体脉络没有足够把控的时候。因为这个参数还涉及一些其他参数的联动,比如broker 端的message.max.bytes 参数,如果配?#20040;?#35823;可能会引起一些不必要的异常。比如将broker 端的message.max.bytes 参数配置为10,而max.request.size参数配置为20,那么当我们发送一条大小为15B 的消息时,生产者客户端就会报出如下的异常:

  1. org.apache.kafka.common.errors.RecordTooLargeException: The request included a  
  2. message larger than the max message size the server will accept. 

3. retries 和retry.backoff.ms

retries 参数用来配置生产者重试的次数,默认值为0,即在发生异常的时候不进行任何重试动作。消息在从生产者发出到成功写入服务器之前可能发生一些临时性的异常,比如网络抖动、leader 副本的选举等,这?#24544;?#24120;往往是可以自行?#25351;?#30340;,生产者可以通过配置retries大于0 的值,?#28304;送?#36807;内部重试来?#25351;?#32780;不是一味地将异常抛给生产者的应用程序。如果重试达到设定的次数,那么生产者就会放弃重试并返回异常。不过并不是所有的异常都是可以通过重试来解决的,比如消息太大,超过max.request.size 参数配置的值时,这种方式就不可行了。

重试还和另一个参数retry.backoff.ms 有关,这个参数的默认值为100,它用来设定两次重试之间的时间间隔,避免无效的频繁重试。在配置retries 和retry.backoff.ms之前,最好先估算一下可能的异常?#25351;?#26102;间,这样可以设定总的重试时间大于这个异常?#25351;?#26102;间,?#28304;?#26469;避免生产者过早地放弃重试。

Kafka 可以保证同一个分区中的消息是有序的。如果生产者按照一定的顺序发送消息,那么这些消息?#19981;?#39034;序地写入分区,进而消费者?#37096;?#20197;按照同样的顺序消费它们。对于某些应用来说,顺序性非常重要,比如MySQL 的binlog 传输,如果出现错误就会造成非常严重的后果。

如果将acks 参数配置为非零值,并且max.in.flight.requests.per.connection 参数配置为大于1 的值,那么就会出现错序的现象:如果第一批次消息写入失败,而第二批次消息写入成功,那么生产者会重试发送第一批次的消息,此时如果第一批次的消息写入成功,那么这两个批次的消息?#32479;?#29616;了错序。一般而言,在需要保证消息顺序的场合建议把参数max.in.flight.requests.per.connection 配置为1,而不是把acks 配置为0,不过这样?#19981;?#24433;响整体的吞吐。

4. compression.type

这个参数用来指定消息的压缩方式,默认值为“none”,即默认情况下,消息不会被压缩。该参数还可以配置为“gzip”“snappy”和“lz4”。对消息进行压缩可以极大地减少网络传输量、降低网络I/O,从而提高整体的性能。消息压缩是一种使用时间换空间的优化方式,如果对时延有一定的要求,则不推荐对消息进行压缩。

5. connections.max.idle.ms

这个参数用来指定在多久之后关?#38556;?#21046;的连接,默认值是540000(ms),即9 分钟。

6. linger.ms

这个参数用来指定生产者发送ProducerBatch 之前等待更多消息(ProducerRecord)加入ProducerBatch 的时间,默认值为0。生产者客户端会在ProducerBatch 被填满或等待时间超过linger.ms 值时发?#32479;?#21435;。增大这个参数的值会增加消息的延迟,但是同时能提升一定的吞吐量。这个linger.ms 参数与TCP 协议中的Nagle 算法有异曲同工之妙。

7. receive.buffer.bytes

这个参数用来设置Socket 接收消息缓冲区(SO_RECBUF)的大小,默认值为32768(B),即32KB。如果设置为-1,则使用操作系统的默认值。如果Producer 与Kafka 处于不同的机房,则可以?#23454;?#35843;大这个参数值。

8. send.buffer.bytes

这个参数用来设置Socket 发送消息缓冲区(SO_SNDBUF)的大小,默认值为131072(B),即128KB。与receive.buffer.bytes 参数一样,如果设置为-1,则使用操作系统的默认值。

9. request.timeout.ms

这个参数用来配置Producer 等待请求响应的最长时间,默认值为30000(ms)。请求超时之后可以选择进行重试。注意这个参数需要比broker 端参数replica.lag.time.max.ms 的值要大,这样可以减少因客户端重试而引起的消息重复的概率。

还有一些生产者客户端的参数在本节中没有提及,这些参数同样非常重要,它们需要单独的章节或场景来描述。部分参数在前面的章节中已经提及,比如bootstrap.servers,还有部分参数会在后面的章节中提及,比如transactional.id。表2-1 中罗列了一份详细的参数列表以供读者参阅。

表2-1 部分生产者客户端参数

续表


?#19981;?#30340;朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书会第9群:808517103

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你?#19981;?/dt>

订阅专栏+更多

活学活用 Ubuntu Server

活学活用 Ubuntu Server

实战直通车
共35章 | UbuntuServer

216人订阅学习

掌握Java核心

共30章 | 51CTO王波

83人订阅学习

Mysql DBA修炼之路

Mysql DBA修炼之路

MySQL入门到高阶
共24章 | 武凤涛

468人订阅学习

视频课程+更多

MYSQL主从复制偏运维全实战视频教程

MYSQL主从复制偏运维全实战视频教程

讲师:实践哥10012人学习过

企?#23548;禯abbix3.4+Grafana5.1全实战视频教程

企?#23548;禯abbix3.4+Grafana5.1全实战视频教程

讲师:实践哥39834人学习过

标杆徐2019 KVM丛入门到精通实战(2019全新发?#21450;?

标杆徐2019 KVM丛入门到精通实战(2019全新发

讲师:徐亮伟15018人学习过

最新专题+更多

实感?#25442;ィ?#20154;工智能下的人机?#25442;?#25216;术
实感?#25442;ィ?#20154;工智能下的人机?#25442;?#25216;术

人工智能

精通TensorFlow
精通TensorFlow

TensorFlow

Yii2框架从入门到精通
Yii2框架从入门到精通

Yii2框架

Python3.6编程实践?#25913;?-计算机科学入门(原书第3版)
Python3.6编程实践?#25913;?-计算机科学入门(原书第3版)

Python3.6编程

精选博文
论坛热帖
下载排行

读 书 +更多

游戏开发核心技术--剧本和角色创造

《游戏开发核心技术--剧本和角色创造》分“剧本”、“角色”和“游戏玩法?#27604;?#37096;分,第一部分着重?#24471;?#25925;事的历史、一般故事元素、传统故事设...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客

澳洲幸运5官方
<cite id="fzn17"></cite>
<var id="fzn17"></var><cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var>
<menuitem id="fzn17"><span id="fzn17"><thead id="fzn17"></thead></span></menuitem>
<cite id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></cite><var id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></var>
<var id="fzn17"></var>
<menuitem id="fzn17"></menuitem>
<cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var><cite id="fzn17"><video id="fzn17"></video></cite>
<cite id="fzn17"></cite>
<var id="fzn17"></var>
<menuitem id="fzn17"><span id="fzn17"><thead id="fzn17"></thead></span></menuitem>
<cite id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></cite><var id="fzn17"><span id="fzn17"><var id="fzn17"></var></span></var>
<var id="fzn17"></var>
<menuitem id="fzn17"></menuitem>
<cite id="fzn17"><video id="fzn17"></video></cite>
湖北11选5 fm2012门兴 幸运农场秘籍 亚特兰蒂斯女王试玩 逆水寒答题器手机版 勇士vs独行侠 顶级王牌-明星免费试玩 中国福彩双色球规则 北京赛车开奖视频110 使命召唤ol2会出吗