2014-04-23 21 views
6

Spray.io çerçevesini kullanarak bir REST hizmeti uygularım. Bu servis bazı "arama" sorgularını almalı, işlem yapmalı ve sonuçları müşteriye geri göndermelidir. Arama yapan perfomanın ayrı bir aktörde bulduğu kod - SearchActor, bu yüzden kullanıcıdan (JSON) sorguyu aldıktan sonra, bu sorgumu SearchActor'ım için tekrar soruyorum (soruyu modelini kullanarak). Ama gerçekten anlamadığım şey, spray.io rota oyuncusu ve SearchActor'ım arasındaki etkileşimi nasıl uygulamalıyım.Spray.io - başka bir oyuncuya temsilci seçme

Burada birkaç varyant görüyorum ama hangisi daha doğru ve neden?

  1. oluşturmak SearchActor yeni örneği başlangıçta SearchActor bir örneğini oluşturabilir ve her isteği için bu aktör
  2. her isteği göndermek
  3. başlangıçta SearchActor aktörlerin havuzu oluşturma ve bu havuza istekleri göndermek

cevap

2

Soru desenini kullanmaya mecbur değilsiniz. Aslında, isteğinizin her biri için bir iş parçacığı oluşturacaktır ve bu muhtemelen istediğinizi değil. Bunun yerine bir tell kullanmanız önerilir. Bunu, her bir istek için( iş parçacığına göre daha ucuz olan) tarafından oluşturulmuş, RequestContext yapıcı alanlarından birinde gerçekleştirebilirsiniz. Bu bağlamı, genellikle complete yöntemiyle geri yanıt vermek için kullanacaksınız.

Örnek kod. Eğer dışarı ölçek isteyeyim, böylece tek engelleme aktör kötü -

class RESTActor extends HttpService { 
    val route = path("mypath") ~ post { 
    entity(as[SearchActor.Search]) { search => ctx => 
     SearchActor(ctx) ! search 
    } 
    } 
} 

case class SearchActor(ctx: RequestContext) { 
    def receive = { 
    case msg: Search => //... search process 
    case msg: Result => ctx.complete(msg) // sends back reply 
    } 
} 
+0

> WAT "bir iş parçacığı yaratacak" kısmında gösterilir ?? – ZhekaKozlov

+0

Akka doc'dan bazı açıklamalar => sor: bir mesaja cevap almak ve bir scala.concurrent.Forumu tamamlamak için geçici bir kerelik aktör oluşturun; Geleceği söyledi. Ve Sprey, Futures'ı kendi direktiflerinde ele alır. Yani, hayır iş parçacığı oluşturmuyor. Ve yukarıdaki yaklaşım, soru desenini kullanmaya oldukça benzer. İş mantığınızı yazmak istediğiniz yere bağlıdır. – Leo

+0

Anlat/sor farklılıkları => https://groups.google.com/forum/#!topic/akka-user/GlMq6J4ZlAc hakkında ilginç tartışma – Leo

1

Varyant 1. İlk uygulama sonrası söz konusu değildir.

# 2 ve # 3 varyantları çok farklı değildir - yeni aktörün oluşturulması ucuzdur ve minimum yüke sahiptir. Oyuncularınız sık sık öldürebileceğinden (yani arka uç mevcut değil), # 2'nin gitmenin yolu olduğunu söyleyebilirim.

Beton uygulama fikri http://techblog.net-a-porter.com/2013/12/ask-tell-and-per-request-actors/