Programowanie reaktywne w języku Scala


Obsługa awarii

Komunikacja zdalna (remoting)

  • Aktorzy mogą komunikować się zdalnie:
  • Przezroczystość lokalizacji
  • Wykrywanie aktorów (lookup/discovery)
    • Kasycznie przez ActorSelection:
        val account = context.actorSelection("akka.tcp://Reactive5@127.0.0.1:2552/user/account")
      
    • W Akka Typed przez mechanizm Actor discovery

  • Konfiguracja aktorów umożliwia stworzenie kilku systemów aktorów w jednej aplikacji
  • Przyklad pliku application.conf
  • Pobranie i uruchomienie przykładowego projektu:
      git clone https://github.com/agh-reactive/reactive-lab5
      cd reactive-lab5
      sbt run
    

Komunikacja z uzyciem Akka HTTP

  • Biblioteka Akka HTTP
  • Pobranie i uruchomienie przykładowego projektu:
      git clone https://github.com/agh-reactive/reactive-http
      cd reactive-http
      sbt run
    
  • Serwer korzysta z DSL do określania ściezki wywołania: High-lever server API
  • Klient jest aktorem, który dostaje odpowiedź jako komunikat: przykład.

Zadanie

Do implementacji zadań proszę użyć szablonu: https://github.com/agh-reactive/reactive-scala-labs-templates/tree/lab-5 W szablonie został już zaimplementowany ProductCatalog oraz demonstracyjny przykład komunikowania się z katalogiem produktów pomiędzy różnymi systemami aktorowymi zawarty w teście ProductCatalogRemoteTest. Katalog produktów ma następujące odpowiedzialności:
  • przechowywanie elementów Item, zgodnie z konwencją z lab4 (id jako URI), liczba sztuk w magazynie;
  • wyszukiwanie wg słów kluczowych, którymi są: nazwa producenta i wyrazy z nazwy produktu.
    • Przykłady: "Frappuccino Coffee Drink","Starbucks"; "Moisturizing Cream","Gerber"; "32 New Disposable Razor Twin Blades","Gillette"; "Coke Classic Bottles","Coca-Cola".
    • Przykład zapytania: "gerber cream"
    • Jako rezultat zapytania zwracane jest domyślnie 10 najlepiej pasujących produktów (czyli tych, które mają w nazwie najwięcej słów kluczowych z zapytania).
    • Dane importowane są z pliku query_result.bz2.
  1. (15 pkt) Proszę stworzyć API (REST) dla ProductCatalog udostępniające przeszukiwanie katalogu, zwracające wyniki jako JSON. Proszę ProductCatalog uruchomić na innym systemie aktorowym niż serwer HTTP (tak aby zademonstrować komunikację z ProductCatalog poprzez zdalną referencję do aktora). Przy implementacji servera http proszę spojrzeć na przykład HelloWorldAkkaHttpServer.
  2. (10 pkt) Proszę zaimplementować aktora Payment komunikującego się przy użyciu Akka-http z zewnętrznymi serwisami obsługującymi kilka metod płatności (np. VISA, PayU, PayPal itp). Do implementacji komunikacji z serwerem proszę skorzystać z szablonu aktora PaymentService. Proszę wykorzystać implementację serwera z klasy PaymentServiceServer Należy wykorzystać wzorzec w którym aktor PaymentService jest tworzony per wywołanie.

  3. (15 pkt) Proszę dodać mechanizmy obsługi awarii do obsługi błędów w trakcie wykonywania operacji płatności. Należy wykorzystać wzorzec nadzorcy. Punktowana będzie obsługa ciekawych błędów, np. błędy HTTP, błędy sieciowe, itp.


Bartosz Baliś, balis at agh edu pl
Maciej Malawski, malawski at agh edu pl
Katarzyna Rycerz, kzajac at agh edu pl