Vale la pena utilizzare un sistema di code messaggi in questo caso?

3

Abbiamo queste cose chiamate "esecuzioni" che vengono eseguite in determinati momenti. Hanno una proprietà delay che in pratica dice "eseguimi dopo delay microsecondi". Attualmente stiamo usando Cassandra come coda, ma sicuramente non è scalabile e il database non è lo strumento migliore per una coda.

Potrei implementarlo come una coda di priorità, ma dal momento che prevediamo di ricevere un numero elevato di messaggi, non posso mantenerlo in memoria. Stavo pensando di usare l'ActiveMQ di Apache che supporta la priorità, ma mi chiedo se valga la pena di inserire un intero framework. La mia altra opzione è quella di implementare una coda di priorità scritta sul disco (usando MappedByteBuffer ). La seconda opzione è più lavoro, ma più direttamente riguarda il nostro caso d'uso. Non mi dispiace usare ActiveMQ e sarebbe sicuramente più facile, ma mi chiedo solo se valga la pena di inserire un intero framework quando userò solo una piccola parte di esso.

Un altro contesto:

Abbiamo questi script che estraggono dati da diverse fonti. Lo script restituisce i dati, insieme a un oggetto di "esecuzione" che dice "eseguimi di nuovo dopo delay microsecondi" (in pratica il polling dei nuovi dati). Attualmente questa esecuzione è scritta su Cassandra, e un thread periodicamente esegue il polling e preleva questi e poi chiama lo script appropriato.

Mentre leggo di più nelle code dei messaggi, mi rendo conto che potrebbe anche non funzionare. ActiveMQ ha una lista fissa di priorità, mentre io voglio una coda di priorità che supporti valori di priorità arbitrari.

Suppongo che sia più o meno un programmatore. Ogni esecuzione è "pianificata" per essere eseguita dopo delay microsecondi. Sarebbe più appropriato usare qui una struttura di programmazione? Ce n'è uno che supporta le priorità?

    
posta Vivin Paliath 29.05.2015 - 21:48
fonte

2 risposte

1

Pensa a ciò che devi tenere in memoria per eseguire i lavori; può essere semplice come solo un ID di lavoro, il prossimo tempo di esecuzione e il tempo di ripetizione periodico. Nel caso più semplice (e forse semplificato), tutto può rimanere nel database e il motore di esecuzione deve solo conoscere il lavoro successivo da eseguire.

Crea un profilo, considera i carichi probabili e di punta, quindi aggiungi agenti di lavoro, dispatcher e code (oh mio!) secondo necessità. O qualcosa di completamente diverso;)

    
risposta data 31.05.2015 - 07:01
fonte
1

Come ho capito, devi:

  1. esegui lo script
  2. recupera i dati e pianifica l'esecuzione successiva dello script dopo delay con una priorità

Vorrei implementare il passaggio 2. usando un framework di programmazione, come Quartz. Quartz offre la possibilità di assegnare priorità alle esecuzioni nel caso in cui vengano attivate contemporaneamente:

Trigger trigger = newTrigger() 
    .withIdentity(triggerKey("myTrigger", "myTriggerGroup"))
    .startAt(futureDate(delay, SECONDS))
    .withPriority(priority)
    .build();

L'esempio completo può essere trovato in Quartz tutorial .

Questo approccio non richiede alcuna tabella di database aggiuntiva. Se è necessaria la persistenza, è possibile utilizzare la configurazione di JobStore JDBC per archiviare i dati di pianificazione nel database.

    
risposta data 31.05.2015 - 07:51
fonte

Leggi altre domande sui tag