kafka使用经验
2020-03-15 本文已影响0人
知而乐者
- 当consumer重平衡时,可能导致重复消费,如:consumer1拉取了100数据,当消费过程中服务停掉,就会重平衡导致重复消费,所以多台应用在重新部署应用的时候可能导致重复消费,解决方法,使用钩子:
// 判断是否已经关闭
AtomicBoolean isRunning = new AtomicBoolean(true);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
try {
isRunning.compareAndSet(true, false);
shutdownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}));
while (isRunning.get()) {
//执行代码
//
consumer.commitSync();
}
shutdownLatch.countDown();
}
-
重平衡的时候如果一个consumer正在处理拉取的数据,那么其他consumer会等consumer执行的时候才会重平衡完成(只有执行poll方法的时候才会触发重平衡,发送sendJoinGroupRequest的请求),其他consumer等待超过一定时间后会忽略这个consumer(默认是5分钟)
-
一个topic每个分区在两个broker都有副本,那么一台broker挂掉后不会对消费者有任何影响,组协调器会自动迁到正常的borker中
如:kakfa集群有2个broker,topic test100有两个分区,每个分区有两个副本,此时消费者组中有三个消费者(有一个会订阅不到任何分区),消费者拉取了一批消息正在消费,此时如果broker中任意一台挂掉,不会对消费者有任何影响,各个消费则消费的分区页不会改变,消费成功后提交位移也是正常的 -
如果,两台broker有一台挂掉后,topic无法正常消费,可能是topic副本为1,或者__consumer_offsets主题的副本为1