2014-04-03 26 views
8

Scala dokümanı okuma Sorma ile anlat arasındaki farkı anlamada güçlük çekiyorum.Akka'da sor ve anlat arasındaki fark nedir?

http://doc.akka.io/docs/akka/snapshot/scala/actors.html devletler:

! "yangın ve unut", ör. Eşzamansız bir mesaj gönderin ve hemen geri dönün. Ayrıca olarak da bilinir.

? bir iletiyi eşzamansız olarak gönderir ve bir olası yanıtı temsil eden bir Gelecek döndürür. Ayrıca istendi olarak da bilinir.

Kullandığım oyuncu bir web isteğini genişletirse, sor ve anlat arasındaki fark nedir? Her iki durumda da, istek eşzamansız olarak ortaya çıkar ve bir yanıt beklemek zorundadır, başka bir deyişle, oyuncu bir web servisini çağırıyor ve bir yanıt beklerken hemen "nasıl" geri dönebilir?

cevap

10

Zaten ask ve tell arasındaki temel farkı bildiğiniz gibi geliyor, ancak HTTP isteklerini işlemede diğer aktörleri dahil etmek için tell'un nasıl kullanılabileceğini anlamıyorsunuz.

o anlamda HTTP isteği işleyicileri içinde tell kullanmak yapmak için, size yanıtlarını dönmek Bu istek işleyicileri gerektirmeyen bir HTTP sunucusu kullanmak zorunda. Spray böyle bir HTTP sunucusudur.

yılında verdiği cevap dönmez bir istek işleyicisi Sprey; bir RequestContext nesnesi verilir ve bu isteğe yanıt vermek, bazı yöntemleri çağırmayı içerir. Sadece o zaman isteğine yanıt başka bir aktör, bu RequestContext gönderebilirsiniz:

path("foo") { 
    rc => rc complete "foo" // respond here 
} ~ 
path("bar") { 
    rc => barActor ! DoBar(rc) // send it to bar; NO RESPONSE HERE 
} 

Sonra barActor tarafından anılan aktör

case DoBar(rc) => 
    rc complete "bar" // respond here, in another actor 

söyleyebiliriz gerçeği o Sprey paketleri yukarı istek bağlam herhangi bir aktörden geçirilip tamamlanabilen bir nesneye aktör modeli için mükemmel bir uyum sağlar. Öte yandan, web çerçeveniz, çağrılan işleyicinin yanıtı geri göndermesini gerektiriyorsa, başka bir oyuncuyu dahil etmek istiyorsanız, tek seçeneğiniz ask'u kullanmaktır.

türgüvenli Play yakında altında Sprey kullanmak duyurdu. Umarım bu, Play'un, işlemlerin işlenmek üzere diğer aktörlere gönderilmesine izin vereceği anlamına gelir. o çıkmıyor sonra ne dönmek için örneğin 30 saniye süren süreçten hemen döner anlatmak

+0

için örtük bir dönüşüm yoluyla uygulanmaktadır. Tomcat'in zaman uyumsuz olarak ve tüm modern web sunucularının isteklerini zaman uyumsuz olarak işlediğine dair benim anlayışımdır; istekleri sadece sıraya almak ve sunucu yanıt süreleri yavaş neden olur? –

+0

Talepleri "birbirlerinden eşzamansız bir şekilde" işleme koymanıza izin verdiklerini kastediyorsanız, o zaman - çok şey yaparsınız. Burada bahsettiğim şey, HTTP sunucusunun işleyiciyi, yanıtı sonuç olarak döndürmesi için gerekli bir yöntem olarak çağırıp çağırmayacağıdır. Bu durumda, ayrı bir aktör cevabı kaldıramaz; İşleyici, sonuç için bir Gelecek almayı isteyerek oyuncuyu çağırmak zorunda kalacaktı. Sonuç geldiğinde, orijinal işleyici yanıtı işlemek için tekrar çalışır. – AmigoNico

+0

Ben bu cevabı daha açık hale getirmeye çalıştım. – AmigoNico

12

ask ve tell arasındaki fark, gönderenin (bu nedenle mutlaka bir oyuncu değil) bakış açısından bakıldığındadır. ask mesaj göndermek ve bir gelecek, zaman aşımı kadar beklenen edilebilir veya cevap tell mesaj göndermek ve derhal geri dönecek alındığında dönecektir. işlem tamamlandığında ask durumunda

, mesajı alır aktör gönderene cevap olmalıdır.

+0

olur? Ya da bir geri dönüş değeri beklendiği zaman, dönüş değeri bir noktada beklenen bir geri dönüş değeri ne zaman kullanılır? –

+1

Evet, tam olarak.Her ikisi de hemen geri dönüyor - “Unit” i döndürdüğünü, yani hiçbir şey olmadığını, dolayısıyla geri dönüş değerinin beklenmediğini söyleyin. “sor”, “beklemede” veya başka bir oyuncuya ya da yürütme için geri çağrılan bir haritaya dönüştürülebilen bir Gelecek [Herhangi] 'döndürür. '' sor' çok daha karmaşıktır ve 'akka.pattern.AskableActorRef' –

İlgili konular