childe / gohangout

使用 golang 模仿的 Logstash。用于消费 Kafka 数据,处理后写入 ES、Clickhouse 等。
MIT License
1.01k stars 234 forks source link

能否实现kafka数据的可靠消费(at least once)? #230

Open fantaxy opened 1 year ago

fantaxy commented 1 year ago

我理解需要能够手动提交(output成功后再提交),意味着需要将kafka数据每个分区使用一条管道来处理,保证能够顺序提交。 有这方面计划吗? 或者如果不这么实现,有什么办法来保证可靠消费呢?

childe commented 1 year ago

目前没有这方面的计划 :(

如果要支持这个,在当前结构上的修改会比较大。

我的理解,你不能使用正常的Group Consumer去消费,只能是自己对应 Partition 去消费以及 Commit Offset。

fantaxy commented 1 year ago

是否可以在input和worker之间加一个dispatcher插件,来将同一个Partition的事件交由同一个worker处理,这样就能保证同一个patition的数据是被顺序处理的,也就能够顺序commit。

childe commented 1 year ago

是否可以在input和worker之间加一个dispatcher插件,来将同一个Partition的事件交由同一个worker处理,这样就能保证同一个patition的数据是被顺序处理的,也就能够顺序commit。

不太好搞。我能想到的有

  1. 几个 Partition 就至少有几个 worker?
  2. 提交到后端,比如说 CK,也是多线程异步的,如果后提交的先成功了怎么办?
fantaxy commented 1 year ago
  1. 可以多个partition对应一个worker,只要保证同一个partition只由一个worker处理即可
  2. 我理解你说的这种情况可以通过将output的concurrent设为1解决?正常情况下CK的写也不应该做太高的并发
childe commented 1 year ago

然后还有一些其他问题,比如,CK Output 里面怎么调用 Input(Kafka)组件里面的方法,或者是反过来,Kafka Input 里面怎么感知 CK Output 处理到哪个 Offset了。

fantaxy commented 1 year ago

我这边来实现下,如果有需要我可以提个PR

childe commented 1 year ago

我这边来实现下,如果有需要我可以提个PR

谢谢,感觉是一个比较大的工程~ 希望是可以向前兼容的,可用户自己配置的。