Asynchronous 具有异步goroutine的Kafka使用者

Asynchronous 具有异步goroutine的Kafka使用者,asynchronous,go,apache-kafka,Asynchronous,Go,Apache Kafka,我正在为我的消费者使用sarama和Kafka 0.8.0。这就是我的代码的样子: consumerLoop: for { select { case event := <-consumer.Events(): if event.Err != nil { break consumerLoop panic(event.Err) } <-c.sem go

我正在为我的消费者使用sarama和Kafka 0.8.0。这就是我的代码的样子:

consumerLoop:
for {
    select {
        case event := <-consumer.Events():
        if event.Err != nil {
            break consumerLoop
            panic(event.Err)
        }
        <-c.sem
        go c.processJob(event.Value)
    }
 }
我使用缓冲channelsc.sem来控制一次可以运行多少processJob goroutine。这就是我如何控制消费者的并发性/速度

这种方法的问题是,如果需要更改并发性,必须关闭使用者并重新启动它通道缓冲区大小是命令行标志。我记录处理的偏移量,并且我必须查看我的日志,以确定处理了哪些偏移量以及我希望消费者从何处恢复。我想要一种更免提的方法来管理这些偏移

我已在consumer.properties中将autocommit.enabled设置为true,但在zookeeper中未看到任何更改。我认为这是因为当前的卡夫卡协议不支持偏移API:

在处理完一个作业后,我可以尝试在zookeeper中手动存储偏移量,但我不知道在运行多个异步processJob时该如何处理。 卡夫卡应该在这里存储偏移:


这应该是一个值吗?如果这是真的,那就意味着我不能使用异步processJob,因为不同进程之间可能存在延迟,它们会覆盖彼此的值。消费者是否应该在单个线程中运行,并一次处理单个事件?启动更多消费者来加快速度,而不是走goroutines路线,这是正确的方法吗?

我认为最简单的答案是不要使用信号灯通道。改为使用受锁保护的整数,然后可以调整最大可用goroutine,而无需重新启动


如果您真的想继续使用频道进行此操作,您可以使用我的频道包中的可调整大小的频道:

>我记录已处理的偏移量,我必须查看日志,找出已处理的偏移量以及我希望消费者从何处恢复那么,您如何手动选择从哪个偏移开始呢?Sarama的consumer config有一个OffsetMethodManual值,它允许您传入开始偏移值这么多代码。。。它与此等价:for event:=范围使用者.Events{if event.Err!=nil{break};@psyb0rg我的意思是,您有一个带有写入偏移量的日志文件。由于并行性,日志中最后写入的偏移量或最大偏移量可能比仍在进行的偏移量大。因此,如果您只是从日志中选择最大的偏移量,可能会丢失一些消息。那么如何从日志文件中选择偏移量开始?@Kluyq,你是对的。我不是从最大的偏移开始的,我会返回一些偏移,所以我很有可能得到所有的偏移。我可以接受一些重新处理和删除的事件。这也是我希望通过正确的偏移跟踪来解决的问题。