
# 客户端参数配置建议
Kafka客户端的配置参数很多，以下提供Producer和Consumer几个常用参数配置。
表1Producer参数 
| **参数**               | **默认值**  | **推荐值**                                   | **说明**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
|:---|:---|:---|:---|
| 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使用的所有内存都是用于缓存。一些额外的内存会用于压缩（如果引入压缩机制），同样还有一些用于维护请求。                                                                                                                                                                                                                                                                                                                                                                                                                                           |
| max.request.size     | 1048576  | 5242880                                   | 生产者给服务端单次发送的最大消息字节数，该参数影响单次生产的消息记录数量。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
   
表2Consumer参数 
| **参数**                  | **默认值** | **推荐值**  | **说明**                                                                                                                                                                                                                                                      |
|:---|:---|:---|:---|
| 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可以在网络异常场景下减少请求卡顿的时间。                                                                                                                                                                                                                       |
   
