繁体   English   中英

具有异步goroutine的Kafka使用者

[英]Kafka consumers with asynchronous goroutines

我正在为我的消费者使用sarama( https://github.com/Shopify/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)
    }
 }

我正在使用缓冲通道(c.sem)来控制一次可以运行多少个processJob goroutine。 这就是我控制消费者并发性/速度的方式。

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

我在consumer.properties中将autocommit.enabled设置为true,但在zookeeper中没有看到任何更改。 我认为这是因为当前的Kafka协议不支持偏移API: https : //issues.apache.org/jira/browse/KAFKA-993

处理完作业后,我可以尝试将偏移量手动存储在zookeeper中,但是我不知道如何在运行多个异步processJob的情况下使用偏移量。 Kafka应该在此处存储偏移量: https : //cwiki.apache.org/confluence/display/KAFKA/Kafka+data+structures+in+Zookeeper

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

我怀疑最简单的答案是不要为您的信号量使用频道。 使用受锁保护的整数代替,然后您可以调整最大可用goroutine,而无需重新启动。

如果您确实想继续使用此频道,则可以使用我的频道包中的ResizableChannelhttps : //godoc.org/github.com/eapache/channels#ResizableChannel

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM