Apache kafka 使用Alpakka将1个输入连接到n个输出

Apache kafka 使用Alpakka将1个输入连接到n个输出,apache-kafka,akka-stream,alpakka,Apache Kafka,Akka Stream,Alpakka,我正在尝试将生产者与消费者连接起来的一些变体,在特殊情况下,有时我需要为每条消息生成一条额外的消息(例如,一条消息到输出主题,一条消息到另一个主题),同时保证这一点 我正在考虑执行mapConcat并输出多个ProducerRecord对象,我担心在边缘情况下,第一条消息足以在该偏移量上进行提交,从而导致第二条消息的潜在丢失。此外,您似乎不能只执行.flatmap,因为您将进入graph API,这会变得更加混乱,因为一旦合并到提交流中,就很难确保您不会忽略重复的偏移量 Consumer.com

我正在尝试将生产者与消费者连接起来的一些变体,在特殊情况下,有时我需要为每条消息生成一条额外的消息(例如,一条消息到输出主题,一条消息到另一个主题),同时保证这一点

我正在考虑执行mapConcat并输出多个ProducerRecord对象,我担心在边缘情况下,第一条消息足以在该偏移量上进行提交,从而导致第二条消息的潜在丢失。此外,您似乎不能只执行.flatmap,因为您将进入graph API,这会变得更加混乱,因为一旦合并到提交流中,就很难确保您不会忽略重复的偏移量

Consumer.committableSource(consumerSettings, Subscriptions.topics(inputTopic))
  .map(msg => (msg, addLineage(msg.record.value())))
  .mapConcat(input => 
    if (math.random > 0.25) 
      List(ProducerMessage.Message(
        new ProducerRecord[Array[Byte], Array[Byte]](outputTopic, input._1.record.key(), input._2),
        input._1.committableOffset
      ))
    else List(ProducerMessage.Message(
      new ProducerRecord[Array[Byte], Array[Byte]](outputTopic, input._1.record.key(), input._2),
      input._1.committableOffset
    ),ProducerMessage.Message(
      new ProducerRecord[Array[Byte], Array[Byte]](outputTopic2, input._1.record.key(), input._2),
      input._1.committableOffset
    ))
  )
  .via(Producer.flow(producerSettings))
  .map(_.message.passThrough)
  .batch(max = 20, first => CommittableOffsetBatch.empty.updated(first)) {
    (batch, elem) => batch.updated(elem)
  }
  .mapAsync(parallelism = 3)(_.commitScaladsl())
  .runWith(Sink.ignore)
原始1对1文档如下所示:


有人想过/解决过这个问题吗?

阿尔帕克卡·卡夫卡连接器最近引入了支持您的用例的
flexiFlow
:阿尔帕克卡·卡夫卡连接器最近引入了支持您的用例的
flexiFlow

不清楚为什么
mapConcat
不是解决方案。什么是“宽松的保证”?@RamonjRomeryVigil的代码示例是什么?@RamonjRomeryVigil它用于处理这样一种情况:您将消息分为两条,先发送第一条消息,然后应用程序失败,因此在可能提交第一条消息时无法发送第二条消息(因此两条消息都有)。不清楚为什么
mapConcat
不是解决方案。什么是“宽松的保证”?@RamonjRomeryVigil的代码示例是什么?@RamonjRomeryVigil用于处理这样一种情况,即您将消息分为两条,先发送第一条消息,然后应用程序失败,因此在可能提交第一条消息时无法发送第二条消息(因此两条消息都有)。我不太清楚,你是说你应该能够flexiflow,然后再次生成,然后第二次flexiflow来最终提交?关于这一点,没有明确的例子,至少对我来说,也不是很清楚flexiFlow的真正意义是什么。不,flexiFlow接受ProducerMessage.MultiMessage,其中可能包含要生成的ProducerRecords列表(甚至是多个主题)。这对我来说不是很清楚,你是说你应该能够flexiflow,然后再次生成,然后第二次flexiflow来最终提交?关于这一点,没有明确的例子,至少对我来说,也不是很清楚flexiFlow的确切意义。不,flexiFlow接受ProducerMessage.MultiMessage,其中可能包含要生成的ProducerRecords列表(甚至多个主题)。