🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
1. **`enable.auto.commit`** 指定了消费者是否自动提交偏移量,默认值是 true,为了尽量避免重复数据和数据丢失,可以把它设置为 false,有自己控制合适提交偏移量,如果设置为true,可以通过设置 auto.commit.interval.ms 属性来控制提交的频率。 2. **`auto.offset.reset`** 该参数指定了消费者在读取一个没有 Offset 或者 Offset 无效(消费者长时间失效,当前的 Offset 已经过时并且被删除了)的分区的情况下,应该作何处理,默认值是 latest,也就是从最新记录读取数据(消费者启动之后生成的记录),另一个值是 earliest,意思是在偏移量无效的情况下,消费者从起始位置开始读取数据。 3. **`session.timeout.ms`** 该参数指定了当消费者被认为已经挂掉之前可以与服务器断开连接的时间。默认是 3s,消费者在 3s 之内没有再次向服务器发送心跳,那么将会被认为已经死亡。此时,协调器将会触发再均衡,把它的分区分配给其他的消费者,该参数与 heartbeat.interval.ms 紧密相关,该参数定义了消费者发送心跳的时间间隔,也就是心跳频率,一般要同时修改这两个参数,heartbeat.interval.ms 参数值必须要小 于 session.timeout.ms ,一般是 session.timeout.ms 的三分之一,比如,session.timeout.ms 设置成 3min,那么 heartbeat.interval.ms 一般设置成 1min,这样,可以更快的检测以及恢复崩溃的节点,不过长时间的轮询或垃圾收集可能导致非预期的再均衡(有一种情况就是网络延迟,本身消费者是没有挂掉的,但是网络延迟造成了心跳超时,这样本不该发生再均衡,但是因为网络原因造成了非预期的再均衡),把该参数的值设置得大一些,可以减少意外的再均衡,不过检测节点崩溃需要更长的时间。 4. **`max.partition.fetch.bytes`** 该参数指定了服务器从每个分区里返回给消费者的最大字节数。它的默认值是 1MB,也就是说,KafkaConsumer.poll()方法从每个分区里返回的记录最多不超 max.partitions.fetch.bytes 指定的字节。如果一个主题有 20 个分区和 5 个消费者,那么每个消费者需要至少 4MB 的可用内存来接收记录。在为消费者分配内存时,可以给它们多分配一些,因为如果群组里有消费者发生崩溃,剩下的消费者需要处理更多的分区。max.partition.fetch.bytes 的值必须比 Broker 能够接收的最大消息的字节数(通过 max.message.size 属性配置)大, 否则消费者可能无法读取这些消息,导致消费者一直挂起重试,例如,max.message.size 设置为 2MB,而该属性设置为 1MB,那么当一个生产者可能就会生产一条大小为 2MB的消息,那么就会出现问题,消费者能从分区取回的最大消息大小就只有 1MB,但是数据量是 2MB,所以就会导致消费者一直挂起重试。 在设置该属性时,另一个需要考虑的因素是消费者处理数据的时间。消费者需要频繁调用 poll()方法来避免会话过期和发生分区再均衡,如果单次调用 poll()返回的数据太多,消费者需要更多的时间来处理,可能无怯及时进行下一个轮询来避免会话过期。如果出现这种情况,可以把 max.partitioin.fetch.bytes 值改小,或者延长会话过期时间。 5. **`fetch.min.bytes`** 消费者从服务器获取记录的最小字节数,Broker 收到消费者拉取数据的请求的时候,如果可用数据量小于设置的值,那么 Broker 将会等待有足够可用的数据的时候才返回给消费者,这样可以降低消费者和 Broker 的工作负载。因为当主题不是很活跃的情况下,就不需要来来回回的处理消息,如果没有很多可用数据,但消费者的CPU 使用率却很高,那么就需要把该属性的值设得比默认值大。如果消费者的数量比较多,把该属性的值设置得大一点可以降低 Broker 的工作负载。 6. **`fetch.max.wait.ms`** fetch.min.bytes 设置了 Broker 返回给消费者最小的数据量,而fetch.max.wait.ms 设置的则是Broker的等待时间,两个属性只要满足了任何一条,Broker 都会将数据返回给消费者,也就是说举个例子,fetch.min.bytes 设置成 1MB,fetch.max.wait.ms 设置成 1000ms,那么如果在 1000ms 时间内,如果数据量达到了 1MB,Broker 将会把数据返回给消费者;如果已经过了 1000ms,但是数据量还没有达到 1MB,那么 Broker 仍然会把当前积累的所有数据返回给消费者。 7. **`receive.buffer.bytes + send.buffer.bytes`** socket 在读写数据时用到的 TCP 缓冲区也可以设置大小。如果它们被设为-1 ,就使用操作系统的默认值。如果生产者或消费者与 broker 处于不同的数据中心内,可以适当增大这些值,因为跨数据中心的网络一般都有比较高的延迟和比较低的带宽。 8. **`client.id`** Consumer 进程的标识。如果设置成人为可读的值,跟踪问题会比较方便。