美西機器消費寧夏kafka集群 跨洋網絡消費 公司帶寬有限制為20m
應用消費topic多 concurrency高 兩臺機器加起來有200+線程同時消費
問題:重啟機器后 kafka rebalance期間 兩臺機器cpu同時飆高99% 跨洋專線帶寬占滿 導致服務端收不到心跳 又重新開始rebalance 進入惡性循環
原因:每次rebalance完成后,所有消費者線程獲知各自被分配的partition,同時去kafka服務器拉取消息,導致瞬間帶寬被占滿,
穩定消費時帶寬占用沒有這么高是由于各消費線程拉取消息的時機不是完全同步
解決:每次服務端kafka消費線程收到rebalance完成自己被分配的消費分區時,不馬上開始拉取消息,而是阻塞一段時間,錯開rebalance完成后第一次消費的時機,減少瞬間帶寬占用
public class MyListener extends AbstractConsumerSeekAware {
@KafkaListener(id = "xxx", topics = "yyy")
public void listen(String in) {
...
}
@Override
public void onPartitionsAssigned(Map<TopicPartition, Long> assignments, ConsumerSeekCallback callback) {
super.onPartitionsAssigned(assignments, callback);
// 線上環境 每次consumer線程被分配了消費分區之后 第一次消費前阻塞隨機時間 減少帶寬瞬間被占滿的情況
try {
String[] arr = Optional.ofNullable(onPartitionsAssignedBlockRange).orElse("0,0").split(",");
Thread.sleep(RandomUtils.nextInt(Integer.parseInt(arr[0]), Integer.parseInt(arr[1])));
} catch (InterruptedException e) {
log.error("sleep interrupted.", e);
Thread.currentThread().interrupt();
} catch (Exception e) {
log.error("onPartitionsAssigned exception", e);
}
}
}