Warning
This page is located in archive.

Pro simulaci problémů, se kterými se můžete setkat při implementaci distribuovaných systémů, budeme používat v rámci předmětu framework DSand. Tento framework nevykonává řešení skutečně na více počítačích, nicméně nám umožňuje simulovat některé ze standartních problémů, které mohou nastat, konkrétně například:

  • Konfigurovatelnou (respektive variabilní) dobu potřebnou pro doručování zpráv (tj., latenci sítě)
  • Nespolehlivé doručování sítě (tj., nestabilitu sítě)
  • Různé rychlosti procesů
  • Havárie (nedostupnost) procesů

Vaším úkolem bude implementovat logiku procesů (potomků třídy DSProcess), návod k frameworku je proto koncipován z pohledu procesů.

Architektura simulace

Simulace distribuovaného systému běží na jediném počítači a jediném vláknu. Jednotlivé procesy jsou proto probouzeny simulací (je zavolána metoda act() procesu) a dostávají tak čas na vykonání potřebné práce (především zpracování a odeslání zpráv). Vzhledem k tomu, že procesy neběží současně, musí proto metoda act() vždy skončit v konečném (krátkém) čase!

Procesy jsou ve frameworku reprezentovány instancemi třídy odděděné od třídy cz.cvut.fel.agents.pdv.dsand.DSProcess. Každý proces je identifikován v rámci simulace podle svého identifikátoru (String), který slouží i jako cílová adresa při zasílání zpráv. Identifikátor aktuálního procesu můžete zjisti z atributu id procesu. Často při implementaci pořebujete znát i identifikátory ostatních procesů, se kterými budete komunikovat - ty vám typicky předáváme v konstruktoru potomka třídy DSProcess, který máte za úkol implementovat.

Pro zasílání zpráv používejte metodu send(String rcpt, Message message). rcpt je identifikátor procesu, kterému chcete zprávu zaslat, message je instance zprávy, kterou chcete zaslat. Zprávy si můžete naimplementovat vlastního typu, avšak musíte dodržet, že zprávy dědí od třídy cz.cvut.fel.agents.pdv.dsand.Message a musí obsahovat pouze atributy, které jsou serializovatelné. Pokud je aktuálnímu procesu doručena zpráva, je umístěna do jeho fronty inbox (java.util.Queue). Doporučujeme vám v každé iteraci (při každém vykonání metody act(…)) zpracovat všechny zprávy v inbox – v opačném případě může dojít k zahlcení systému nepřečtenými zprávami.

V případě, že chcete simulaci ukončit (a tím ukončit běh aplikace), můžete zavolat metodu terminateAll().

Nastavení a průběh simulace

Průběh simulace je parametrizovaný instancí třídy cz.cvut.fel.agents.pdv.dsand.DSConfig (respektive jejího potomka).

  • Metoda getDeliveryDelay(String src, String dst) ovlivňuje počet simulačních kroků potřebných pro doručení zprávy, kterou proces s identifikátorem src zasílá procesu s identifikátorem dst.
  • Metoda getReliability(String src, String dst) ovlivňuje spolehlivost komunikačního kanálu od procesu src k procesu dst. Pokud proces s identifikátorem src zasílá zprávu procesu s identifikátorem dst, tato zpráva bude ztracena s pravděpodobností 1 - getReliability(src, dst).
  • Metoda getProcessesToWake() vrací procesy (respektive, jejich identifikátory), které se mají v aktuálním cyklu simulace probudit (tj., má se zavolat jejich metoda act()). To umožňuje například simulovat různé rychlosti běhu procesů (procesy se v návratové hodnotě metody getProcessesToWake() objevují s různou frekvencí), tak jejich havárii (proces se v návratové hodnotě metody getProcessesToWake() po určité době přestane objevovat).
courses/b4b36pdv/dsand.txt · Last modified: 2019/04/24 22:16 by horakka5