Próbuję zbudować wysokowydajny system rozproszony z Akka i Scala.Obsługa ramek Akka do wyszukiwania duplikatów wiadomości
Jeśli pojawi się komunikat żądający kosztownej (i nie wymagającej efektów ubocznych) obliczeń, a dokładnie to samo obliczenie zostało już wcześniej zlecone, chcę uniknąć ponownego obliczania wyniku. Jeśli obliczone wcześniej żądanie zostało już zakończone, a wynik jest dostępny, mogę go buforować i ponownie użyć.
Jednak okno czasowe, w którym można żądać duplikowania, może być dowolnie małe. na przykład Mogłem dostać tysiąc lub milion wiadomości z prośbą o tak samo kosztowne obliczenia w tej samej chwili dla wszystkich praktycznych zastosowań.
Istnieje komercyjny produkt o nazwie Gigaspaces, który rzekomo obsługuje tę sytuację.
Wydaje się jednak, że obecnie w Akka nie ma wsparcia dla obsługi duplikatów zleceń pracy. Biorąc pod uwagę, że struktura Akka ma już dostęp do wszystkich komunikatów przesyłanych za pośrednictwem frameworka, wydaje się, że rozwiązanie ramowe może mieć wiele sensu.
Oto, co proponuję do struktury Akka: 1. Utwórz cechę, która wskaże typ wiadomości (np. "ExpensiveComputation" lub coś podobnego), które mają podlegać poniższemu podejściu do buforowania. 2. Inteligentnie (hashowanie itp.) Identyfikuje identyczne wiadomości odebrane przez (tych samych lub różnych) aktorów w konfigurowalnym oknie czasowym. Inne opcje: wybierz maksymalny rozmiar bufora pamięci do użycia w tym celu, z zastrzeżeniem wymiany (np. LRU) itp. Akka może również wybrać buforowanie tylko wyników wiadomości, które były kosztowne w przetwarzaniu; wiadomości, które zajęły bardzo mało czasu na przetwarzanie, mogą być ponownie przetworzone w razie potrzeby; nie ma potrzeby marnowania cennego miejsca buforowego na buforowanie ich i ich wyników. 3. Gdy identyczne wiadomości (odebrane w tym oknie czasowym, prawdopodobnie "w tym samym momencie") zostaną zidentyfikowane, unikaj niepotrzebnych duplikatów obliczeń. Ramy robią to automatycznie, a zasadniczo duplikaty wiadomości nigdy nie zostaną odebrane przez nowego aktora do przetwarzania; zanikłyby one w milczeniu, a wynik przetworzenia go raz (czy to obliczenie było już zrobione w przeszłości, czy też trwające właśnie wtedy) został wysłany do wszystkich odpowiednich odbiorców (natychmiast, jeśli jest już dostępny, a po zakończeniu obliczeń, jeśli nie). Zauważ, że wiadomości powinny być uważane za identyczne, nawet jeśli pola "odpowiedzi" są różne, o ile semantyka/obliczenia, które reprezentują są identyczne pod każdym innym względem. Należy również pamiętać, że obliczenia powinny być czysto funkcjonalne, tzn. Wolne od skutków ubocznych, aby optymalizacja buforowania sugerowała działanie i nie zmieniać w ogóle semantyki programu.
Jeśli to, co sugeruję, nie jest zgodne ze sposobem postępowania w Akka i/lub jeśli widzisz kilka silnych powodów, dla których jest to bardzo zły pomysł, proszę dać mi znać.
Dzięki jest niesamowite, Scala
Istnieje odmiana tego, która zależy od tego, czy ostatnia wiadomość jest przetwarzana, a nie wcześniejsza w kolejce. tj. nie chcę rozpoczynać kosztownych obliczeń, dopóki nie upewnię się, że wszystkie wiadomości zostały odebrane. Myślę, że powyższe podejście można zmodyfikować za pomocą FSM, aby osiągnąć ten sam rezultat. – dres