“Návod” pro používání frameworku DSand #
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 standardní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 zjistit 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 recipient, Message message)
. recipient
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átoremsrc
zasílá procesu s identifikátoremdst
. - Metoda
getReliability(String src, String dst)
ovlivňuje spolehlivost komunikačního kanálu od procesusrc
k procesudst
. Pokud proces s identifikátoremsrc
zasílá zprávu procesu s identifikátoremdst
, 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 metodaact()
). To umožňuje například simulovat různé rychlosti běhu procesů (procesy se v návratové hodnotě metodygetProcessesToWake()
objevují s různou frekvencí), tak jejich havárii (proces se v návratové hodnotě metodygetProcessesToWake()
po určité době přestane objevovat).