更新时间:2022-12-05 GMT+08:00

客户端参数配置建议

Kafka客户端的配置参数很多,以下提供Producer和Consumer几个常用参数配置。

表1 Producer参数

参数

默认值

推荐值

说明

acks

1

高可靠:all

高吞吐:1

收到Server端确认信号个数,表示procuder需要收到多少个这样的确认信号,算消息发送成功。acks参数代表了数据备份的可用性。常用选项:

  • acks=0:表示producer不需要等待任何确认收到的信息,副本将立即加到socket buffer并认为已经发送。没有任何保障可以保证此种情况下server已经成功接收数据,同时重试配置不会发生作用(因为客户端不知道是否失败),回馈的offset会总是设置为-1。
  • acks=1:这意味着至少要等待leader已经成功将数据写入本地log,但是并没有等待所有follower是否成功写入。如果follower没有成功备份数据,而此时leader又无法提供服务,则消息会丢失。
  • acks=all:这意味着leader需要等待所有备份都成功写入日志,只有任何一个备份存活,数据都不会丢失。

retries

0

结合实际业务调整

客户端发送消息的重试次数。值大于0时,这些数据发送失败后,客户端会重新发送。

注意,这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。

request.timeout.ms

30000

结合实际业务调整

设置一个请求最大等待时间,超过这个时间则会抛Timeout异常。

超时时间如果设置大一些,如120000(120秒),高并发的场景中,能减少发送失败的情况。

block.on.buffer.full

TRUE

TRUE

TRUE表示当我们内存用尽时,停止接收新消息记录或者抛出错误。

默认情况下,这个设置为TRUE。然而某些阻塞可能不值得期待,因此立即抛出错误更好。如果设置为false,则producer抛出一个异常错误:BufferExhaustedException

batch.size

16384

262144

默认的批量处理消息字节数上限。producer将试图批处理消息记录,以减少请求次数。这将改善client与server之间的性能。不会试图处理大于这个字节数的消息字节数。

发送到brokers的请求将包含多个批量处理,其中会包含对每个partition的一个请求。

较小的批量处理数值比较少用,并且可能降低吞吐量(0则会仅用批量处理)。较大的批量处理数值将会浪费更多内存空间,这样就需要分配特定批量处理数值的内存大小。

buffer.memory

33554432

67108864

producer可以用来缓存数据的内存大小。如果数据产生速度大于向broker发送的速度,producer会阻塞或者抛出异常,以“block.on.buffer.full”来表明。

这项设置将和producer能够使用的总内存相关,但并不是一个硬性的限制,因为不是producer使用的所有内存都是用于缓存。一些额外的内存会用于压缩(如果引入压缩机制),同样还有一些用于维护请求。

表2 Consumer参数

参数

默认值

推荐值

说明

auto.commit.enable

TRUE

FALSE

如果为TRUE,consumer所fetch的消息的offset将会自动的同步到zookeeper。这项提交的offset将在进程无法提供服务时,由新的consumer使用。

约束: 设置为FALSE后,需要先成功消费再提交,这样可以避免消息丢失。

auto.offset.reset

latest

earliest

没有初始化offset或者offset被删除时,可以设置以下值:

earliest:自动复位offset为最早

latest:自动复位offset为最新

none:如果没有发现offset则向消费者抛出异常

anything else:向消费者抛出异常。

connections.max.idle.ms

600000

30000

空连接的超时时间,设置为30000可以在网络异常场景下减少请求卡顿的时间。