Как сделать обратное давление на уровне запроса akka-http?

В akka-http вы можете:

  1. Установите akka.http.server.max-connections, что предотвратит большее количество подключений. Превышение этого лимита означает, что у клиентов будет время ожидания соединения.
  2. Установите akka.http.server.pipelining-limit, который предотвращает одновременное выполнение для данного соединения большего количества невыполненных запросов. Превышение этого значения означает, что клиенты получат тайм-ауты сокетов.

Это обе формы противодавления от http-сервера к клиенту, но оба очень низкого уровня и лишь косвенно связаны с производительностью вашего сервера.

Кажется, лучше было бы противодавление на уровне http, основанное на частоте запросов, видимой сервером. Вероятно, вернув 429 - Too Many Requests. Частота запросов, возможно, также является косвенным показателем производительности, но кажется ближе, чем количество подключений.

Это кажется вполне разумным, но мне трудно найти какие-либо существующие шаблоны. Это ближайшая ссылка, которую я могу найти: https://github.com/akka/akka-http/issues/411

Из того, что я могу сказать, лучшим подходом было бы взять Flow, в который вы превращаете свой Route, и вставить его в граф, который имеет глобальную меру скорости запросов (или, возможно, единственную очередь обработки) и короткое замыкание, которое обходит Route (возвращая 429 или что-то еще) полностью.

Есть идеи получше?


person randomstatistic    schedule 13.10.2017    source источник
comment
comment
Не совсем. Предполагая, что управление потоком - лучший способ, я не хочу ограничивать скорость потока, потому что это вызовет обратное давление на соединения и сеть. Я хочу выполнить некоторые запросы немедленно, используя другой механизм, в зависимости от скорости. Хм, возможно, это то, что можно было бы встроить в Маршрут / Директиву.   -  person randomstatistic    schedule 16.10.2017