Pracuję nad aplikacją internetową napisaną w Scali, używając gry! ramy i Akka. Kod jest zorganizowany w następujący sposób: kontrolery Play wysyłają wiadomości do aktorów Akka. Aktorzy z kolei rozmawiają z warstwą uporczywości, która ogranicza dostęp do bazy danych. Typowym przykładem wykorzystania tych składników w aplikacji:Używanie aktorów Akka w aplikacji internetowej 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] = ???
}
Jak widać, jest to podstawowy wzór CRUD, podobnie jak to, co można zobaczyć w innych językach i ram. Zapytanie zostanie przekazane do poniższych warstw, a gdy aplikacja otrzyma wynik z bazy danych, wynik ten powróci, aż dotrze do interfejsu użytkownika. Jedyną istotną różnicą jest użycie aktorów i wywołań asynchronicznych.
Teraz jestem bardzo nowy w koncepcji aktorów, więc jeszcze tego nie rozumiem. Ale z tego, co przeczytałem, nie wynika, w jaki sposób należy używać aktorów. Zauważ jednak, że w niektórych przypadkach (np. Wysłanie e-maila po wstawieniu zamówienia) potrzebujemy prawdziwego przekazywania wiadomości asynchronicznych.
Moje pytanie brzmi: czy to dobry pomysł, aby korzystać z aktorów w ten sposób? Jakie są alternatywy dla pisania aplikacji CRUD w Scali, korzystając z Futures i innych możliwości współbieżności Akki?
Spójrz na wpisane kanały - pojawiły się po opublikowaniu tego. Mają kilka interesujących funkcji związanych z przepływem wiadomości, więc możesz zrobić takie rzeczy, jak przekazanie wiadomości przez kilku aktorów: OrderRepository.insert (kolejność) -! -> sender -? -> sendEmail -? -> displayResult. –