2012-06-27 4 views
10

Ich bin ziemlich neu in der Programmierung mit dem Play-Framework sowie Akka, obwohl ich habe über sie gelesen für eine Weile. Ich starte jetzt eine Proof-of-Concept-Anwendung in der Standard/Basic-Play-Umgebung. Meine Frage stammt von dem Web Service Client API in Play (http://www.playframework.org/documentation/2.0/ScalaWS).Verwenden von Akka, um Web-Service-Anrufe von Play App

Diese Anwendung muss Anrufe auf einem Remote-SOAP-Webdienst so skalierbar und performant wie möglich vermitteln. Der Browser macht Ajax-Aufrufe in JSON, die Play-App muss sie in SOAP/XML und umgekehrt in die Antwort umwandeln.

Wenn ich den Play-Web-Service-Client direkt über den Controller verwendet habe, können diese Aufrufe asynchron sein, was viel besser ist als das, was wir jetzt tun (Blockierung). Mir ist jedoch nicht klar, wie sich das genau unter schwerer Last verhalten würde. Wird das Nebeneinander/Thread-Management weitgehend dem zugrundeliegenden Netty-Server überlassen? Kann ich es irgendwie tunen? Eine Alternative wäre, ein Akka-Actor-System von den Controllern zu verwenden, wo ich die Routing-Richtlinie, die Poolgröße, Fehlertoleranz usw. steuern kann. Wenn ich diesen Ansatz anwende, wäre es immer noch sinnvoll, Play async WS zu verwenden Klient? Wenn ja, wäre dieser Ansatz (des Komponierens von Futures?) Das empfohlene Muster? Ein weiterer Faktor, der den Akka - Ansatz attraktiver erscheinen lässt, ist, dass diese Anwendung letztendlich mehrere andere Verantwortlichkeiten haben würde, so dass wir die Ressourcen dieses ActorSystems kontrollieren/abstimmen und das Risiko reduzieren könnten, dass die gesamte App vom Server gezogen wird SOAP-Dienst.

Antwort

5

Die beiden Optionen sind detailliert funktionieren würde:

  • die Play-API für WS Anfragen/Antworten asynchron die gleiche Sache
  • Verwenden Akka zu handhaben tun und Ihre WS Anruf synchron in Ihrem Schauspieler verwalten

Erstens gibt es keine richtige oder falsche Lösung.

Das Spiel! Die WS API-Lösung ist am einfachsten zu implementieren und zu testen. Viele Leute in der Gemeinschaft verlassen sich darauf (tue ich).

Auf der anderen Seite, auch wenn die Akka-Lösung schwerer (nicht so viel) aufzusetzen scheint, bringt es Ihnen mehr Flexibilität in der Zukunft. Sie können einfach verwenden und mit Versprechen für asynchrone Berechnungen arbeiten. Es gibt auch implicit conversions between play promises and akka future. Um Ihre Darsteller zu überwachen, können Sie sich unter Typesafe console umsehen.

Wenn das große Ding Leistung ist, führt vorzeitige Optimierung oft zu mehr (und unnötiger) Komplexität. Soweit es mich betrifft, würde ich mit der API WS beginnen und bei Bedarf in die Akka-Lösung wechseln.

+2

Eigentlich war die zweite Option, über die ich mich wunderte, eine Art Doppelasync. Könnten die Akteure weiterhin die WS-API (oder den zugrunde liegenden asynchronen http-Client) verwenden? – anchormath

+0

Sie erhalten ein Versprechen mit WS-Anforderungen zurück. Die Schauspieler können es immer noch benutzen. – iwalktheline