2012-12-19 3 views
22

저는 스칼라로 작성된 웹 응용 프로그램을 Play! 프레임 워크와 Akka. 이 코드는 기본적으로 다음과 같이 구성되어 있습니다. Play 컨트롤러는 Akka 배우에게 메시지를 보냅니다. 액터는 데이터베이스 액세스를 추상화하는 지속성 레이어와 대화합니다. 응용 프로그램에서 이러한 구성 요소의 사용의 전형적인 예 :CRUD 웹 응용 프로그램에서 Akka 액터 사용하기

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] = ??? 
} 

당신이 볼 수 있듯이, 이것은 많은 다른 언어와 프레임 워크에서 볼 것입니다 무슨 같이 기본 CRUD 패턴입니다. 쿼리는 아래의 레이어로 전달되고 응용 프로그램이 데이터베이스에서 결과를 얻으면 해당 결과는 UI에 도달 할 때까지 다시 나타납니다. 유일한 차이점은 액터의 사용과 비동기 호출입니다.

저는 배우의 개념에 새로운 것이므로 아직 배우지 못합니다. 그러나, 내가 읽은 바에 따르면, 배우가 사용되기로되어있는 것은 아닙니다. 하지만 주문을 삽입 할 때 이메일을 보내는 것과 같은 경우에는 진정한 비동기 메시지 전달이 필요합니다.

제 궁금한 점은 이런 방식으로 액터를 사용하는 것이 좋습니까? Fala와 Akka의 다른 동시성 기능을 활용하여 Scala에서 CRUD 응용 프로그램을 작성하는 대안은 무엇입니까?

+1

입력 한 채널을 살펴보십시오. 게시 한 후에 나온 것입니다. 메시지 흐름에 흥미로운 기능이있어 여러 액터를 통해 메시지를 전달하는 등의 작업을 할 수 있습니다. OrderRepository.insert (order) -! -> sender -? -> sendEmail -? -> displayResult. –

답변

5

액터 기반 동시성은 상자에서 벗어난 트랜잭션 작업에 적합하지 않지만 지속성 레이어와 잘 어울리는 경우 액터 사용을 중단하지 않습니다. 삽입 (쓰기)가 원자 적이라는 것을 보증 할 수 있다면 안전하게 배우를 풀 수 있습니다. 일반적으로 데이터베이스는 스레드 안전성을 보장하므로 을 찾으면 예상대로 작동해야합니다. 그 외에도 삽입이 스레드 세이프가 아닌 경우 쓰기 작업 전용으로 하나의 단일 WriteActor를 가질 수 있으며 메시지의 순차 처리로 인해 원 자성이 보장됩니다.

2

한 가지 알아 두어야 할 점은 액터는 한 번에 하나의 메시지 만 처리한다는 것입니다.이 경우에는 다소 제한적입니다. routers을 사용하여 액터 풀을 사용할 수 있습니다.

이 예에서는 저장소의 차단 API를 정의합니다.이 매개 변수는 데이터베이스 드라이버에 따라 수행 할 수있는 유일한 방법 일 수 있습니다. 가능하다면 비동기 api (예 : Futures를 반환)로 이동해야합니다. 배우에서 당신은 대신 pipe 미래의 결과를 보낸 사람에게 것입니다.

+0

예, 컨트롤러는 단순한 액터와 라우터가 될 수있는 'ActorRef'에 의존합니다. –

관련 문제