Блокировка ввода-вывода в Akka

В последнее время я использую Akka и задаюсь вопросом: могу ли я заблокировать ввод-вывод в Akka, не создавая больших проблем? Допустим, у нас есть Actor, который выполняет некоторую блокировку ввода-вывода, потому что он использует устаревшую библиотеку или по любой другой причине: не мог бы я просто использовать специальный диспетчер для тех Actors, которые имеют ThreadPool разумного размера и блокируют ввод-вывод без блокирует всех остальных участников, потому что они работают с другим диспетчером?

Какие у этого недостатки? И каков был бы оптимальный способ вызова стороннего HTTP-API от актера?


person Malax    schedule 28.02.2012    source источник


Ответы (1)


Блокирование ввода-вывода - плохая идея в целом и в реактивной многопоточной среде в частности, поэтому ваш первый шаг - попытаться полностью избежать этого, что означает изучение использования AsyncHttpClient или HttpAsyncClient.

Если это не сработает, вы можете по крайней мере снизить риски, предоставив блокирующим субъектам их собственные потоки. Это, конечно, будет дорого стоить, и вы все равно рискуете заполнить их почтовые ящики, но таков выбор использования блокировки ввода-вывода.

Вы также можете посмотреть на модуль IO Actor, чтобы получить более простой интерфейс для сетевого ввода-вывода.

Надеюсь, что это поможет,

Ура, √

person Viktor Klang    schedule 28.02.2012
comment
А как насчет использования будущего внутри актера? - person sourcedelica; 29.02.2012
comment
Вы по-прежнему собираетесь блокировать потоки, которых у вас не бесконечное количество. Актеры или будущее - не проблема. - person Viktor Klang; 29.02.2012
comment
Ненавижу спрашивать, есть ли пример использования HTTP-вызовов в качестве клиента от актера, я мог найти только тот, который использует будущее и ожидает его, что также блокирует поток. - person Malax; 29.02.2012
comment
Просто зарегистрируйте обработчик завершения или что-то вроде этого, например, что-то вроде этого: http://asynchttpclient.github.com/async-http-client/apidocs/com/ning/http/client/AsyncCompletionHandler.html - person Viktor Klang; 29.02.2012
comment
Но разве у вас все еще нет проблемы с тем, откуда async-http-client получает поток для выполнения обратного вызова? Т.е. разве вам не нужно предоставлять библиотеке пул потоков - тот, который, вероятно, использует ваш диспетчер akka? В противном случае библиотека должна создавать собственные потоки, верно? то есть я думаю, что это то, что https://github.com/sonatype/async-http-client/pull/7 достигает. Есть клиент Spray github.com/spray/spray/wiki/spray-client но он ориентирован на Scala. - person Antony Stubbs; 18.04.2012
comment
@ViktorKlang Я согласен с Антонти выше, вопрос в том, можете ли вы отправлять сообщения из этой функции обратного вызова (которая может выполняться в отдельном потоке)? - person McHalls; 09.07.2012