Отправляются ли потоковые сообщения Flink в нижестоящие по порядку

#apache-flink

Вопрос:

Я новичок в Флинке. У меня есть вопрос, все ли сообщения, отправленные на нижестоящие узлы, в порядке? Например,

 [Stream] -> [DownStream]

Stream: [1,2,3,4,5,6,7,8,9]

Downstream get [3,2,1,4,5,7,6,8,9]
 

Если да, то как нам вести это дело, если мы хотим, чтобы оно было в порядке?

Любая помощь будет очень признательна!

Ответ №1:

Оператор может иметь несколько входных каналов. Он будет обрабатывать события из каждого канала в том порядке, в котором они были получены. (Операторы также могут иметь несколько выходных каналов.)

Если в вашей работе есть более одного пути между потоком и потоком вниз по течению, то события могут разыграться, и порядок будет недетерминированным. В противном случае заказ будет сохранен.

Пример: Предположим, что вы параллельно читаете тему Кафки с несколькими разделами. Далее представьте, что все события от данного пользователя находятся в одном и том же разделе Кафки (и упорядочены по метке времени для каждого пользователя). Затем в Flink вы можете использовать keyBy(user) и быть уверены, что поток событий для каждого пользователя останется в порядке. С другой стороны, если события для данного пользователя распределены по нескольким разделам, то keyBy(user) в конечном итоге для каждого пользователя будет создан поток событий, который (почти наверняка) не в порядке, потому что он будет объединять события из нескольких разных FlinkKafkaConsumer экземпляров, которые читаются параллельно.

Комментарии:

1. Большое спасибо! Как насчет другого дела? Допустим, у нас есть сообщения от Кафки [1, 2]. Это будет распределено по двум разделам потребителей кафки. Таким образом, в одном разделе есть [1], а в другом — [2]. Когда эти два раздела будут выдавать данные, будет ли функция нисходящего потока всегда видеть [1, 2], если мы не используем keyBy() ?

2. Кафка гарантирует упорядочение только в пределах одного раздела. Таким образом, с двумя разделами все ставки отменяются.