Я пытаюсь связать большое приложение Scala + Akka + PlayMini с внешним REST API. Идея состоит в том, чтобы периодически опрашивать (в основном каждые 1–10 минут) корневой URL-адрес, а затем сканировать URL-адреса подуровня для извлечения данных, которые затем отправляются в очередь сообщений.
Я придумал два способа сделать это:
Создать иерархию акторов в соответствии со структурой путей к ресурсам API. В случае Google Latitude это будет означать, например.
В этом случае каждый актор отвечает за периодический опрос связанного с ним ресурса, а также за создание/удаление дочерних акторов для ресурсов пути следующего уровня (т.е. latitude/v1/location» создает акторов 1, 2, 3 и т. д. для всех местоположений, о которых он узнает посредством опроса https://www.googleapis.com/latitude/v1/location).
Создайте пул идентичных субъектов опроса, которые получают запросы на опрос (содержащие путь к ресурсу) с балансировкой нагрузки маршрутизатором, один раз опрашивают URL-адрес, выполняют некоторую обработку и планируют запросы на опрос (оба для следующих ресурсы уровня и для опрашиваемого URL-адреса). В Google Latitude это будет означать, например:
1 маршрутизатор, n субъектов опроса. Первоначальный запрос на опрос для https://www.googleapis.com/latitude/v1/locationприводит к нескольким новым (немедленным) запросам на опрос для https://www.googleapis.com/latitude/ v1/location/1, https://www.googleapis.com/latitude/v1/location/2и т. д. и один (отложенный) запрос на опрос для того же ресурса, т.е. https://www.googleapis.com/latitude/v1/location.
Я реализовал оба решения и не могу сразу заметить какую-либо существенную разницу в производительности, по крайней мере, не для интересующего меня API и частот опроса. используйте с system.scheduler.schedule(...), чем второй подход (где мне нужно scheduleOnce(...)). Кроме того, предполагая, что ресурсы вложены через несколько уровней и несколько недолговечны (например, несколько ресурсов могут быть добавлены/удалены между каждым опросом), управление жизненным циклом akka позволяет легко убить целую ветку в первом случае. Второй подход (теоретически) должен быть быстрее, а код писать несколько легче.
Мои вопросы:
Спасибо!