Słyszałem wiele entuzjazmu o frameworku Akka (platforma serwisowa Java / Scala), ale jak dotąd nie widziałem wielu rzeczywistych przykładów użycia, do których byłby odpowiedni. Chciałbym więc dowiedzieć się o rzeczach, które programiści z powodzeniem wykorzystali.
Tylko jedno ograniczenie: nie dołączaj przypadku pisania serwera czatu. (dlaczego? skoro zostało to wykorzystane jako przykład wielu podobnych rzeczy)
Odpowiedzi:
Dotychczas z powodzeniem wykorzystałem go w dwóch prawdziwych projektach. oba znajdują się w polu informacji o ruchu drogowym w czasie zbliżonym do rzeczywistego (ruch jak w samochodach na autostradach), rozmieszczonych w kilku węzłach, integrujących wiadomości między kilkoma stronami, niezawodnych systemów zaplecza. Nie jestem jeszcze w stanie podać szczegółów na temat klientów, ale kiedy dostanę OK, może to zostać dodane jako odniesienie.
Akka naprawdę wykorzystała te projekty, mimo że zaczęliśmy od wersji 0.7. (tak przy okazji, używamy Scali)
Jedną z dużych zalet jest łatwość, z jaką można skomponować system z aktorów i komunikatów bez prawie żadnych połączeń kotłowych, skaluje się wyjątkowo dobrze bez wszystkich złożoności ręcznego walcowania wątków i otrzymujesz asynchroniczne przekazywanie wiadomości między obiektami prawie za darmo.
Jest bardzo dobry w modelowaniu wszelkiego rodzaju asynchronicznej obsługi komunikatów. Wolałbym pisać w tym stylu dowolny system usług (internetowych) niż jakikolwiek inny styl. (Czy kiedykolwiek próbowałeś napisać asynchroniczną usługę internetową (po stronie serwera) za pomocą JAX-WS? To dużo hydrauliki). Powiedziałbym więc, że każdy system, który nie chce zawiesić się na jednym ze swoich komponentów, ponieważ wszystko jest domyślnie wywoływane przy użyciu metod synchronicznych, a ten jeden komponent blokuje się na czymś. Jest bardzo stabilny, a rozwiązanie awarii i nadzoru nad awarią naprawdę działa dobrze. Wszystko jest łatwe do zaprogramowania programowego i nie jest trudne do testowania jednostkowego.
Są też doskonałe moduły dodatkowe. Moduł Camel naprawdę dobrze wpasowuje się w Akka i umożliwia tak łatwy rozwój usług asynchronicznych z konfigurowalnymi punktami końcowymi.
Jestem bardzo zadowolony z frameworka i staje się on standardem defacto dla tworzonych przez nas systemów połączonych.
źródło
Oświadczenie: Jestem PO dla Akka
Oprócz oferowania smorgasbord współbieżności, który jest znacznie prostszy do uzasadnienia i uzyskania poprawności (aktorzy, agenci, współbieżność przepływu danych) oraz z kontrolą współbieżności w postaci STM.
Oto kilka przypadków użycia, które możesz rozważyć:
źródło
Przykładem tego, jak go wykorzystujemy, będzie kolejka priorytetowa transakcji kartą debetową / kredytową. Mamy ich miliony, a nakład pracy zależy od typu ciągu wejściowego. Jeśli transakcja jest typu SPRAWDŹ, mamy bardzo mało przetwarzania, ale jeśli jest to punkt sprzedaży, jest wiele do zrobienia, takich jak połączenie z metadanymi (kategoria, etykieta, tagi itp.) I świadczenie usług (powiadomienia e-mail / sms, wykrywanie oszustw, niski stan środków itp.). Na podstawie typu danych wejściowych tworzymy klasy o różnych cechach (zwane mixinami) niezbędne do obsługi zadania, a następnie wykonujemy pracę. Wszystkie te zadania trafiają do tej samej kolejki w trybie czasu rzeczywistego z różnych instytucji finansowych. Po wyczyszczeniu dane są wysyłane do różnych magazynów danych w celu utrwalenia, analizy lub przekazane do połączenia przez gniazdo lub do aktora Lift komety. Aktywni aktorzy nieustannie równoważą pracę, abyśmy mogli przetwarzać dane tak szybko, jak to możliwe. Możemy również przyciągać dodatkowe usługi, modele trwałości istm dla krytycznych punktów decyzyjnych.
Przekazywanie komunikatu w stylu OTP Erlang przez JVM stanowi świetny system do opracowywania systemów w czasie rzeczywistym na barkach istniejących bibliotek i serwerów aplikacji.
Akka pozwala na przekazywanie wiadomości w tradycyjny sposób esbale z prędkością! Daje również narzędzia w ramach do zarządzania ogromną liczbą pul aktorów, zdalnych węzłów i odpornością na uszkodzenia, których potrzebujesz do swojego rozwiązania.
źródło
Używamy Akka do asynchronicznego przetwarzania wywołań REST - wraz z asynchronicznym serwerem WWW (opartym na Netty) możemy osiągnąć 10-krotną poprawę liczby obsługiwanych użytkowników na węzeł / serwer, w porównaniu do tradycyjnego modelu wątku na żądanie użytkownika.
Powiedz swojemu szefowi, że Twój rachunek za hosting AWS spadnie 10-krotnie i nie ma nic przeciwko! Ciii ... nie mów tego Amazonowi ... :)
źródło
Używamy Akki w dużym projekcie Telco (niestety nie mogę ujawnić wielu szczegółów). Aktorzy Akka są wdrażani i uzyskują do nich dostęp zdalny przez aplikację internetową. W ten sposób mamy uproszczony model RPC oparty na protobufferze Google i osiągamy równoległość za pomocą Akka Futures. Do tej pory ten model działał doskonale. Jedna uwaga: korzystamy z Java API.
źródło
Jeśli podniesiesz poziom serwera czatu na wyższy poziom, otrzymasz odpowiedź.
Akka zapewnia system przesyłania wiadomości podobny do mentalności Erlanga „pozwól mu upaść”.
Tak więc przykłady wymagają różnych poziomów trwałości i niezawodności przesyłania komunikatów:
Zaletami Akka są opcje, które zapewnia trwałość, implementacja STM, serwer REST i odporność na awarie.
Nie denerwuj się przykładem serwera czatu, pomyśl o nim jako o pewnej klasie rozwiązania.
Biorąc pod uwagę ich doskonałą dokumentację, wydaje mi się, że luką jest dokładnie to pytanie, przypadki użycia i przykłady. Mając na uwadze, przykłady nie są trywialne.
(Napisane tylko z doświadczeniem oglądania filmów i grania ze źródłem, nic nie zaimplementowałem przy użyciu akka.)
źródło
Używamy Akki w kilku projektach w pracy, z których najciekawszy dotyczy napraw powypadkowych pojazdów. Głównie w Wielkiej Brytanii, ale teraz rozszerza się na USA, Azję, Australazję i Europę. Korzystamy z aktorów, aby zapewnić, że informacje o naprawie awarii są przekazywane w czasie rzeczywistym, aby umożliwić bezpieczną i opłacalną naprawę pojazdów.
Pytanie z Akką to tak naprawdę „co nie możesz zrobić z Akką”. Jego zdolność do integracji z potężnymi strukturami, potężna abstrakcja i wszystkie aspekty odporności na uszkodzenia sprawiają, że jest to bardzo wszechstronny zestaw narzędzi.
źródło
Możesz użyć Akka do kilku różnych rzeczy.
Pracowałem nad stroną internetową, na której przeprowadziłem migrację stosu technologii do Scali i Akki. Wykorzystaliśmy go do prawie wszystkiego, co wydarzyło się na stronie. Nawet jeśli uważasz, że przykład czatu jest zły, wszystkie są w zasadzie takie same:
Zwłaszcza aktualizacje na żywo są łatwe, ponieważ sprowadzają się do tego, co istnieje przykładowy czat. Część poświęcona usługom to kolejny interesujący temat, ponieważ możesz po prostu wybrać zdalnych aktorów, a nawet jeśli aplikacja nie jest klastrowana, możesz z łatwością wdrożyć ją na różnych komputerach.
Używam również Akka do aplikacji autoroutera PCB z myślą o możliwości skalowania z laptopa do centrum danych. Im więcej mocy dasz, tym lepszy będzie wynik. Jest to niezwykle trudne do wdrożenia, jeśli próbujesz użyć zwykłej współbieżności, ponieważ Akka zapewnia również przejrzystość lokalizacji.
Obecnie jako projekt czasu wolnego buduję platformę internetową, używając tylko aktorów. Ponownie korzyściami są skalowalność od jednego komputera do całego klastra maszyn. Poza tym stosowanie podejścia opartego na wiadomościach od samego początku sprawia, że usługa oprogramowania jest zorientowana. Masz te wszystkie miłe komponenty, rozmawiające ze sobą, ale niekoniecznie się znające, żyjące na tej samej maszynie, nawet w tym samym centrum danych.
Odkąd zamknął się Google Reader, zacząłem od czytnika RSS, oczywiście używając Akki. Chodzi mi przede wszystkim o usługi zamknięte. Podsumowując: sam model aktora jest tym, co powinieneś przyjąć w pierwszej kolejności, a Akka jest bardzo niezawodną strukturą pomagającą wdrożyć go z wieloma korzyściami, które otrzymasz po drodze.
źródło
Używamy akka z wtyczką wielbłąda do rozpowszechniania naszych analiz i trendów w przetwarzaniu dla twimpact.com . Musimy przetwarzać od 50 do 1000 wiadomości na sekundę. Oprócz przetwarzania wielowęzłowego za pomocą wielbłąda jest on również wykorzystywany do dystrybucji pracy na jednym procesorze do wielu pracowników w celu uzyskania maksymalnej wydajności. Działa całkiem dobrze, ale wymaga pewnego zrozumienia, jak radzić sobie z zatorami.
źródło
Próbowałem swoich sił w Akka (Java API). Próbowałem porównać model współbieżności oparty na aktorach Akki z modelem zwykłej współbieżności Java (klasy java.util.concurrent).
Przypadek użycia to prosta mapa kanoniczna zmniejszająca implementację liczby znaków. Zestaw danych był zbiorem losowo generowanych ciągów (o długości 400 znaków) i obliczał w nich liczbę samogłosek.
W przypadku Akka użyłem BalancedDispatcher (do równoważenia obciążenia między wątkami) i RoundRobinRouter (aby zachować limit na moich aktorów funkcji). W przypadku języka Java zastosowałem prostą technikę łączenia widelca (zaimplementowaną bez algorytmu kradzieży pracy), która rozwidliłaby mapę / ograniczyła wykonanie i połączyła wyniki. Wyniki pośrednie odbywały się w kolejkach blokujących, aby nawet połączenie było jak najbardziej równoległe. Prawdopodobnie, jeśli się nie mylę, to w pewien sposób naśladuje koncepcję skrzynki pocztowej aktorów Akka, którzy odbierają wiadomości.
Obserwacja: Do średnich obciążeń (~ 50000 ciągów wejściowych) wyniki były porównywalne, różniąc się nieznacznie w różnych iteracjach. Ponieważ jednak zwiększyłem obciążenie do ~ 100000, zawiesiłoby się rozwiązanie Java. Skonfigurowałem rozwiązanie Java z 20-30 wątkami w tych warunkach i nie powiodło się we wszystkich iteracjach.
Zwiększenie obciążenia do 1000000 również było fatalne dla Akki. Mogę udostępnić kod każdemu zainteresowanemu, aby uzyskać kontrolę krzyżową.
Wydaje mi się, że Akka skaluje się lepiej niż tradycyjne wielowątkowe rozwiązanie Java. I prawdopodobnie powodem jest magia Scali pod maską.
Jeśli mogę modelować domenę problemową jako przekazywaną przez zdarzenie wiadomość, myślę, że Akka jest dobrym wyborem dla JVM.
Test przeprowadzono na: wersji Java: 1.6 IDE: Eclipse 3.7 Windows Vista 32 bit. 3 GB pamięci RAM Procesor Intel Core i5, taktowanie 2,5 GHz
Pamiętaj, że problematyczna domena zastosowana w teście może być dyskutowana i starałem się być tak uczciwy, na ile pozwalała moja znajomość języka Java :-)
źródło
Używamy Akka w mówionych systemach dialogowych ( primetalk ). Zarówno wewnętrznie, jak i zewnętrznie. Aby jednocześnie uruchomić wiele kanałów telefonii w jednym węźle klastra, oczywiście konieczne jest posiadanie szkieletu wielowątkowości. Akka działa idealnie. Mamy poprzedni koszmar z współbieżnością Java. A z Akką jest jak huśtawka - po prostu działa. Solidny i niezawodny. 24 * 7, non-stop.
Wewnątrz kanału mamy strumień zdarzeń przetwarzanych równolegle. W szczególności: - długie automatyczne rozpoznawanie mowy - odbywa się z udziałem aktora; - producent wyjścia audio, który miksuje kilka źródeł dźwięku (w tym syntezę mowy); - konwersja tekstu na mowę to osobny zestaw aktorów współdzielony między kanałami; - semantyczne i przetwarzanie wiedzy.
Do wykonywania połączeń złożonego przetwarzania sygnałów używamy SynapseGrid . Ma tę zaletę, że sprawdza DataFlow w czasie kompilacji w złożonych systemach aktorskich.
źródło
Niedawno zaimplementowałem kanoniczny przykład zmniejszania mapy w Akka: liczba słów. Jest to jeden przypadek zastosowania Akka: lepsza wydajność. Był to raczej eksperyment aktorów JRuby i Akki niż cokolwiek innego, ale pokazuje także, że Akka to nie Scala ani tylko Java: działa na wszystkich językach oprócz JVM.
źródło