2015-03-04 9 views
8

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"?

+5

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. –

+1

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

+0

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

Odpowiedz

8

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.