Apache flink FlinkkinessProducer中的订购保证
我正在使用ApacheFlink实现一个实时流式ETL管道。管道具有以下特点: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
- 摄取单个运动流:
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
可能吗?对于最后一个选项,我预计会有100kcategory\u id
s,因此这可能会有太多的内存开销
一个选项是在下游服务中缓冲从流-B
读取的事件,以对其进行排序(如果缓冲窗口较大,则可能性较大)。这在理论上应该是可行的,但它使下游服务比它需要的更复杂,排除了确定性,因为它依赖于网络调用的随机定时,而且更重要的是,增加了管道的延迟(尽管总体上可能比强制串行写入流B的延迟更小?)。因此,理想情况下,我希望选择另一种选择。而且,这感觉像是一个常见的问题,所以也许有更聪明的解决方案,或者我遗漏了一些显而易见的东西
非常感谢