Wpis z mikrobloga

Mirki powiedzmy, że chcę złożyć klaster z 16 identycznych maszyn.
W jaki sposób łączy się je w jedno i balansuje obciążenie/ruch?
A co się dzieje, jeżeli maszyny nie są identyczne?
Założenie jest takie, że serwer obsługuje różnych klientów którzy łączą się do niego przez sieć i dostają od niego zadania do przeliczenia.
#klastry #programowanie też trochę wołam, bo chcę coś w tym stylu sam zacząć ale szukam inspiracji bo nie wiem czy mój pomysł jest ok.
  • 17
@rentaro1: Chciałbym zaimplementować to sam.
Idea jest taka, że jest jeden serwer do którego łączą się maszyny klienckie przez aplikację, aplikacja wykonuje wszystkie obliczenia itd. i odsyła rezultat do serwera.
Bardziej chodziło mi o to w jaki sposób prawidłowo rzucać zadania. Czy zawalić klientów danymi i czekać aż wszystko się przeliczy czy wysyłać i odbierać pojedynczo...
+ pewnie jakieś szczególiki i informacje do projektowania całości są gdzieś.
@Wyrewolwerowanyrewolwer: Jak pójdziesz na magisterkę na KASK to się dowiesz ( ͡° ͜ʖ ͡°)

A tak bardziej serio, to chodzi Ci o sposoby dystrybucji pracy między jakimś węzłem master, a N węzłami slave?
Ogólnie to nie są trywialne problemy, a rozwiązanie zależy od specyfiki konkretnego zadania.
Na przykład jeśli masz M zadań, o których wiesz, że mają taką samą złożoność, to możesz od razu rozesłać każdemu z
Jak pójdziesz na magisterkę na KASK to się dowiesz ( ͡° ͜ʖ ͡°)


@UsyDev: Z racji koła jakiś tam dostęp do katedry mam, więc myślę że złapać kogoś i wypytać to nie będzie problem ( ͡° ͜ʖ ͡°)

Dzięki za opis.
Zadanie jest identyczne, ale od losowości zależy który z dwóch warunków zakończy wykonanie. Do tego dochodzi to, że może przyłączyć się jakiś
@UsyDev: Tak, no ogólnie podłączanie/odłączanie to coś czego nie da się uniknąć polegając na ludziach, dlatego myślę że najbardziej optymalne będzie wysyłanie pojedynczych pakietów danych do przeliczenia do klienta i ustawienie jakiegoś tam czasu timeoutu żeby to przeliczył. Z tym, że dając jakiś tam timeout może powstawać "wyścig wątków"(?).
Nie, dla siebie to robię. Tak mniej więcej to zaczęło się przez projekt na pp (kazali napisać tetrisa). Stwierdziłem, że napiszę do
@wytrzzeszcz: Teraz chcę symulować n rozgrywek w tetrisa dla każdego osobnika (klient dostaje parametry osobnika, przeprowadza te n-rozgrywek na k-wątkach w zależności ile przed połączeniem do serwera udostępni aplikacji), a później odsyła wskaźnik przystosowania tego osobnika razem z jakimś jego identyfikatorem (jeszcze tego rozróżniania nie zaimplementowałem).
Docelowo chcę to napisać tak, żeby w łatwy sposób przepisać kod i przeprowadzać dowolne obliczenia dające rozbić się na wiele równoległych zadań.
Najlepiej to byłoby
Nie, dla siebie to robię.

Stwierdziłem, że napiszę do tego ai i genetyka.

Ambitnie... bardzo dobrze :>

Imo tak naprawdę timeout nie jest potrzebny, wystarczy pamiętać listę zadań do wykonania, zadań wysłanych, ale bez odpowiedzi i zadań jeszcze nie wysłanych.
Jeśli masterowi skończą się zadania jeszcze nie wysłane, to ponownie zaczyna wysyłać zadania wysłane, ale na które jeszcze nie otrzymał odpowiedzi. Jak któryś ze slave'ów odpowie, to master zapisuje sobie jego wynik,
Ambitnie... bardzo dobrze :>


@UsyDev: W zasadzie to to już działa, teraz tylko piszę GUI żeby wizualizować to co się dzieje, a nie dostawać tylko wynik w postaci tekstowej ( ͡° ͜ʖ ͡°)

Jeśli masterowi skończą się zadania jeszcze nie wysłane, to ponownie zaczyna wysyłać zadania wysłane, ale na które jeszcze nie otrzymał odpowiedzi. Jak któryś ze slave'ów odpowie, to master zapisuje sobie jego wynik, a jeśli
Przy takim wywoływaniu obawiam się zablokowania działania całego "klastra".

No ok, jeśli obliczenia mogą trwać bardzo długo, to mogłoby dojść do sytuacji, w której master roześle to samo zadanie do wszystkich slave'ów, każdy z nich będzie je liczył, ale w tym czasie żaden jeszcze nie zwróci odpowiedzi.
Żeby tego uniknąć można zastosować jakieś wiadomości kontrolne, cyklicznie przesyłane do mastera, mówiące czy slave nadal nad tym pracuje i jaki jest jego progres (np.
@UsyDev: Piszę w Javie. Staram się używać jak najmniej gotowych rozwiązań i pisać jak najwięcej swoich rzeczy. Np. zamiast używać executor service rozpisałem całość na threadach (uruchamianie tych które są gotowe i limit nie jest jeszcze przekroczony, zbieranie wyników etc). Chcę zrozumieć tyle ile się da, a myślę że takie kombinowanie sporo mnie nauczy.
Sieć będzie leciała po servletach zamiast przez gotowy serwer. Znajdzie się jeszcze kilka takich kwiatków.