作者回复: 1. 很多流处理框架的Kafka connector都没有使用consumer group,而是直接使用standalone consumer,因为group机制不好把控
2. standalone consumer没有rebalance,也没有group提供的负载均衡,你需要自己实现。其他方面(比如位移提交)和group没有太大的不同
作者回复: 嗯,我更愿意说是max.poll.interval.ms承担了session.timeout.ms的部分功能。在没有max.poll.interval.ms和单独的心跳线程之前,如果session.timeout.ms = 5s,消息处理超过了5s,那么consumer就算是超时
作者回复: 还是要研究下你的环境中Rebalance多吗?
作者回复: 是的。使用assign的consumer就是standalone consumer
作者回复: 假设full gc导致所有线程STW,从而心跳中断,导致被踢出group,Coordinator向其他存活consumer发送心跳response,通知它们开启新一轮rebalance。
作者回复: 看着像网络连接失败导致的问题。网络没问题吗?是持续性地报警吗?
作者回复: 1. 设置相同group.id的consumer就是属于同一个group,你说的是对的:)
2. 会出现位移提交失败的问题。严格来说这其实是一个问题,但是如果反馈到社区,社区会认为这不是标准用法
作者回复: group.id是必须要设置的,否则会抛InvalidGroupIdException异常
作者回复: 还不够,你需要使用Kafka Connect组件才能实现。见:https://www.confluent.io/blog/kafka-connect-deep-dive-error-handling-dead-letter-queues
作者回复: Standalone consumer的提法并未出现在官方文档中,你可以在javadoc中看到一些:https://kafka.apache.org/23/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#manualassignment
作者回复: 不会
作者回复: 用于侦测会话超时。standalone consumer和group的区分体现在API上
作者回复: 这取决于你对如何才算处理完一条消息的定义。另外从Kafka中拿到消息后剩下的事情就完全由你负责了,因此如何计算处理时间应该是你说了算的:)