Gestore del lavoro scalabile

3

Abbiamo una tabella di lavoro che attiva una notifica quando viene inserito un nuovo lavoro. I clienti che possono gestire tali lavori possono iscriversi a tali notifiche. Quando un cliente riceve una notifica, può "bloccare" il lavoro, quindi nessun altro client proverà a elaborarlo. Ci prendiamo anche cura degli errori e se un processo richiede molto tempo per essere elaborato.

Problema: un client può gestire solo lavori X nello stesso momento. In caso di carico pesante, tutti i clienti sono impegnati a gestire i loro lavori. E i nuovi lavori potrebbero non essere gestiti immediatamente. Se il client non è più occupato, può interrogare la tabella per trovare lavori che non sono stati ancora elaborati. Ma se tutti i client rimangono occupati per un lungo periodo (finiscono i lavori ma arrivano nuovi lavori allo stesso tempo), quei vecchi lavori non verranno mai elaborati.

Idea: dopo che un client ha elaborato i lavori Y, ignora tutti i nuovi lavori e interroga la tabella per i vecchi. Ma non mi sento davvero a mio agio con questa idea.

Qualche idea da te? Se hai bisogno di ulteriori informazioni non esitare a richiederli.

    
posta esskar 30.06.2014 - 15:02
fonte

2 risposte

2

Questo è il problema strettamente correlato al lavoro scheduling . Ma ci sono due problemi da considerare:

1) I tuoi clienti sono liberi di scegliere il lavoro che desiderano. Sanno quando arrivano nuovi posti di lavoro e possono scegliere quello che vogliono. Se vuoi davvero controllare ciò che fanno, dovresti davvero limitare ciò che sanno e riservare per l'elaborazione.

2) Prima di approfondire approfonditamente i dettagli e le implementazioni di come dovrebbero funzionare tutte le operazioni di pianificazione e di query, è necessario prima rispondere alle seguenti domande:

  • Che cosa desidero dalla pianificazione del mio sistema: determinismo, correttezza o efficienza di utilizzo?
  • Voglio che i miei lavori vengano gestiti prima possibile?
  • O voglio gestire nuovi lavori prima del vecchio?
  • O vecchio prima del nuovo?
  • O ci sono altre proprietà dei lavori (durata stimata, tag) che dovrebbe determinare la loro programmazione?
  • Posso interrompere preventivamente (mettere in pausa, interrompere) il lavoro per gestirne una nuova uno (non il tuo caso, ma comunque)?
  • E altre domande simili ...

Come ho capito per ora vuoi:

Gestire i nuovi lavori il prima possibile, ma non permettere mai che i vecchi lavori siano non elaborati.

La soluzione più semplice è l'elaborazione simile a FIFO con un produttore di lavoro, ma più gestori di lavoro.

Posso suggerirti qualcosa del tipo:

// Job - the data needed to process the job
public interface IJob {...}

// Client - client that handles the jobs - IJobScheduler can suggest JobClient to 
// requery for a new job if needed.
public interface IJobClient
{
    void SuggestQueryForNextJob();
}     

// Each JobClient has its own JobQuery(IJobScheduler knows what to show to each of it).                    
// JobClient can query the next job or notify about the current one.
public interface IJobQueue
{
   bool TryQueryNextJob(ref IJob nextJob); 
   void NotifyAboutJob(JobCompletionState jobCompState)
}

// Your main server, that allows JobConsumers to register themselves for job handling
public interface IJobScheduler
{
    IJobQueue RegisterConsumer(IJobConsumer consumer);     
}

Questo schema concentrerà tutta la pianificazione sul tuo JobProducer , in realtà consentendo praticamente qualsiasi modalità di programmazione possibile.

Richiederà la sua giusta quota di proxy e altre cose, ma semplificherà notevolmente il tuo JobClients .

    
risposta data 30.06.2014 - 16:21
fonte
2

Se comprendo correttamente la tua domanda, penso che il seguente approccio dovrebbe funzionare:

Se un client ignora una notifica una volta, a causa del suo carico, ignora anche tutte le notifiche successive (anche se il carico diminuisce). Da quel momento in poi, si basa solo sull'interrogazione del database per le vecchie richieste. Una volta gestite tutte le richieste precedenti, inizierà ad accettare di nuovo le notifiche.

    
risposta data 30.06.2014 - 16:02
fonte

Leggi altre domande sui tag