Scala 使用Akka流和Kafka偏移提交将事件从Kafka流式传输到Couchbase

Scala 使用Akka流和Kafka偏移提交将事件从Kafka流式传输到Couchbase,scala,apache-kafka,akka,akka-stream,alpakka,Scala,Apache Kafka,Akka,Akka Stream,Alpakka,我正试图设计一个Akka流,使用Alpakka来阅读卡夫卡主题中的事件,并将它们放到沙发上 到目前为止,我有以下代码,它似乎以某种方式工作: Consumer .committableSource(consumerSettings, Subscriptions.topics(topicIn)) .map(profile ⇒ { RawJsonDocument.create(profile.record.key(), profile.record.value

我正试图设计一个Akka流,使用Alpakka来阅读卡夫卡主题中的事件,并将它们放到沙发上

到目前为止,我有以下代码,它似乎以某种方式工作:

Consumer
      .committableSource(consumerSettings, Subscriptions.topics(topicIn))
      .map(profile ⇒ {
        RawJsonDocument.create(profile.record.key(), profile.record.value())
      })
      .via(
        CouchbaseFlow.upsertDoc(
          sessionSettings,
          writeSettings,
          bucketName
        )
      )
      .log("Couchbase stream logging")
      .runWith(Sink.seq)
不知何故,我的意思是流实际上是从主题中读取事件,并将它们作为json文档放到Couchbase中,尽管我不知道如何将消费者偏移提交到Kafka,但它看起来更漂亮

如果我已经清楚地理解了隐藏在Kafka使用者偏移背后的主要思想,那么在发生任何故障或重新启动的情况下,流将从上次提交的偏移读取所有消息,并且,由于我们没有提交任何,它可能会再次重新读取上一个会话中读取的记录

那么我的假设正确吗?如果是这样,在从Kafka读取并发布到某个数据库的情况下,如何处理使用者提交?官方的Akka Streams文档提供了一些示例,展示了如何使用普通的Kafka流处理此类情况,因此我不知道如何在我的案例中提交补偿


非常感谢

您需要在Couchbase中提交偏移量,以便获得准确的一次性语义


这应该会有帮助:

尝试在所有函数调用中传递committeableoffset,然后使用committer.sink捕获偏移量并进行写操作。到目前为止,我主要的想法是,我必须使用toMat或viaCommitter.flow向相关的sink提供committeableoffset,但问题是我无法理解可能的实现。为什么不使用Couchbase提供的Kafka Connect插件?@cricket_007我不知道,我会看一看,谢谢!你好谢谢你的回答!在这种情况下,我通常不需要精确的一次语义,我只想确保我的应用程序在重新启动后不会重新读取未限制的偏移量。