ActorPublisher Akka Streams как источник веб-ответа - как работает обратное давление

Я использую актор akka-streams 'ActorPublisher в качестве потоковой передачи данных для каждого соединения Source, отправляемых на входящее соединение WebSocket или HTTP.

ActorPublisher's контракт заключается в регулярном запросе данных путем предоставления спроса - количества элементов, которые могут быть приняты нижестоящими. Я не должен отправлять больше элементов, если запрос равен 0. Я заметил, что если я буферизирую элементы, когда потребитель работает медленно, этот размер буфера колеблется от 1 до 60, но в основном около 40-50.

Для потоковой передачи я использую возможность akka-http устанавливать вывод WebSocket и данные HttpResponse на Source из Messages (или ByteStrings).

Интересно, как работает противодавление в этом случае - когда я передаю данные клиенту через сеть. Как именно рассчитываются эти числа? Проверяет ли он, что происходит на сетевом уровне?


person Tvaroh    schedule 13.06.2017    source источник
comment
Я думаю, что уровень ввода-вывода akka-streams делегирует обратное давление TCP, но у меня нет доказательств - код ввода-вывода мне слишком сложно расшифровать :(   -  person Vladimir Matveev    schedule 14.06.2017


Ответы (1)


Самое близкое, что я смог найти для вашего вопроса «как работает противодавление в этом случае», - это документация:

Akka HTTP осуществляет потоковую передачу на всем пути, что означает, что механизмы противодействия, включенные Akka Streams, доступны на всех уровнях - от уровня TCP, через HTTP-сервер, вплоть до обращенных к пользователю HttpRequest и HttpResponse и их HttpEntity API.

Что касается "того, как рассчитываются эти числа", я считаю, что это указано в настройках конфигурации.

person Ramón J Romero y Vigil    schedule 06.09.2017