Strategia per i client per recuperare il registro in tempo reale dal server HTTP

1

Ho un'applicazione del servizio HTTP Server che ha il proprio meccanismo di registrazione. È scritto in Delphi. Vorrei fornire un modo per collegare più client a questo servizio e ottenere un aggiornamento in tempo reale del registro. Il log nel servizio si muove piuttosto veloce, ci sono un sacco di cose da registrare. Potrebbero esserci fino a 50 messaggi entro 1 secondo a volte. Il log esistente che è già implementato non viene salvato, è solo tenuto nella memoria del servizio server - dove dovrò distribuirlo a qualsiasi client che ne ha bisogno. Una volta che tutti i client hanno un messaggio di log, dovrebbe essere cancellato.

Intendo utilizzare HTTP per "chiedere" al server il log e rispondere con un pacchetto XML. Le connessioni non sono keep-alive. L'unico problema è che il server deve solo inviare al client quei record di registro di cui ha bisogno, non tutto. Non ho modo che il server spinga il log ai client in tempo reale, quindi ogni client deve chiedere ripetutamente al server gli ultimi record di log. Questo server HTTP è molto leggero e non esiste una gestione delle sessioni. Non esiste nemmeno alcun tipo di autenticazione.

L'unico modo che vedo è che un client si registri sul server e ogni volta che viene creato un log sul server, crea una copia del log per ogni client, dove ogni client ha una coda di log (stringa elenco). Tuttavia, supponiamo che ci siano 100 client connessi e in attesa di ricevere questo registro. Ciò significa che il server deve creare 100 copie di ciascun registro, aggiungere questo registro alla fine di ogni coda di log del client e attendere che il client lo richieda. A quel punto, quando il server risponde con il log XML, deve svuotare (eliminare) qualunque cosa sia nella coda. Sono preoccupato tuttavia che ciò potrebbe causare problemi di memoria. Ogni coda di log del client potrebbe ricevere 100 messaggi di log prima che il client richieda i log più recenti.

Come dovrei fare questo nel modo più veloce possibile senza ostacolare le prestazioni del server? Sto cercando di evitare di dover creare una copia di ogni registro per ciascun client.

    
posta Jerry Dodge 30.11.2012 - 01:47
fonte

1 risposta

1

Perché non fornire a ogni client un cookie che ha l'indice dell'ultima riga inviata al client. Quando il client richiede una nuova porzione del log, basta leggere il modulo dell'indice e restituire qualcosa come

$tail -n <current_number_of_lines_in_the_log - index_from_cookie> the_log.txt

al cliente mentre allo stesso tempo

Set-cookie: lines=current_numer_of_lines_in_the_log

nell'intestazione della risposta.

    
risposta data 30.11.2012 - 08:51
fonte

Leggi altre domande sui tag