consumer使用规范

• consumer的owner线程需确保不会异常退出,避免客户端无法发起消费请求,阻塞消费。
• 确保处理完消息后再做消息commit,避免业务消息处理失败,无法重新拉取处理失败的消息。
• 通常不建议对每条消息都进行commit,如果对每条消息都进行了commit,会导致OFFSET_COMMIT请求过多,进而导致CPU使用率过高。例如:如果一个消费请求拉取1000条消息,每条都commit,则commit请求TPS是消费的1000倍,消息体越小,这个比例越大。建议隔一定条数或时间,批量commit,或打开enable.auto.commit,这样设置会存在一个缺点,即在客户端故障时,可能丢失一部分缓存的消费进度,导致重复消费。请根据业务实际情况,设置批量commit。
• consumer不能频繁加入和退出group,频繁加入和退出,会导致consumer频繁做rebalance,阻塞消费。
• consumer数量不能超过topic分区数,否则会有consumer拉取不到消息。
• consumer需周期poll,维持和server的心跳,避免心跳超时,导致consumer频繁加入和退出,阻塞消费。
• consumer拉取的消息本地缓存应有大小限制,避免OOM(Out of Memory)。
• consumer session设置为30秒,session.timeout.ms=30000。
• Kafka不能保证消费重复的消息,业务侧需保证消息处理的幂等性。
• 消费线程退出要调用consumer的close方法,避免同一个组的其他消费者阻塞sesstion.timeout.ms的时间。

producer使用规范

• 同步复制客户端需要配合使用:acks=all
• 配置发送失败重试:retries=3
• 发送优化:对于时延敏感的信息,设置linger.ms=0。对于时延不敏感的信息,设置linger.ms在100~1000之间。
• 生产端的JVM内存要足够,避免内存不足导致发送阻塞

topic使用规范

• 配置要求:推荐3副本,同步复制,最小同步副本数为2,且同步副本数不能等于topic副本数,否则宕机1个副本会导致无法生产消息。
• 创建方式:支持选择是否开启kafka自动创建Topic的开关。选择开启后,表示生产或消费一个未创建的Topic时,会自动创建一个包含3个分区和3个副本的Topic。
• 单topic最大分区数建议为100。
• topic副本数为3。

其他建议

• 连接数限制:3000
• 消息大小:不能超过10MB
• 使用sasl_ssl协议访问Kafka:确保DNS具有反向解析能力,或者在hosts文件配置kafka所有节点ip和主机名映射,避免Kafka client做反向解析,阻塞连接建立。
• 磁盘容量申请超过业务量 * 副本数的2倍,即保留磁盘空闲50%左右。
• 业务进程JVM内存使用确保无频繁FGC,否则会阻塞消息的生产和消费。