2012-12-19 39 views
22

Tôi đang làm việc trên một ứng dụng web được viết bằng Scala, sử dụng Play! khuôn khổ và Akka. Mã được tổ chức về cơ bản như thế này: Bộ điều khiển Play gửi tin nhắn đến các diễn viên Akka. Các diễn viên, lần lượt, nói chuyện với một lớp kiên trì, mà trừu tượng truy cập cơ sở dữ liệu. Một ví dụ điển hình về cách sử dụng các thành phần này trong ứng dụng:Sử dụng diễn viên Akka trong ứng dụng web CRUD

class OrderController(orderActor: ActorRef) extends Controller { 
    def showOrders(customerId: Long) = { 
    implicit request => Async { 
     val futureOrders = orderActor ? FindOrdersByCustomerId(id) 

     // Handle the result, showing the orders list to the user or showing an error message. 
    } 
    } 
} 

object OrderActor extends Actor { 
    def receive = { 
    case FindOrdersByCustomerId(id) => 
     sender ! OrderRepository.findByCustomerId(id) 
    case InsertOrder(order) => 
     sender ! OrderRepository.insert(order) 
     //Trigger some notification, like sending an email. Maybe calling another actor. 
    } 
} 

object OrderRepository { 
    def findByCustomerId(id: Long): Try[List[Order]] = ??? 
    def insert(order: Order): Try[Long] = ??? 
} 

Như bạn có thể thấy, đây là mẫu CRUD cơ bản, giống như những gì bạn thấy trong các ngôn ngữ và khuôn khổ khác. Một truy vấn được chuyển xuống các lớp bên dưới và khi ứng dụng nhận được kết quả từ cơ sở dữ liệu, kết quả đó sẽ trở lại cho đến khi nó đạt đến giao diện người dùng. Sự khác biệt duy nhất có liên quan là việc sử dụng các diễn viên và các cuộc gọi không đồng bộ.

Bây giờ, tôi rất mới với khái niệm diễn viên, vì vậy tôi chưa hiểu rõ. Nhưng, từ những gì tôi đã đọc, đây không phải là cách diễn viên được cho là được sử dụng. Tuy nhiên, hãy quan sát rằng trong một số trường hợp (ví dụ: gửi email khi lệnh được chèn vào), chúng tôi cần thông báo không đồng bộ thực sự.

Vì vậy, câu hỏi của tôi là: có nên sử dụng diễn viên theo cách này không? Các lựa chọn thay thế cho việc viết các ứng dụng CRUD ở Scala, lợi dụng tương lai và các khả năng tương tranh khác của Akka là gì?

+1

Hãy xem các kênh đã nhập - chúng xuất hiện sau khi bạn đăng nội dung này. Họ đã có một số tính năng thú vị cho luồng thông điệp, vì vậy bạn có thể thực hiện những việc như truyền thông điệp qua một số tác nhân: OrderRepository.insert (order) -! -> sender -? -> sendEmail -? -> displayResult. –

Trả lời

5

Mặc dù diễn viên dựa trên đồng thời không phù hợp với hoạt động giao dịch ra khỏi hộp nhưng điều đó không ngăn bạn sử dụng diễn viên theo cách đó nếu bạn chơi độc đáo với lớp kiên trì. Nếu bạn có thể đảm bảo rằng chèn (viết) là nguyên tử thì bạn có thể an toàn có một nhóm diễn viên làm việc đó cho bạn. Thông thường, cơ sở dữ liệu có một chủ đề an toàn đọc nên tìm thấy cũng sẽ hoạt động như mong đợi. Ngoài ra nếu chèn không phải là luồng an toàn, bạn có thể có một WriteActor riêng chỉ dành riêng cho các thao tác ghi và xử lý tuần tự các thông báo sẽ đảm bảo nguyên tử cho bạn.

2

Một điều cần lưu ý là một diễn viên xử lý một thông điệp tại một thời điểm, điều này sẽ khá hạn chế trong trường hợp này. Bạn có thể sử dụng một nhóm diễn viên bằng cách sử dụng routers.

Ví dụ của bạn xác định api chặn của kho lưu trữ, có thể là điều duy nhất bạn có thể làm, tùy thuộc vào trình điều khiển cơ sở dữ liệu của bạn. Nếu có thể bạn nên đi cho một api không đồng bộ cũng có, tức là quay trở lại tương lai. Trong diễn viên, bạn sẽ thay thế pipe kết quả của tương lai cho người gửi.

+0

Có, bộ điều khiển phụ thuộc vào 'ActorRef', có thể là một diễn viên đơn giản cũng như bộ định tuyến. –

Các vấn đề liên quan