Visualizzazione degli elementi con un timer per il conto alla rovescia

4

Sto creando un widget per argomenti rotanti. La funzionalità è la seguente:

  • Ogni argomento viene visualizzato uno alla volta sulla home page e ha una durata di 30 secondi.
  • Nella pagina viene visualizzato un timer per il conto alla rovescia. Quando raggiunge lo zero, l'argomento corrente viene contrassegnato come "mostrato" e viene visualizzato l'argomento successivo.
  • Gli utenti possono scegliere argomenti "mi piace", nel qual caso l'argomento ottiene una durata aggiuntiva di 5 secondi (il timer del conto alla rovescia deve aggiornarsi da solo a questo punto).
  • Il conto alla rovescia del conto alla rovescia deve sempre visualizzare la durata allocata attuale per l'argomento, quindi ad esempio se un utente "piace" un argomento, le persone che accedono al sito dovrebbero vedere immediatamente la durata aggiornata per quell'argomento. Fondamentalmente tutto deve essere mostrato in "tempo reale". Gli argomenti sono memorizzati in un database MySQL. Ho problemi con gli ultimi due punti sopra.

Il modo in cui ho provato a farlo finora è avere una richiesta AJAX che viene inviata ogni secondo a dedurre 1 secondo dalla durata dell'argomento corrente. La risposta alla richiesta è la durata corrente dell'argomento.

Il problema con questo è che funzionerà solo fino a quando qualcuno sta accedendo al sito. So che probabilmente posso creare uno script CRON per eseguire questo processo in background, ma farlo funzionare ogni secondo sarebbe un po 'folle. Ci deve essere una soluzione molto più semplice a questo problema. Quale sarebbe il modo più efficace per farlo?

    
posta GSTAR 21.06.2013 - 00:00
fonte

2 risposte

1

Se ogni utente chiamerà il tuo sito ogni secondo sei nei guai. Non è davvero una soluzione scalabile e presumo che tu voglia che questo sito sia grande e famoso con migliaia di utenti.

Il mio suggerimento è il seguente:

  • La tabella degli argomenti dovrebbe memorizzare le informazioni fino a che ora un determinato argomento è l'argomento corrente, denominato expire_time o qualcosa del genere.
  • Quando un utente richiede una pagina, invia la pagina insieme al numero di secondi rimasti fino alla scadenza della pagina e ne deve essere caricata una nuova. Dal momento che il tempo non può essere più breve (solo più a lungo) non si può fare un controllo ogni secondo. Hai detto che volevi che il tempo rimanesse per essere "in tempo reale", ma ti suggerisco di "fingere" facendo solo una richiesta ogni 5-10 secondi o qualcosa del genere. Puoi ancora avere un conto alla rovescia. E poiché Mi piace aggiunge 5 secondi non ha senso avere una precisione maggiore di quella del tuo "tempo reale".
  • Quando qualcuno preme il pulsante Mi piace aggiungi solo 5 secondi alla colonna expire_time .
  • Quando scade la pagina di un utente (o ogni 5-10 secondi) viene effettuata una richiesta al server con l'argomento dell'argomento visualizzato corrente come argomento. Se qualcuno ha premuto Mi piace , è possibile fornire una risposta Timeout esteso con il numero esteso di secondi per la visualizzazione dell'argomento. Non è necessario passare nuovamente il testo dell'argomento perché l'utente lo ha già. Se nessuno ha premuto mi piace, e l'argomento è scaduto, l'argomento successivo viene restituito e mostrato e la pagina utente inizia un nuovo conto alla rovescia di 30 secondi.
  • Se nessun utente è online, non è necessario ruotare gli argomenti, quindi non vedo la necessità di un cron job. Invece, quando arriva il primo utente e non c'è un argomento attivo, il server seleziona solo un nuovo argomento come attivo e imposta una scadenza di 30 secondi su di esso.

Suggerirei anche:

  • Imposta una quantità massima consentita di Mi piace per un determinato argomento. Se a 1000 persone piace un argomento, verrà mostrato per circa 1,5 ore e per coloro che vogliono vedere il prossimo argomento che potrebbe essere noioso. Forse puoi aggiungere step in time, quindi i primi like aggiungono 5 sec ma quando hai 10 like aggiunge solo 4 sec, dopo 50 like solo 3 sec, dopo 200 like solo 2 sec e così via.
  • Probabilmente hai anche bisogno di una sorta di IP o di registrazione dei cookie per ID argomento, quindi non un utente crea uno script che ti spammella di Mi piace e quindi un argomento viene mostrato per sempre.
  • Il tempo reale è bello ma anche molto pesante per il server quando si hanno molti utenti. Il mio suggerimento è di avere almeno un parametro nel codice in cui è possibile passare tra un aggiornamento ogni 5-10 secondi e l'attesa fino alla scadenza prima di effettuare un nuovo aggiornamento. In questo modo hai turbo injection per il tuo programma nel caso in cui tu abbia troppi utenti e desideri temporaneamente una maggiore velocità sul server.

Buona fortuna per il tuo progetto!

    
risposta data 14.08.2013 - 11:12
fonte
0

Non mi piace il lungo polling in generale, ma devo ammettere che questa sarebbe un'applicazione perfetta per link . Basta fare una richiesta, tenerla aperta, consumare i dati così come vengono inviati.

Avrai meno richieste sul tuo server web e gli utenti riceveranno aggiornamenti con una latenza molto inferiore rispetto a quella attuale.

    
risposta data 21.06.2013 - 02:06
fonte

Leggi altre domande sui tag