ниже шагов показывает последовательность, в которой выполняется код
Обратите внимание, что построение топологии просто обеспечивает логическое описание программы потока данных, и нет "порядка выполнения" другой оператор. Программа будет переведена и все операторы будут выполнены одновременно. Следовательно, данные по всем темам будут считываться параллельно.
Эта параллельная обработка является причиной root вашего наблюдения, т. Е. Таблица не загружается первой до начала обработки (в по крайней мере, гарантия по умолчанию отсутствует) и, следовательно, данные на стороне потока могут быть обработаны, даже если таблица загружена не полностью.
Порядок обработки между различными топиками c зависит от меток времени записи: записи с меньшие временные метки обрабатываются первыми. Следовательно, если вы хотите убедиться, что данные KTable обрабатываются первыми, вы должны убедиться, что метки времени записи меньше, чем метки времени записи на стороне потока. Это может быть обеспечено либо при вводе входных данных во ввод topi c, либо с помощью пользовательского экстрактора меток времени.
Во-вторых, выборка данных из тем не определена c и, таким образом, если возвращаются данные только для стороны потока (но не для данных на стороне таблицы), сравнение временных меток не может быть выполнено, и, таким образом, данные на стороне потока будут обрабатываться перед данными на стороне таблицы. Чтобы решить эту проблему, вы можете увеличить параметр конфигурации max.task.idle.ms
(по умолчанию 0ms
). Если вы увеличите этот конфиг (и я считаю, что K SQL также делает это по умолчанию), если нет данных для одного ввода, задача заблокирует и попытается извлечь данные для пустого ввода (только после истечения времени простоя, обработка будет продолжаться, даже если одна сторона пуста).
Для GlobalKTable
поведение отличается. Эта таблица будет загружена при запуске до начала какой-либо обработки. Следовательно, я не уверен, почему это не сработало для вас.