Akka для опроса REST

Я пытаюсь связать большое приложение Scala + Akka + PlayMini с внешним REST API. Идея состоит в том, чтобы периодически опрашивать (в основном каждые 1–10 минут) корневой URL-адрес, а затем сканировать URL-адреса подуровня для извлечения данных, которые затем отправляются в очередь сообщений.

Я придумал два способа сделать это:

1-й способ

Создать иерархию акторов в соответствии со структурой путей к ресурсам 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 позволяет легко убить целую ветку в первом случае. Второй подход (теоретически) должен быть быстрее, а код писать несколько легче.

Мои вопросы:

  1. Какой подход кажется лучшим (с точки зрения производительности, расширяемости, сложности кода и т. д.)?
  2. Видите ли вы что-нибудь неправильное в дизайне любого из подходов (особенно первого)?
  3. Кто-нибудь пробовал реализовать что-то подобное? Как это было сделано?

Спасибо!

12
задан Tommi 6 September 2012 в 08:07
поделиться