Come gestire lo stato client-server UDP

0

Sto cercando di scrivere un'applicazione Java che funzioni in modo simile a MapReduce. C'è un server e diversi lavoratori. I lavoratori possono entrare e uscire a loro piacimento e l'appartenenza al gruppo ha uno stato "soft". Per diventare parte del gruppo, il lavoratore deve inviare un datagramma UDP al server, ma per continuare a far parte del gruppo, il lavoratore deve inviare il datagramma UDP al server ogni 5 minuti. Al fine di accogliere errori temporanei, a un operatore è permesso di perdere fino a due datagrammi UDP periodici consecutivi. Pertanto, il server deve tenere traccia dell'attuale gruppo di lavoratori e dell'ultima volta in cui ciascun lavoratore ha inviato un datagramma UDP.

Ho implementato una classe chiamata WorkerListener che implementa Runnable e ascolta i datagrammi UDP su una particolare porta UDP. Ora, per tenere traccia dei lavoratori attivi, questa classe può mantenere un HashSet (o HashMap). Quando viene ricevuto un datagramma, il server può interrogare HashSet per verificare se si tratta di un nuovo membro. In tal caso, può aggiungere il nuovo lavoratore al gruppo aggiungendo una voce in HashSet. In caso contrario, è necessario ripristinare un "timer" per il lavoratore, osservando che ha appena sentito dal lavoratore corrispondente. Sto usando la parola timer in senso generico. Non deve essere un orologio di sorta. Forse questo potrebbe anche essere implementato usando int o variabili lunghe.

Inoltre, il server deve eseguire un thread che monitora continuamente i timer per i lavoratori per vedere che un client che va in time out su due intervalli di datagrammi consecutivi, viene rimosso da HashSet. Non voglio farlo nel thread WorkerListener perché si bloccerebbe nella funzione UDP datagramma receive (). Se creo un thread separato per monitorare il worker HashSet, dovrebbe essere una classe diversa, forse WorkerRegistrar. Devo condividere l'hashset con quel thread. Anche l'esclusione reciproca deve essere implementata.

La mia domanda è, qual è il modo migliore per farlo? Puntatori a qualche esempio di implementazione sarebbero grandiosi. Voglio utilizzare l'implementazione JDK di barebones e non alcune API di manutenzione dello stato di fantasia che si occupano di tutto, perché voglio che questa sia una dimostrazione utile per una classe che sto insegnando. Grazie

    
posta user92947 04.06.2013 - 07:46
fonte

1 risposta

1

My question is, what is the best way to do this? Pointers to some sample implementation would be great

La migliore implementazione di esempio che posso pensare è ZooKeeper .

I want this to be a useful demonstration for a class that I am teaching

Sul sito ZooKeeper è presente una vasta documentazione di architettura che ti guiderà attraverso i problemi che incontrerai se tenti di implementare funzionalità simili. Ma devo chiederti: stai davvero aiutando i tuoi studenti se non capisci completamente cosa stai insegnando loro?

    
risposta data 04.06.2013 - 15:08
fonte

Leggi altre domande sui tag