springboot + @KafkaListener 手動提交及消費能力優化

public class KonkaKafkaListener {

    private final static Logger LOGGER = LoggerFactory.getLogger(KonkaKafkaListener.class);


    @Autowired
    private RouterService routerService;


    @KafkaListener(containerFactory = "kafkaListenerContainerFactory", topics = "test")
    public void consumerListener(List<ConsumerRecord> consumerRecords, Acknowledgment ack) {
        ack.acknowledge();//直接提交offset
        if (consumerRecords.size() > 0) {
            PartitionCounter.addCounter(consumerRecords.get(0).partition(), consumerRecords.size());
        }
        Iterator<ConsumerRecord> iterator = consumerRecords.iterator();
        while (iterator.hasNext()) {
            ConsumerRecord consumerRecord = iterator.next();
            String key = consumerRecord.key().toString();
            KafkaLogMessage kafkaLogMessage = (KafkaLogMessage) consumerRecord.value();
            if (kafkaLogMessage == null) {
                continue;
            }
            routerService.handleKafkaMessage(key, kafkaLogMessage);
        }
    }
#消費者併發啓動個數(對應分區個數)每個listener方法
kafka.concurrency=10  

將啓動器的併發提高到和分區數一致

 

kafka 消費能力的提高

1、自動提交的實現

2、autoCommitIntervalMs 設置每次隔多久自動提交offset

3、kafka.max.poll.interval.ms 和 sessionTimeout

max.poll.interval.ms ,它表示最大的poll數據間隔,如果超過這個間隔沒有發起pool請求,但heartbeat仍舊在發,就認爲該consumer處於 livelock狀態。就會將該consumer退出consumer group

之後就會觸發導致reblance

·heartbeat.interval.ms

心跳間隔。心跳是在consumer與coordinator之間進行的。心跳是確定consumer存活,加入或者退出group的有效手段。

    這個值必須設置的小於session.timeout.ms,因爲:

當Consumer由於某種原因不能發Heartbeat到coordinator時,並且時間超過session.timeout.ms時,就會認爲該consumer已退出,它所訂閱的partition會分配到同一group 內的其它的consumer上。

    通常設置的值要低於session.timeout.ms的1/3。

    默認值是:3000 (3s)

·session.timeout.ms

Consumer session 過期時間。這個值必須設置在broker configuration中的group.min.session.timeout.ms 與 group.max.session.timeout.ms之間。

其默認值是:10000 (10 s)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章