Z tego, co zebrałem, wzorzec "zapytaj" jest uważany za niewłaściwą praktykę i należy go unikać. Zamiast tego zalecany wzór to model "aktor na żądanie". Jednak nie ma to dla mnie sensu, ponieważ wzór "ask" robi dokładnie to - tworzy lekkiego aktora na żądanie. Dlaczego więc jest to uważane za złe, zwłaszcza gdy futures są znacznie bardziej złożone i są w stanie bardziej elegancko radzić sobie z sortowaniem wielu wysyłek/odbierań?Dlaczego wzorzec "pytaj" aktora jest uważany za wzorzec przeciwwagi lub "zapach kodu"?
Odpowiedz
Od Akka docs:
„Istnieją implikacje Wyniki wykorzystania zapytać ponieważ trzeba coś śledzić kiedy czasy się, że musi być coś, co mosty obietnicę w produkt ActorRef i to również musi być osiągalny poprzez Remoting, więc zawsze wolą opowiadać o wydajności, a tylko pytam , jeśli musisz. "
Czasami jednak chcesz wysłać wiadomość spoza aktora. W takim przypadku możesz użyć numeru ask
. Użycie ask
gwarantuje, że otrzymasz odpowiedź w określonym czasie i czasami tego właśnie chcesz. Jednak, gdy używasz wzoru ask
, powinieneś zadać sobie pytanie, czy zamiast tego możesz użyć tylko Future
s.
Jest miejsce na ask
, ale z powodów wymienionych powyżej powinno być bardzo ograniczone.
Nie musisz używać aktora na żądanie. Niektórzy aktorzy mają być długowieczni, a inni nie. Jeśli aktor wykonuje potencjalnie niebezpieczną lub blokującą operację, możesz utworzyć ją na każde żądanie. Cokolwiek pasuje do twojej logiki aplikacji.
Czy możesz podać jakieś odniesienie do tego, gdzie jest to zalecane? Trudniej jest stworzyć argument za/przeciw czemuś, gdy nie jest się pewnym co to jest. Również takie odniesienie może zawierać uzasadnienie, dlaczego jest to wzorzec antysztotowy, który powinien zostać rozszerzony lub odrzucony. –
Myślę, że natknąłem się na coś podobnego w [Effective Akka] (https://books.google.de/books?id=Wf5sAAAAQBAJ&pg=PP3&dq=Effective+Akka&hl=de&sa=X&ei=lGn3VM_CHKPlywPf5IDwAw&redir_esc=y#v=onepage&q= Efektywna książka "% 20Akka & f = false" autorstwa Jamiego Allena, patrz rozdział 2 sekcja * Wzorzec dodatkowy * i podrozdziały * Problem * i * Unikanie pytania *. Rozumowanie wydaje się polegać na tym, że 'ask' używa niepotrzebnych zasobów, ponieważ' PromiseActorRef' jest tworzony za kulisami na wywołanie 'ask'. Przykład w książce używa wielu 'ask's i optymalizuje go do pojedynczego aktora * na żądanie *. – PermaFrost
Część problemu polega na tym, że jeśli pytasz od jednego aktora do drugiego i odzyskujesz przyszłość, możesz zakończyć zamykanie nad stanem zmiennym podczas przetwarzania tego oddzwaniania w przyszłości. Poprzez unikanie pytania, a tym samym Futures, eliminujesz te sytuacje. – cmbaxter