Come posso progettare un sistema di moderazione efficiente per i commenti?

6

Ecco il lavoro che voglio fare:

Il mio progetto è un sito web in cui ci sarà un lotto di commenti. Questi commenti saranno moderati: un moderatore si connetterà, vedrà i commenti e li accetterà o rifiuterà.

Ho bisogno di queste cose:

  • i commenti non avranno alcun "moderatore" associato. Il che implica che quando un moderatore si connette, il sistema "assegna" i 20 primi commenti a questo moderatore e li invia tramite una richiesta AJAX / JSON
  • naturalmente, questo implica che quei commenti non possono essere assegnati ad altri moderatori

Come posso creare un disegno in modo tale da essere sicuro che "ottenere i primi 20 commenti per un moderatore" può essere un'operazione atomica? E c'è un'altra cosa da pensare (non so se potrebbe avere un impatto o meno sul mio problema): se ci sono 10 moderatori connessi, uno di loro ha 20 commenti da convalidare, e questo ragazzo lascia il suo PC per tutto il giorno. Potrei implementare una sorta di "timeout" per questo moderatore, quindi, quando tenta di convalidare, un messaggio gli dirà "scusa questo commento è già stato moderato da un altro moderatore", e lo script AJAX otterrà un "nuovo 20 nuovi commenti ).

La mia prima idea è stata l'idea più semplice:

  • un moderatore si connette
  • uno script jQuery AJAX chiede al server 20 commenti
  • il server (1) fa immediatamente una richiesta dei primi 20 commenti gratuiti al database
  • il server (2) "blocca" i 20 commenti gratuiti
  • il server (3) crea una risposta JSON e la invia

Ma le operazioni (2) e (3) non sono atomiche, cosa succede se, nel mezzo, un altro operatore chiede i primi 20 commenti gratuiti? Entrambi riceveranno i primi 20 commenti gratuiti. Questa non è una buona soluzione. Penso che questo sia un classico problema di funzionamento atomico su db. Qualche idea su come progettare questo (o dove cercare)?

Grazie davvero!

    
posta Olivier Pons 15.10.2011 - 08:03
fonte

2 risposte

3

Stai pianificando di occuparti di molte attività simultanee, quindi significa che devi pensare in termini di operazioni atomiche. Ciò significa utilizzare le transazioni.

Ora, non vuoi tenere una transazione per un lungo periodo perché blocca altre transazioni, quindi devi pensare di utilizzare le transazioni per proteggere le modifiche minime dello stato e mettere protezioni sulle operazioni UPDATE in modo che solo le cose che dovrebbero cambiare davvero.

Cosa vorresti aggiornare? Bene, il primo passo deve essere quello di introdurre un'associazione tra il commento e il moderatore a cui è assegnato, ma devi anche impostare un tempo dopo il quale la moderazione diventa non valida (in modo che un lavoro di pulizia separato possa sapere per resettare l'associazione e lasciare che altri moderatori abbiano a disposizione). Concettualmente, stai facendo:

Per l'inizio della moderazione:

  • In una transazione:
    • Scegli 20 commenti che non sono assegnati a un moderatore.
    • Per ognuno di questi, assegnali al moderatore "corrente" e imposta un tempo di scadenza (ad es. in 15 minuti).

Sul rendimento di un'azione di moderazione per un commento:

  • In una transazione:
    • Verifica se il commento è ancora assegnato al moderatore "attuale".
    • Verifica se il tempo di scadenza è stato raggiunto.
    • Se entrambe le condizioni sono vere, aggiorna il commento con il suo nuovo stato di moderazione e rimuovi l'associazione con il moderatore.
    • Se uno è falso, gemito!

Come attività di pulizia separata (eseguita ogni X secondi):

  • In una transazione:
    • Passa attraverso la tabella dei commenti assegnati e se il tempo di scadenza su una voce è nel passato, rimuovi il compito.

Considerato quanto sopra, probabilmente vorrai avere la relazione tra gli ID dei commenti, i moderatori e i tempi di scadenza in una tabella separata che è indicizzata dall'ID del commento (che potrebbe anche essere ragionevolmente la chiave primaria).

    
risposta data 15.10.2011 - 10:05
fonte
0

In passato, quando ho dovuto eseguire la moderazione o i pannelli di amministrazione, ho creato un CMS creato appositamente per lavorare su quel sito web. La ragione per cui lo faccio è semplice. È fastidioso provare a costruire per correggere l'interfaccia di amministrazione per lavorare con un nuovo sito. Ci vuole tempo e non si vuole dover far cadere il sito principale ogni volta che si effettua una modifica al pannello di amministrazione. Un altro motivo è il modo in cui si guardano i dati su un sito, mentre l'amministrazione è diversa. Vorrei andare con il metodo Donald Fellows e forse in itws own cms.

Modifica:

E quando dico di averlo inserito nel suo stesso cms intendo che il nuovo cms è solo un pannello di amministrazione. Quindi non esiste un sito solo un pannello di amministrazione.

    
risposta data 16.10.2011 - 08:59
fonte

Leggi altre domande sui tag