Tôi hiểu cách tạo ứng dụng không chặn thư trong akka và có thể dễ dàng giả lập các ví dụ thực hiện hoạt động đồng thời và trả lại kết quả tổng hợp trong thư. Tôi gặp khó khăn khi hiểu những gì các tùy chọn không chặn của tôi là khi ứng dụng của tôi phải trả lời yêu cầu HTTP. Mục tiêu là để nhận được yêu cầu và ngay lập tức giao nó cho một diễn viên địa phương hoặc từ xa để thực hiện công việc, do đó sẽ tắt nó để có kết quả là có thể mất một thời gian. Thật không may theo mô hình này, tôi không hiểu làm thế nào tôi có thể thể hiện điều này với một loạt không bị chặn "nói" thay vì chặn "yêu cầu". Nếu tại bất kỳ điểm nào trong chuỗi tôi sử dụng, tôi không còn có tương lai là sử dụng làm nội dung phản hồi cuối cùng (yêu cầu bởi giao diện khung http trong trường hợp này là finagle - nhưng đó không phải là quan trọng). Tôi hiểu rằng yêu cầu là một chủ đề riêng và ví dụ của tôi khá giả tạo nhưng chỉ cố gắng hiểu các tùy chọn thiết kế của tôi.Tùy chọn không chặn Akka khi phản hồi HTTP được yêu cầu
Tóm lại, Nếu ví dụ giả tạo của tôi dưới đây có thể được làm lại để chặn ít hơn, tôi rất thích hiểu làm thế nào. Đây là lần đầu tiên sử dụng akka kể từ khi khám phá ánh sáng một năm + trước và trong mỗi bài viết, tài liệu và nói chuyện tôi đã xem nói không chặn các dịch vụ.
Câu trả lời khái niệm có thể hữu ích nhưng cũng có thể giống như những gì tôi đã đọc. Làm việc/chỉnh sửa ví dụ của tôi có thể là chìa khóa cho sự hiểu biết của tôi về vấn đề chính xác mà tôi đang cố giải quyết. Nếu ví dụ hiện tại thường là những gì cần phải được thực hiện thì xác nhận đó cũng hữu ích, vì vậy tôi không tìm kiếm ma thuật không tồn tại.
Lưu ý Các bí danh sau đây:. Nhập khẩu com.twitter.util {tương lai => TwitterFuture, chờ đợi => TwitterAwait}
object Server {
val system = ActorSystem("Example-System")
implicit val timeout = Timeout(1 seconds)
implicit def scalaFuture2twitterFuture[T](scFuture: Future[T]): TwitterFuture[T] = {
val promise = TwitterPromise[T]
scFuture onComplete {
case Success(result) ⇒ promise.setValue(result)
case Failure(failure) ⇒ promise.setException(failure)
}
promise
}
val service = new Service[HttpRequest, HttpResponse] {
def apply(req: HttpRequest): TwitterFuture[HttpResponse] = req.getUri match {
case "https://stackoverflow.com/a/b/c" =>
val w1 = system.actorOf(Props(new Worker1))
val r = w1 ? "take work"
val response: Future[HttpResponse] = r.mapTo[String].map { c =>
val resp = new DefaultHttpResponse(HttpVersion.HTTP_1_1, HttpResponseStatus.OK)
resp.setContent(ChannelBuffers.copiedBuffer(c, CharsetUtil.UTF_8))
resp
}
response
}
}
//val server = Http.serve(":8080", service); TwitterAwait.ready(server)
class Worker1 extends Actor with ActorLogging {
def receive = {
case "take work" =>
val w2 = context.actorOf(Props(new Worker2))
pipe (w2 ? "do work") to sender
}
}
class Worker2 extends Actor with ActorLogging {
def receive = {
case "do work" =>
//Long operation...
sender ! "The Work"
}
}
def main(args: Array[String]) {
val r = service.apply(
com.twitter.finagle.http.Request("https://stackoverflow.com/a/b/c")
)
println(TwitterAwait.result(r).getContent.toString(CharsetUtil.UTF_8)) // prints The Work
}
}
Cảm ơn trước cho bất kỳ hướng dẫn được cung cấp!
Cảm ơn bạn rất nhiều vì đã trả lời nhanh Travis. Điều đó làm sạch tương lai và chờ đợi một chút. Vì vậy, bạn có tin rằng việc sử dụng hai yêu cầu là trong thực tế cần thiết (Rõ ràng tôi chỉ có thể nhìn thấy nó theo cách đó - nhưng muốn chắc chắn)? Tôi sẽ cập nhật mã của tôi để bao gồm các cải tiến của bạn và bao gồm các chuyển đổi tiềm ẩn từ tương lai akka sang tương lai twitter. Không quá quen thuộc với nghi thức Stack Overflow, vì vậy tôi đang đưa ra +1 để cải thiện. Mọi thông tin bổ sung về các yêu cầu sẽ hữu ích. Cảm ơn! – Eric
Thật khó để nói rằng các yêu cầu được yêu cầu mà không biết thêm về những gì mà các diễn viên đó chịu trách nhiệm, nhưng phần quan trọng là yêu cầu không yêu cầu chặn (có thêm một sổ sách kế toán liên quan, nhưng nó vẫn không đồng bộ). Tôi cũng khuyên bạn nên giữ chuyển đổi giữa Twitter và thư viện chuẩn tương lai rõ ràng - phải gọi một phương thức chuyển đổi thường là một mức giá nhỏ để trả để tránh nhầm lẫn tiềm ẩn trong trường hợp như thế này. –
Cảm ơn rất nhiều sự giúp đỡ và thông tin chi tiết của bạn về Travis này. Điều này giải quyết mối quan tâm của tôi một cách hoàn hảo. – Eric