1、一个kafka分区会一直对应一个消费者线程,一个消费者线程会一直对应这几个kafka分区。除非消费者数量变更,分区和消费者的对应关系才会发生变更。
2、kafka消费者线程数量要小于等于分区数,不然会造成消费者资源浪费。
3、spring+kafka的话,推荐使用 @KafkaListener的写法 ,可参考https://www.jianshu.com/p/a64defb44a23,通过设置
factory.setBatchListener(true); //批量消费
factory.getContainerProperties().setAckMode(AbstractMessageListenerContainer.AckMode.MANUAL_IMMEDIATE); // Kafka的Ack机制 - 手动提交
kafkaConsumerConfigs.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
这些配置,可以实现批量消费,手动提交偏移量(ack.acknowledge(); ),代码和设计上都更加优美。
注意点:
1)业务逻辑try...catch(Throwable e){},不能让业务异常影响到kafka的接收
2)打详细的异常日志,可追溯补偿
3)发生异常后需要邮件或者其他措施通知到开发者
4、kafka因为分区等原因,时序性无法得到保证,需要业务方发送数据时,多一个判别顺序字段(别用时间戳),下游可以通过这个字段判断消息的先后顺序。