Java Real Time - praca inżynierska.

Java Real Time - praca inżynierska.
infantylny
  • Rejestracja:około 6 lat
  • Ostatnio:około 14 godzin
  • Postów:62
0

Cześć!
W poniedziałek idę do, być może, przyszłego promotora z tematem pracy inżynierskiej. Na początek chciałbym dowiedzieć się czy w ogóle coś takiego jest możliwe i czy warto w to brnąć. Otóż myślałem nad budową symulatora (tutaj wstaw coś technicznego, np. procesów chemicznych w oczyszczalni ścieków) jako aplikacji czasu rzeczywistego o miękkich wymaganiach czasowych, gdzie interfejs użytkownika będzie dostępny z poziomu przeglądarki internetowej. Sam interfejs zbudowałbym korzystając z HTML, CSS, JavaScript. Na pewno potrzebna będzie baza danych. Do symulatora dodałbym mechanizm adaptacji kroku symulacji (redukcja występujących opóźnień symulacji w stosunku do czasu rzeczywistego) aby "udawać" pracę w czasie rzeczywistym w środowisku , które takie nie jest. I tutaj pojawia się główny problem - serwer. Bardzo chciałbym wykorzystać Javę do stworzenia symulatora, jednak dość słabo nadaje się ona do rozwiązań Real Time z uwagi na Garbage Collector, ponieważ ciężko przewidzieć kiedy się uruchomi a w rozwiązaniach Real Time nie możemy pozwolić sobie na nawet krótkie przerwanie programu aby GC mógł sobie posprzątać. Ważną sprawą jest również protokół komunikacyjny, który zapewni komunikację w czasie rzeczywistym, jednak wybór ten zależy również od tego w jaki sposób zostanie zbudowany serwer. Przechodząc do sedna. Słyszał ktoś o rozwiązaniach Real Time w Javie? Jeśli tak to bardzo prosiłbym o jakieś słowa kluczowe lub linki do artykułów i czy można na tym zbudować serwer :).

WeiXiao
  • Rejestracja:około 9 lat
  • Ostatnio:2 dni
  • Postów:5112
0

A czy przypadkiem Java nie jest popularna w High-frequency trading?

Zobacz pozostałe 7 komentarzy
Shalom
No nie wszystko da się skalować w nieskończoność ;) Wyobraź sobie że masz n nodów które działają równolegle ale współdzielą jakiś rozproszony cache redisem czy hazelacastem, albo generują jakieś eventy na Kafkę -> gdzieś tam będzie bottleneck. W efekcie np. za dużo requestów może spowodować że kolejki requestów do obsłużenia zaczną puchnąć bo system nie będzie wyrabiać. Możesz mieć też mieć infrastrukturalny problem - może masz jakiś auto-scaling, load skoczył w górę i nowe instancje wstaną ale dopiero za minutę, a aktualne nie wyrabiają ;]
WeiXiao
@Aryman1983: no co ty ;)
Aryman1983
Aryman1983
@WeiXiao: fuck, bo już zbierałem partyzantkę złożoną z somekinda i aventusa :-) no i może z fasadina :-)
WeiXiao
@Aryman1983: biedny @ neves, @ Afish oraz @ Ktos, @ Juhas i @ szydlak @ W2K @ error91 :/
Aryman1983
Aryman1983
@WeiXiao: no zapomniałem :-)
Shalom
  • Rejestracja:około 21 lat
  • Ostatnio:prawie 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4
  1. GC to niekoniecznie problem, masz takie rzeczy jak ZGC które teoretycznie nie mają fazy stop-the-world
  2. Java jest stosowana w systemach low-latency, ale mimo wszystko to nie jest real-time. Nie masz "gwarancji" czasowych ani możliwości stosowania jakichś "przerwań". Z tego względu to raczej słaby wybór dla systemów sterowania, szczególnie takich które wymagają circuit breakerów i interlocków. Ale już w systemie z dużą bezwładnością (np. jakieś pompy wodne czy chłodzenie) pewnie spokojnie dałoby się to zrobić, bo to czy coś się wykona 5-10ms później nie robi różnicy
  3. Szukaj raczej pod low-latency i HFT, nie pod real-time

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
Wibowit
ZGC (i Shenandoah GC) ma fazy STW, ale typowo na poziomie 1-2 ms. Brak STW jest chyba w Azul C4 - tam każdy wątek z osobna wisi sobie na alokacji, jeżeli GC nie nadąża z odśmiecaniem pamięci. Zaletą braku STW i zamiany go na pauzy podczas alokacji jest to, że wątki które aktualnie nic nie alokują nie będą w ogóle zatrzymywane. Głowy jednak za to nie dam, bo dawno nie czytałem o Azul C4.
Wibowit
Chociaż z drugiej strony, Azul zatrzymuje sobie wątki (niezależnie od siebie), by przeskanować ich stosy, więc jakieś tam minimalne zatrzymywanie tych wątków jest: https://www.artima.com/lejava/articles/azul_pauseless_gc.html The algorithm itself is a truly pauseless algorithm, meaning that at no point during this algorithm do you need to stop all the threads and not let them move. Individual threads may need to be stopped to do some scanning in their stacks or something, but other threads don't have to be stopped at the same time. It is technically a fully pauseless algo
vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2
edytowany 5x, ostatnio: vpiotr
infantylny
  • Rejestracja:około 6 lat
  • Ostatnio:około 14 godzin
  • Postów:62
0

Dzięki wielkie za artykuły i za rady :). Próbował ktoś pisać rozwiązania RealTime w Javie? Czy implementacja kodu jest dużo bardziej złożona niż np. pisząc serwer w C++ i wykorzystując do komunikacji WebSocket? I czy miał ktoś do czynienia ze wspomnianą wyżej JamaicaVM? Nie chciałbym się wkopać z inżynierką w nie wiadomo jak złożony projekt. Niestety wymagania czasowe są raczej konieczne w pracy dyplomowej, przynajmniej osoba u której chciałbym robić pracę dyplomową tego wymaga. Chyba, że ktoś ma jakiś pomysł na projekt wykorzystujący Javę. Dodam że studiuję automatykę i robotykę, ze specjalizacją automatyka i systemy sterowania, więc sterowanie jakimś procesem byłoby tu raczej konieczne, zamiast tworzenia jakiejś fajnej gierki na telefon :).

vpiotr
  • Rejestracja:ponad 13 lat
  • Ostatnio:prawie 3 lata
2

Nie wiem czy hasła "web", "Web Socket", "JavaScript", "baza danych" jakoś można legalnie wiązać z hasłem "realtime".
Nie siedzę w tej branży i nie wiem do końca jak taki "symulator realtime" miałby wyglądać.

Może na zasadzie trój-warstwowej, nie wiem:

  • serwer: moduł real-time
  • serwer: pamięć współdzielona
  • serwer: serwer web
  • klient web

Nie wiem czy ten web w ogóle potrzebny. Nie wystarczy REST API?
Raczej byłbym za tym żeby zrobić z setkę benchmarków i statystyk niż żeby się jarać wyglądem czy frejmłorkiej JS który aktualnie jest na topie w tej połowie tygodnia.

infantylny
W zasadzie to chyba masz rację, na studiach i tak wykładowcy najbardziej lubią wykresiki :). Muszę bardziej pomyśleć nad tym co bym chciał zasymulować i w jaki sposób przedstawiać wyniki symulacji i przy okazji poczytam coś więcej o informacjach zawartych w Twoich linkach i wtedy ewentualnie zgłoszę się z problemami. Dzięki za pomoc :).
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)