Kafka 一些重要的参数_「已注销」的博客-程序员宅基地

技术标签: kafka  Kafka  

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

  1. acks
    这个参数用来指定分区中必须要有多少个副本收到这条消息,之后生产者才会认为这条消息是成功写入的。acks 是生产者客户端中一个非常重要的参数,它涉及消息的可靠性和吞吐量之间的权衡。acks参数有3种类型的值(都是字符串类型)。
    · acks=1。默认值即为1。生产者发送消息之后,只要分区的leader副本成功写入消息,那么它就会收到来自服务端的成功响应。如果消息无法写入leader副本,比如在leader 副本崩溃、重新选举新的 leader 副本的过程中,那么生产者就会收到一个错误的响应,为了避免消息丢失,生产者可以选择重发消息。如果消息写入leader副本并返回成功响应给生产者,且在被其他follower副本拉取之前leader副本崩溃,那么此时消息还是会丢失,因为新选举的leader副本中并没有这条对应的消息。acks设置为1,是消息可靠性和吞吐量之间的折中方案。
    · acks=0。生产者发送消息之后不需要等待任何服务端的响应。如果在消息从发送到写入Kafka的过程中出现某些异常,导致Kafka并没有收到这条消息,那么生产者也无从得知,消息也就丢失了。在其他配置环境相同的情况下,acks 设置为 0 可以达到最大的吞吐量。
    · acks=-1或acks=all。生产者在消息发送之后,需要等待ISR中的所有副本都成功写入消息之后才能够收到来自服务端的成功响应。在其他配置环境相同的情况下,acks 设置为-1(all)可以达到最强的可靠性。但这并不意味着消息就一定可靠,因为ISR中可能只有leader副本,这样就退化成了acks=1的情况。要获得更高的消息可靠性需要配合 min.insync.replicas 等参数的联动,
  2. max.request.size
    这个参数用来限制生产者客户端能发送的消息的最大值,默认值为 1048576B,即 1MB。一般情况下,这个默认值就可以满足大多数的应用场景了。笔者并不建议读者盲目地增大这个参数的配置值,尤其是在对Kafka整体脉络没有足够把控的时候。因为这个参数还涉及一些其他参数的联动,比如broker端的message.max.bytes参数,如果配置错误可能会引起一些不必要的异常。比如将broker端的message.max.bytes参数配置为10,而max.request.size参数配置为20,那么当我们发送一条大小为15B的消息时,生产者客户端就会报出如下的异常:
  3. retries和retry.backoff.ms
    retries参数用来配置生产者重试的次数,默认值为0,即在发生异常的时候不进行任何重试动作。消息在从生产者发出到成功写入服务器之前可能发生一些临时性的异常,比如网络抖动、leader副本的选举等,这种异常往往是可以自行恢复的,生产者可以通过配置retries大于0的值,以此通过内部重试来恢复而不是一味地将异常抛给生产者的应用程序。如果重试达到设定的次数,那么生产者就会放弃重试并返回异常。不过并不是所有的异常都是可以通过重试来解决的,比如消息太大,超过max.request.size参数配置的值时,这种方式就不可行了。
    重试还和另一个参数retry.backoff.ms有关,这个参数的默认值为100,它用来设定两次重试之间的时间间隔,避免无效的频繁重试。在配置 retries 和 retry.backoff.ms之前,最好先估算一下可能的异常恢复时间,这样可以设定总的重试时间大于这个异常恢复时间,以此来避免生产者过早地放弃重试。
    Kafka 可以保证同一个分区中的消息是有序的。如果生产者按照一定的顺序发送消息,那么这些消息也会顺序地写入分区,进而消费者也可以按照同样的顺序消费它们。对于某些应用来说,顺序性非常重要,比如MySQL的binlog传输,如果出现错误就会造成非常严重的后果。如果将acks参数配置为非零值,并且max.in.flight.requests.per.connection参数配置为大于1的值,那么就会出现错序的现象:如果第一批次消息写入失败,而第二批次消息写入成功,那么生产者会重试发送第一批次的消息,此时如果第一批次的消息写入成功,那么这两个批次的消息就出现了错序。一般而言,在需要保证消息顺序的场合建议把参数max.in.flight.requests.per.connection配置为1,而不是把acks配置为0,不过这样也会影响整体的吞吐。
  4. compression.type
    这个参数用来指定消息的压缩方式,默认值为“none”,即默认情况下,消息不会被压缩。该参数还可以配置为“gzip”“snappy”和“lz4”。对消息进行压缩可以极大地减少网络传输量、降低网络I/O,从而提高整体的性能。消息压缩是一种使用时间换空间的优化方式,如果对时延有一定的要求,则不推荐对消息进行压缩。
  5. connections.max.idle.ms
    这个参数用来指定在多久之后关闭限制的连接,默认值是540000(ms),即9分钟。
  6. linger.ms
    这个参数用来指定生产者发送 ProducerBatch 之前等待更多消息(ProducerRecord)加入ProducerBatch 的时间,默认值为 0。生产者客户端会在 ProducerBatch 被填满或等待时间超过linger.ms 值时发送出去。增大这个参数的值会增加消息的延迟,但是同时能提升一定的吞吐量。这个linger.ms参数与TCP协议中的Nagle算法有异曲同工之妙。
  7. receive.buffer.bytes
    这个参数用来设置Socket接收消息缓冲区(SO_RECBUF)的大小,默认值为32768(B),即32KB。如果设置为-1,则使用操作系统的默认值。如果Producer与Kafka处于不同的机房,则可以适地调大这个参数值。
  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的值要大,这样可以减少因客户端重试而引起的消息重复的概率。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_41259576/article/details/107222463

智能推荐

android 播放多个声音小,Android 支持多个VideoView声音调节_鸦零乱的博客-程序员宅基地

有个场景就是一个页面里有多个VideoView播放视频,然后每个视频都有一个音量值,但是VideoView并不支持直接设置音量,而是要通过调节系统音量来实现,那么这样的话,就不能实现为每个视频独立调节音量了我们知道MediaPlayer+SurfaceView也能实现视频的播放,并且MediaPlayer是可以直接通过setVolume来调节视频音量的,但是因为这里已经用了VideoView实现了...

hutool工具中的雪花算法_书唐瑞的博客-程序员宅基地_hutool雪花算法

如果在面试中被问及分布式唯一标识,却没有答道雪花算法,那么就有点说不过去了.关于分布式唯一标识中的雪花算法,网络上的介绍很多,它只是一个算法,可以用Python,Java等不同的语言实现它.即便是同一个语言,它的实现也有不同.美团(Leaf)百度(uid-generator)这两个也是业界比较知名的实现雪花算法的工具.然而还有一个工具类,它就是<dependency> <groupId>cn.hutool</groupId> <art.

响铃:蜗牛读书“文”、网易云信“武”:游戏之外网易的AB面_wangyishufan的博客-程序员宅基地

文|曾响铃来源|科技向令说(xiangling0815)2019年开年,网易又“搞事情”了。近日,网易集团旗下网易云信、网易七鱼主办的“网易MCtalk泛娱乐创新峰会”(以下简称“MCtalk峰会”)在北京幻艺术中心举行。从议程设置看,一边,是泛娱乐产品的内容、应用与商业模式探究(由网易蜗牛读书等产品参与分享),另一边,是技术迭代带来的产品机会交流(由网易云信等技术主体参与分享),“台前”+“幕后...

MTCNN 论文学习_calvinpaean的博客-程序员宅基地

Joint Face Detection and Alignment using Multi-task Cascaded Convolutional NetworkAbstract1. Introduction2. ApproachA. Overall FrameworkB. CNN ArchitectureC. Training3. Experiments论文地址:https://arxiv....

Android报表库aChartEngine系列(line chart)_weixin_30299539的博客-程序员宅基地

前言:  这几天本来打算对achartengine进行一些比较全面的讲解,不过考虑到它并不复杂,而且非常方便应用,加之官网提供了很好的demo不需要我们自己慢慢摸索。所以这将是aChartEngine库介绍的最后一篇文章了。在cnblogs上的阅读量上来看这方面的文章园友们并不是特别需要(毕竟简单嘛),但是为了保证aChartEngine介绍的完整性,还是坚持写完这最后一篇相关的介绍。如...

用户故事与敏捷方法笔记---用户角色建模_愿做一颗朴实无华的螺丝钉的博客-程序员宅基地

如有错误或问题请留言文章目录前言文章概览1. 用户角色2. 角色建模的步骤3. 额外的技术4. 如果有真实的用户在讨论现场,那么用户角色建模依然是必要步骤。总结前言以用户为中心的设计和交互设计的规则使我们懂得,在编写前识别用户角色和虚构人物有很多好处。这篇文章记录了用户角色,角色建模,角色映射和虚构人物并学习用这些条件编写更好的故事。接下来的所有理论都会伴随一个实际的例子,而所有例子都基于一个假想的职位发布和搜索网站。文章概览1. 用户角色 a. 首先要明白用户角色并不是一个具体的用

随便推点

多个堆糖生活家作品把GIF动态图片都下载到同一目录的方法_weixin_46021477的博客-程序员宅基地

想必大家在使用下图高手采集图片时会发出这样的感叹:“”我们从未像今天这样拥有过如此之多的照片”。移动设备和互联网的快速发展直接刺激了用户进行图片内容分享和传播的欲望。那么今天小编就以批量采集堆糖生活家GIF动图为例,教大家操作。首先,预览一下用下图高手将多个堆糖生活家GIF动图都下载到电脑的同一目录效果全部作品会被下载到一个叫“堆糖”的目录文件夹上打开“堆糖”,可看到一组GIF图片一个文件夹任选一个文件夹进去,查看某组图片,都是扩展名为GIF的动图任选一张GIF图片右击,点“..

记录一次ORA-12516 process爆满的特殊故障_久违的太阳的博客-程序员宅基地

ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理程序这两个错误很常见了,意思是oracle进程数已满了.导致oracle无法分配出process处理客户的连接.一般的解决办法就是加大process,但是我们这里却不是这种情况.客户的环境是AIX-10.2.0.4 首先在proces...

逻辑回归 — 手写代码(附详细分析)_superbfiy的博客-程序员宅基地_逻辑回归算法代码

逻辑回归(Logistic regression)三种梯度下降策略:批量梯度下降:容易得到最优解,但是由于每次考虑所有样本,速度很慢随机梯度下降:每次找一个样本,迭代速度快,但不一定每次都朝着收敛的方向小批量梯度下降:每次更新选择一小部分数据来算,实用对于 逻辑回归 不了解的,可以看看我写的这篇文章,或许可以帮助到你。URL: 逻辑回归算法-推导学习详细案例:根据学生...

深度和广度优先算法_weixin_34248487的博客-程序员宅基地

全排列的深度优先算法:#include <iostream>using namespace std;int a[10],book[10],n;void dfs(int step){ int i; if(step==n+1) { for(i=1;i<=n;i++) cout<<a[i]; cout<&...

用maven驱动搜索dom4j异常,原因分析_James.Wong的博客-程序员宅基地_org.dom4j不存在

在用dmo4j解析web.xml文件时候,在maven驱动管理网站搜索"dom4j",弹出的标签为:<dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId> <version>1.6.1</version>...