Gestione del timeout nell'applicazione di rete

1

Come posso gestire i timeout in un'applicazione di rete.

Sto implementando un sistema di provisioning su un server Linux, il codice è enorme quindi ho intenzione di inserire l'algoritmo, funziona come in questo

  1. Leggi i comandi di provisioning dal file
  2. Invia ad un altro server usando TCP
  3. Salva la richiesta in hash.
  4. Ricevi la risposta allora
    1. se la risposta è stata ricevuta, rimuovere la richiesta dall'hash
    2. se la risposta non riuscita è stata ricevuta, riprova il messaggio

Il problema in cui mi trovo ora è quando il programma non ha ricevuto la risposta per un motivo di timeout, quindi la richiesta attenderà una risposta per sempre e non verrà ritentata.

E tieni presente che invierò centinaia di comandi e devo monitorare i comandi di timeout per tutti loro.

Ho provato a usare il timer, ma questo non ha aiutato perché avrò molti timer di attesa e non sono sicuro che questo sia un buon modo per farlo.

La domanda è: come posso salvare il messaggio in qualche struttura dati e controllare se rimuovere o riprovare più tardi quando non c'è risposta dall'altra parte?

Tieni presente che sono disposto a modificare l'algoritmo in base a qualsiasi cosa tu suggerisca che potrebbe gestire i timeout.

    
posta user2175831 27.03.2013 - 22:21
fonte

1 risposta

1

I'll end up with so many waiting timers and I'm not sure if this is a good way of doing this.

Un sacco di timer non è generalmente un problema. Internamente, il tuo sistema operativo sta "facendo la cosa giusta" (basta impostare un timer sull'evento successivo e mantenere il resto su un elenco ordinato).

Se si desidera ridurre il numero di timer, arrotondare i timeout al secondo (o N secondi) più vicino e riutilizzare il timer impostato. Ma ciò richiede una struttura dati complessa.

I'm using hash, sweeping structure here doesn't work

Eh? Il tuo hash dovrebbe consentire di enumerare le chiavi. Quindi cerca ogni tasto dell'hash, cercando le cose che non sono state riprovate da un po '. (Chiamato informalmente "sweeping") Se hai solo "centinaia" di eventi, spazzare la lista non sarà un problema di prestazioni.

(In realtà, se parliamo solo di "centinaia", salterò tutto il resto del timer. Basta impostare un timer per sparare ogni 5 secondi. Spazzare la struttura e fare tutti i tentativi necessari. essere meno codice, e non essere un problema di prestazioni.)

In alternativa, mantieni un elenco ordinato dei tuoi eventi (oltre all'hash). L'elenco può contenere solo la chiave dell'hash o i puntatori all'hash. Poi, quando un timer colpisce, fai fuori tutti gli eventi che devono essere nuovamente inviati. Interrompi il popping quando l'evento non è ancora scaduto e imposta un altro timer per quel timeout.

Assicurati di preoccuparti di come spegnerai il servizio con garbo.

    
risposta data 22.09.2013 - 02:50
fonte

Leggi altre domande sui tag