2009-04-27 14 views
5

Pracuję nad aplikacjami finansowymi w Javie, a uzyskanie współbieżności z prawem to ból. Erlang i model aktorów powinien dobrze pasować do masowo współbieżnych aplikacji, ale nie wiem, jak to zrobić w Javie. Wiem, że istnieją biblioteki takie jak Jetlang, FunctionalJava, kilim itp., Ale zwykle nie wychodzą poza uproszczone przykłady.jak robić aktorów (erlang) w java?

Powiedz, że muszę przetworzyć trzy lub cztery różne zdarzenia, takie jak obliczenie pewnej liczby z danych rynkowych, kanały zamówień/handlu i "wyprowadzenie" niektórych pochodnych tych danych. W większości przypadków te zdarzenia lub strumienie danych muszą być przetwarzane w kolejności (przynajmniej w kolejności w odniesieniu do niektórych kluczy ... na przykład wszystkie zamówienia na określony symbol muszą być przetwarzane w kolejności, ale równolegle z w odniesieniu do niepowiązanych symboli)

Tworzę normalny obiekt Java za pomocą metod, które mutują stan. Zamiast pozwalać tym metodom na bezpośrednią zmianę stanu, umieszczam ich parametry (przekształcając je w obiekt polecenia) w kolejce fifo (skrzynka pocztowa erlanga) i metodę react(), która przetwarza tę kolejkę. W ten sposób wszystkie aktualizacje muszą przechodzić przez pojedynczą kolejkę, a do metody react() można uzyskać tylko jedną aktualizację naraz. Teoretycznie powinno to zaoszczędzić mi potrzebę zablokowania lub synchronizacji w tej metodzie.

Jednak ta kolejka jest w zasadzie kolejką producenta/konsumenta, co oznacza, że ​​jest kolejką blokującą. Blokowanie jest bardzo szkodliwe dla skalowalności. Ponadto, posiadanie pojedynczej kolejki oznacza, że ​​wszystkie moje obiekty poleceń aktualizacji (różnych typów) wychodzą z kolejki z jakimś nadmiernie generycznym super typem (takim jak Object) i muszę odrzucić je z powrotem do właściwego typu i pozwolić im() je przetworzyć .

Gdy ten aktywowany obiekt wytworzy wynik, który zostanie zużyty przez inny taki obiekt, przechodzę przez ten sam proces. Innymi słowy, zmieniłem model programowania z orientacji obiektowej, z metodami, które zwracają wyniki, na pewien rodzaj kontynuacji przechodzącej koszmar, w którym wszystkie moje metody stają się asynchroniczne.

Jakieś pomysły, jak mogę się do tego zbliżyć?

Odpowiedz

3

Użyj jednej z doskonałych bibliotek aktorów, które pojawiły się niedawno. Alex Miller napisał dobrą dwuczęściową część dla Javaworld on Actors.

Ja też osobiście bardzo lubię Actor's Guild.

+0

FYI, jak na stronie internetowej Gildii Aktorów, wydaje się, że projekt nie jest już utrzymywany. –

5

Niedawno akka stanowi ramy aktora dla Scala i opiera się na Erlang.

+0

thx. Właśnie tego szukałem. To jest funkcja Erlang w Javie. – comonad

0

Być może warto również przyjrzeć się esper, która nie jest tak niska jak wspomniane frameworki aktorów, bardziej przypomina ogólny system przetwarzania zdarzeń, który zostałby zbudowany na strukturze aktora. Bardzo dojrzały, kompletny i myślę, że został opracowany do przetwarzania złożonych zdarzeń w transakcjach finansowych.

0

Można rozważyć inną opcję, a mianowicie Netty wraz z Lmax Disruptor, oboje napisany w czystej Javie. Netty to asynchroniczna, oparta na zdarzeniach, aplikacja sieciowa do szybkiego tworzenia wydajnych serwerów protokołów o wysokiej wydajności & klientów.

enter image description here

Jaki jest Disruptor?

LMAX ma być najszybszą platformą transakcyjną na świecie. Oczywiście, aby to osiągnąć, musieliśmy zrobić coś specjalnego, aby osiągnąć bardzo małe opóźnienia i wysoką przepustowość dzięki naszej platformie Java. Testy wydajności wykazały, że używanie kolejek do przekazywania danych między etapami systemu wprowadzało opóźnienie, więc skupiliśmy się na optymalizacji tego obszaru.

The Disruptor jest wynikiem naszych badań i testów. Okazało się, że pamięć podręczna chybia na poziomie procesora, a blokady wymagające arbitrażu jądra są niezwykle kosztowne, więc stworzyliśmy framework, który ma "mechaniczną sympatię" dla sprzętu, na którym działa, i który jest bez blokady ...

(ten wzięty z https://lmax-exchange.github.io/disruptor/)