В akka-http вы можете:
- Установите akka.http.server.max-connections, что предотвратит большее количество подключений. Превышение этого лимита означает, что у клиентов будет время ожидания соединения.
- Установите akka.http.server.pipelining-limit, который предотвращает одновременное выполнение для данного соединения большего количества невыполненных запросов. Превышение этого значения означает, что клиенты получат тайм-ауты сокетов.
Это обе формы противодавления от http-сервера к клиенту, но оба очень низкого уровня и лишь косвенно связаны с производительностью вашего сервера.
Кажется, лучше было бы противодавление на уровне http, основанное на частоте запросов, видимой сервером. Вероятно, вернув 429 - Too Many Requests. Частота запросов, возможно, также является косвенным показателем производительности, но кажется ближе, чем количество подключений.
Это кажется вполне разумным, но мне трудно найти какие-либо существующие шаблоны. Это ближайшая ссылка, которую я могу найти: https://github.com/akka/akka-http/issues/411
Из того, что я могу сказать, лучшим подходом было бы взять Flow
, в который вы превращаете свой Route
, и вставить его в граф, который имеет глобальную меру скорости запросов (или, возможно, единственную очередь обработки) и короткое замыкание, которое обходит Route
(возвращая 429 или что-то еще) полностью.
Есть идеи получше?