如何使用Sarama Go Kafka Consumer从最新的抵消量消费

时间:2019-07-16 13:33:48

标签: go apache-kafka kafka-consumer-api sarama

我有三个问题:

  1. “最旧的偏移量”是什么意思?最早的偏移量不等于偏移量0?
  

// OffsetOldest代表经纪人上可用的最早的偏移量
      //分区。
      OffsetOldest int64 = -2

  1. 假设

    A。在同一台计算机上运行的三个代理
    B.消费者组只有一个消费者线程
    C.使用者配置OffsetOldest标志。
    D.产生了100 msg,当前使用方线程已消耗90 msg。

    因此,如果使用者线程重新启动,那么该使用者将从哪个偏移量开始消耗?是91还是0?

  2. 在下面的代码中,似乎每次启动使用者时都会重新使用消息。但实际上并不会一直发生。为什么重新使用后仅重新启动几次(不是全部)?

     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
    }
    

1 个答案:

答案 0 :(得分:1)

  1. 否。应用保留策略后,将从主题中删除较旧的消息。因此,最早的偏移量可能不是有史以来的第一个偏移量(即0)。

  2. 这取决于您的配置。本质上,您有3个选择:

    • earliest偏移量开始消费
    • latest偏移量开始消费
    • 从特定的偏移量开始消耗
  3. 您必须使用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
    )