Apache flink FlinkkinessProducer中的订购保证

Apache flink FlinkkinessProducer中的订购保证,apache-flink,flink-streaming,amazon-kinesis,Apache Flink,Flink Streaming,Amazon Kinesis,我正在使用ApacheFlink实现一个实时流式ETL管道。管道具有以下特点: 摄取单个运动流:stream-a 流具有类型为EventA的记录,这些记录具有category\u id,表示不同的逻辑流 由于这些逻辑流是如何写入到Kinesis的(每个类别id有单独的生产者,串行写入),因此FlinkKinesisConsumer Flink执行一些顺序处理工作,由category_id键入,生成EventB数据记录流 这些记录被写入到Kinesisstream-B 一个单独的服务从strea

我正在使用ApacheFlink实现一个实时流式ETL管道。管道具有以下特点:

  • 摄取单个运动流:
    stream-a
  • 流具有类型为
    EventA
    的记录,这些记录具有
    category\u id
    ,表示不同的逻辑流
  • 由于这些逻辑流是如何写入到Kinesis的(每个类别id有单独的生产者,串行写入),因此
    FlinkKinesisConsumer
  • Flink执行一些顺序处理工作,由category_id键入,生成
    EventB
    数据记录流
  • 这些记录被写入到Kinesis
    stream-B
  • 一个单独的服务从
    stream-B
    接收数据,这一点很重要,必须按顺序进行
处理过程如下所示:

val in_events = env.addSource(new FlinkKinesisConsumer[EventA]( # these are guaranteed ordered
    "stream-A", 
    new EventASchema, 
    consumerConfig))
val out_events = in_events
  .keyBy(event => event.category_id)
  .process(new EventAStreamProcessor)
out_events.addSink(new FlinkKinesisProducer[EventB](
    "stream-B",
    new EventBSchema, 
    producerConfig))
# a separate service reads the out_events and wants them in-order
根据指导原则,似乎无法保证写入接收器的
EventB
记录的顺序。
我只关心具有相同
类别id的事件是否按顺序写入,因为下游服务将按此顺序键入。从第一原则出发,如果我手动实现线程,我将为每个
category_id
KeyedStream设置一个单独的队列,并确保这些队列以串行方式写入到Kinesis(这似乎是对默认情况下所做工作的严格概括,即使用线程池,该线程池具有单个全局队列)。
FlinkkinesProducer
是否支持此机制,或者是否有办法使用Flink的
keyBy
或类似结构来绕过此限制?每个
类别的独立水槽\u id
可能吗?对于最后一个选项,我预计会有100k
category\u id
s,因此这可能会有太多的内存开销

一个选项是在下游服务中缓冲从
流-B
读取的事件,以对其进行排序(如果缓冲窗口较大,则可能性较大)。这在理论上应该是可行的,但它使下游服务比它需要的更复杂,排除了确定性,因为它依赖于网络调用的随机定时,而且更重要的是,增加了管道的延迟(尽管总体上可能比强制串行写入流B的延迟更小?)。因此,理想情况下,我希望选择另一种选择。而且,这感觉像是一个常见的问题,所以也许有更聪明的解决方案,或者我遗漏了一些显而易见的东西

非常感谢