Причина, по которой мне это нравится, заключается в том, что у нас есть Java-приложение Apache Flink со встроенным в него динамическим ограничителем скорости. Ограничитель скорости построен на корзине токенов с эластичной емкостью. Если приложение использует все токены, корзина токенов со временем может увеличиться. Если приложение не использует токены, корзина токенов сжимается. Это позволяет приложению справляться с увеличением рабочей нагрузки, но без резких скачков скорости обработки. Это важно в нашем контексте, поскольку некоторые последующие приложения обладают эластичной емкостью, но им требуется время для выделения большего количества ресурсов по мере увеличения их нагрузки. Они аварийно завершают работу, если получают резкие скачки производительности нашего приложения.
Код для вызова ограничения скорости реализован следующим образом:
Код: Выделить всё
// Rate limiting, block until a token is available.
var tokenBucket = ThreadLocalsManager.getTokenBucket(
bucketConfig,
getRuntimeContext().getNumberOfParallelSubtasks()
);
long waitTimeMs = tokenBucket.blockUntilToken();
Однако, если приложение испытывает противодавление по какой-либо причине, кроме ограничения скорости, оно не будет использовать все доступные ему токены. Это приводит к сокращению корзины токенов, хотя приложение отстает и создает отставание. Если бы статус обратного давления был доступен через Flink Java API, я мог бы использовать это, чтобы предотвратить сокращение корзины токенов в таких ситуациях.
Подробнее здесь: https://stackoverflow.com/questions/793 ... ure-status
Мобильная версия