作者回复: 其实不冲突。如果ISR中只有1个副本了,acks=all也就相当于acks=1了,引入min.insync.replicas的目的就是为了做一个下限的限制:不能只满足于ISR全部写入,还要保证ISR中的写入个数不少于min.insync.replicas。
作者回复: 如果你配置了auto.offset.reset=latest就会这样的
作者回复: 写过一两篇,https://www.cnblogs.com/huxi2b/p/7089854.html,
但总觉得不太完美。如果你想深入了解的话,推荐读一下Flink Kafka Connector的源码
作者回复: 通常情况下能够保障每个consumer消费一个分区。如果消费慢,需要看到底是哪里慢?是Kafka给你消息的速度慢还是你自己处理消息的速度慢。可以适当增加max.poll.interval.ms看看
作者回复: 1. 不是。如果配置了retries,即使调用send(msg)也是会重试的。这是Kafka producer自己实现的机制,不需要用户干预
2. Broker发送response给producer,里面会保存error信息以及那个(些)batch出错了
作者回复: acks=all表示消息要写入所有ISR副本,但没要求ISR副本有多少个。min.insync.replicas做了这样的保证
作者回复: 嗯嗯,是的。本来就是为了更强的消息持久化保证,只能牺牲一点高可用性了~~
作者回复: min.insync.replicas是保证下限的。acks=all的含义是producer会等ISR中所有副本都写入成功才返回,但如果不设置min.insync.replicas = 5,默认是1,那么假设ISR中只有1个副本,只要写入这个副本成功producer也算其正常写入,因此min.insync.replicas保证的写入副本的下限。
作者回复: 是因为不满足min.insync.replicas的要求了。比如该参数=2,当前ISR中只剩1个副本了,那么producer就没法生产新的消息了。
作者回复: 只要位移没有越界以及有提交的位移,那么就不会出现这种场景。
作者回复: 不生效,min.insync.replicas只有在acks=-1时才生效
作者回复: callback可以处理消息发送之后的逻辑,不一定就是失败的逻辑。retries是预防那种瞬时错误的,比如网络抖动这种问题,让Kafka自动重试一下会比较方便不是吗
作者回复: 在生产者服务器上生成的。个人感觉不可以,毕竟每个producer服务器上的时钟不是实时同步的。事实上,用时钟来保证同步性是一件非常不靠谱的事情