我有三个问题:
// OffsetOldest代表经纪人上可用的最早的偏移量
//分区。
OffsetOldest int64 = -2
假设
A。在同一台计算机上运行的三个代理
B.消费者组只有一个消费者线程
C.使用者配置OffsetOldest标志。
D.产生了100 msg,当前使用方线程已消耗90 msg。
因此,如果使用者线程重新启动,那么该使用者将从哪个偏移量开始消耗?是91还是0?
在下面的代码中,似乎每次启动使用者时都会重新使用消息。但实际上并不会一直发生。为什么重新使用后仅重新启动几次(不是全部)?
func (this *consumerGroupHandler) ConsumeClaim(session
sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
for message := range claim.Messages() {
this.handler(message)
session.MarkMessage(message, "")
}
return nil
}
ctx := context.Background()
conf := sarama.NewConfig()
conf.Version = sarama.V2_0_0_0
conf.Consumer.Offsets.Initial = sarama.OffsetOldest
conf.Consumer.Return.Errors = true
consumer, err := sarama.NewConsumerGroup(strings.Split(app.Config().KafkaBrokers, ","), groupId, conf)
if err != nil {
logger.Error("NewConsumerGroupFromClient(%s) error: %v", groupId, err)
return
}
答案 0 :(得分:1)
否。应用保留策略后,将从主题中删除较旧的消息。因此,最早的偏移量可能不是有史以来的第一个偏移量(即0
)。
这取决于您的配置。本质上,您有3个选择:
earliest
偏移量开始消费latest
偏移量开始消费您必须使用sarama.OffsetOldest
。在documentation中,
const ( // OffsetNewest stands for the log head offset, i.e. the offset that will be // assigned to the next message that will be produced to the partition. You // can send this to a client's GetOffset method to get this offset, or when // calling ConsumePartition to start consuming new messages. OffsetNewest int64 = -1 // OffsetOldest stands for the oldest offset available on the broker for a // partition. You can send this to a client's GetOffset method to get this // offset, or when calling ConsumePartition to start consuming from the // oldest offset that is still available on the broker. OffsetOldest int64 = -2 )