Der Grund, warum mir das gefallen würde, ist, dass wir eine Apache Flink Java-App mit einem integrierten dynamischen Ratenbegrenzer haben. Der Ratenbegrenzer basiert auf einem Token-Bucket mit elastischer Kapazität. Wenn die App alle Token verwendet, kann der Token-Bucket mit der Zeit größer werden. Wenn die App die Token nicht verwendet, wird der Token-Bucket kleiner. Dadurch kann die Anwendung einen Anstieg der Arbeitslast ohne plötzliche Spitzen in der Verarbeitungsgeschwindigkeit bewältigen. Dies ist in unserem Zusammenhang wichtig, da einige nachgelagerte Anwendungen über eine elastische Kapazität verfügen, aber bei steigender Auslastung Zeit benötigen, um mehr Ressourcen zuzuweisen. Sie stürzen ab, wenn die Ausgabe unserer Anwendung stark ansteigt.
Der Code zum Aufrufen der Ratenbegrenzung ist wie folgt implementiert:
Code: Select all
// Rate limiting, block until a token is available.
var tokenBucket = ThreadLocalsManager.getTokenBucket(
bucketConfig,
getRuntimeContext().getNumberOfParallelSubtasks()
);
long waitTimeMs = tokenBucket.blockUntilToken();
Wenn die Anwendung jedoch aus einem anderen Grund als dem Ratenlimit einen Gegendruck erfährt, verwendet sie nicht alle ihr zur Verfügung stehenden Token. Dies führt dazu, dass der Token-Bucket schrumpft, obwohl die App in Rückstand gerät und einen Rückstand aufbaut. Wenn der Gegendruckstatus über die Flink-Java-API verfügbar wäre, könnte ich damit verhindern, dass der Token-Bucket in solchen Situationen schrumpft.