Penafian: Saya tidak memiliki pengalaman scala untuk saat ini, jadi pertanyaan saya berhubungan dengan hal yang sangat mendasar.
Perhatikan contoh berikut (mungkin tidak lengkap):
import akka.actor.{ActorSystem, Props}
import akka.io.IO
import spray.can.Http
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.duration._
import akka.actor.Actor
import spray.routing._
import spray.http._
object Boot extends App {
implicit val system = ActorSystem("my-actor-system")
val service = system.actorOf(Props[MyActor], "my")
implicit val timeout = Timeout(5.seconds)
IO(Http) ? Http.Bind(service, interface = "localhost", port = 8080)
}
class MyActor extends Actor with MyService {
def actorRefFactory = context
def receive = runRoute(myRoute)
}
trait MyService extends HttpService {
val myRoute =
path("my") {
post {
complete {
"PONG"
}
}
}
}
Pertanyaan saya adalah: apa yang sebenarnya terjadi ketika kontrol mencapai complete
blok? Pertanyaannya sepertinya terlalu umum, jadi izinkan saya membaginya.
- Saya melihat penciptaan satu aktor dalam contoh. Apakah ini berarti aplikasinya single-threaded dan hanya menggunakan satu inti CPU?
- Apa yang terjadi jika saya memblokir panggilan di dalam
complete
? - Jika hal. 1 benar dan hal. 2 akan diblokir, bagaimana cara mengirimkan permintaan untuk menggunakan semua CPU? Saya melihat dua cara: aktor per permintaan dan aktor per koneksi. Yang kedua tampaknya masuk akal, tetapi saya tidak dapat menemukan cara melakukannya menggunakan perpustakaan semprotan.
- Jika pertanyaan sebelumnya tidak relevan, apakah arahan
detach
akan berlaku? Dan bagaimana dengan meneruskan fungsi yang mengembalikan arahan Future kecomplete
? Apa perbedaan antara fungsi detach dan passing yang mengembalikan Masa Depan? - Apa cara yang tepat untuk mengonfigurasi jumlah utas yang berfungsi dan menyeimbangkan permintaan/koneksi?
Akan lebih bagus jika Anda menunjukkan penjelasannya kepada saya di dokumentasi resmi. Ini sangat luas dan saya yakin saya melewatkan sesuatu.
Terima kasih.