Вопрос о том, как PubSubIO работает в DataflowRunner с использованием AutoscalingAlgorithmType.THROUGHPUT_BASED
: Как PubSubIO определяет, как быстро он должен получать подписку (т. Е. Частота запросов и количество сообщений в каждом запросе)? Интересно, это связано со временем между извлечением сообщения и отправкой подтверждения?
Справочная информация : я запускаю конвейер, который извлекает сообщения из PubSub и отправляет их стороннему поставщику. Вопрос возник из-за интересного поведения, которое я наблюдал, когда запускал конвейер под двумя разными установками.
Первоначальная настройка - обрабатывать все в глобальном окне, и согласно информации, которую я получил от project.locations.jobs.get , все DoFn были объединены в один шаг. Эта настройка, однако, страдает от проблемы автоматического масштабирования, когда задание потока данных может автоматически масштабироваться для нескольких рабочих, но общая пропускная способность не была увеличена. Большое количество запросов extendAcknowledgeDeadline
также было выполнено из-за того, что подтверждение происходит только в completeBundle
.
Вторая установка заключается в добавлении MapElement
, GroupByKey
и ParDo
, которые сначала отображают строковое сообщение в KV, где и ключ, и значение являются строкой сообщения, затем GroupByKey
через фиксированное окно. 1 секунды, и окончательный анализ KV обратно на строку, сразу после PubSubIO.readStrings
. Это было предложено Документация потока данных , чтобы сломать оптимизацию Fusion, делая. Это также решило проблему автомасштабирования в исходной настройке, а также улучшило пропускную способность одного рабочего. Сообщение в этой настройке будет подтверждено почти сразу.
Это наблюдение заставляет меня задуматься о том, определяется ли пропускная способность PubSubIO.read
скоростью, с которой требуется подтверждение пакета, например, Есть фиксированное количество подключений к PubSub, и каждое подключение не будет освобождено для нового извлечения до тех пор, пока не будет подтверждено ранее извлеченное связывание.