Akka für REST-Polling

Ich versuche, eine große Scala + Akka + PlayMini-Anwendung mit einer externen REST-API zu verbinden. Die Idee ist, regelmäßig (im Allgemeinen alle 1 bis 10 Minuten) eine Stamm-URL abzufragen und dann durch URLs auf untergeordneter Ebene zu crawlen, um Daten zu extrahieren, die dann an eine Nachrichtenwarteschlange gesendet werden.

Ich habe mir zwei Möglichkeiten ausgedacht, dies zu tun:

1. Weg

Erstellen Sie eine Hierarchie von Akteuren, die der Ressourcenpfadstruktur der API entspricht. Im Fall von Google Latitude würde dies bedeuten, z.

Umfragen zum Schauspieler 'width / v1 / currentLocation'https://www.googleapis.com/latitude/v1/currentLocationSchauspielerumfragen nach Breitengrad / V1 / Orthttps://www.googleapis.com/latitude/v1/locationSchauspieler Breitengrad / v1 / Ort / 1 'Umfragenhttps://www.googleapis.com/latitude/v1/location/1Schauspieler Breitengrad / v1 / Ort / 2 'Umfragenhttps://www.googleapis.com/latitude/v1/location/2Schauspieler Breitengrad / v1 / Ort / 3 'Umfragenhttps://www.googleapis.com/latitude/v1/location/3usw.

In diesem Fall ist jeder Akteur dafür verantwortlich, seine zugeordnete Ressource regelmäßig abzufragen und untergeordnete Akteure für Pfadressourcen der nächsten Ebene zu erstellen / löschen (dh Akteur 'Latitude / v1 / Location' erstellt Akteure 1, 2, 3 usw. für alle Orte, über die es durch Abfragen von lernthttps://www.googleapis.com/latitude/v1/location).

2. Weg

Erstellen Sie einen Pool identischer Abfrageakteure, die Abfrageanforderungen empfangen (die den Ressourcenpfad enthalten), die von einem Router lastausgeglichen werden, die URL einmal abfragen, einige Verarbeitungsschritte ausführen und Abfrageanforderungen planen (sowohl für Ressourcen der nächsten Ebene als auch für die abgefragte URL). . In Google Latitude würde dies beispielsweise bedeuten:

1 Router, n Pollerschauspieler. Erstabrufanfrage fürhttps://www.googleapis.com/latitude/v1/location führt zu mehreren neuen (sofortigen) Abrufanforderungen fürhttps://www.googleapis.com/latitude/v1/location/1, https://www.googleapis.com/latitude/v1/location/2usw. und eine (verzögerte) Abfrageanforderung für dieselbe Ressource, d.h.https://www.googleapis.com/latitude/v1/location.

Ich habe beide Lösungen implementiert und kann keine relevanten Leistungsunterschiede sofort feststellen, zumindest nicht für die API und die Abfragefrequenzen, an denen ich interessiert bin. Ich finde, dass der erste Ansatz etwas einfacher zu überlegen und möglicherweise einfacher mit dem System zu verwenden ist .scheduler.schedule (...) als der zweite Ansatz (bei dem ichOnce (...) einplanen muss). Unter der Annahme, dass Ressourcen über mehrere Ebenen verschachtelt und von kurzer Dauer sind (z. B. können mehrere Ressourcen zwischen den einzelnen Abfragen hinzugefügt / entfernt werden), macht es das Lebenszyklusmanagement von akka im ersten Fall einfach, einen ganzen Zweig abzubrechen. Der zweite Ansatz sollte (theoretisch) schneller sein und der Code ist etwas einfacher zu schreiben.

Meine Fragen sind:

Welcher Ansatz scheint der beste zu sein (in Bezug auf Leistung, Erweiterbarkeit, Codekomplexität usw.)?Sehen Sie irgendetwas falsch an der Gestaltung beider Ansätze (insbesondere des ersten)?Hat jemand versucht, etwas ähnliches zu implementieren? Wie wurde es gemacht?

Vielen Dank!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage