Devo progettare un sistema di pianificazione delle attività scalabile basato su Redis.Esecuzione scalabile dell'attività ritardata con Redis
Requisiti:
- più processi di lavoro.
- Molte attività, ma sono possibili lunghi periodi di inattività.
- Precisione di sincronizzazione ragionevole.
- Scarto di risorse minime inattivo.
- Utilizzare l'API Redis sincrona.
- Dovrebbe funzionare per Redis 2.4 (ovvero nessuna funzionalità dal prossimo 2.6).
- Non utilizzare altri mezzi di RPC rispetto a Redis.
Pseudo-API: schedule_task(timestamp, task_data)
. Il timestamp è in secondi interi.
idea di base:
- Ascolta per le prossime attività su lista.
- Mettere le attività ai bucket per timestamp.
- Sospendi fino al timestamp più vicino.
- Se una nuova attività appare con data e ora inferiore a quella più vicina, sveglia.
- Elaborare tutte le attività imminenti con timestamp ≤ ora, in lotti (presupponendo che l'esecuzione dell'attività sia veloce).
- Assicurarsi che il lavoratore concorrente non elabori le stesse attività. Allo stesso tempo, assicurati che nessuna attività venga persa in caso di arresto anomalo durante l'elaborazione.
Finora non riesco a capire come adattare questo primitive Redis ...
Degli indizi?
Si noti che esiste una domanda simile precedente: Delayed execution/scheduling with Redis? In questa nuova domanda introduco maggiori dettagli (soprattutto, molti lavoratori). Finora non ero in grado di capire come applicare le vecchie risposte qui - quindi, una nuova domanda.
Vorrei ricordare esplicitamente che il polling di una chiave Redis in un ciclo violerebbe il requisito "spreco minimo di risorse quando inattivo". I lavoratori dovrebbero dormire quando non c'è niente da fare. Il polling –
con BLPOP/BRPOP può bloccare fino a quando l'elenco è pieno ed è ciò che la maggior parte delle persone usa per farlo. Di solito blocchi per qualche secondo in un ciclo, ma in termini di tempo della CPU è trascurabile. È possibile utilizzare redis pub/sub, ma ciò è negativo perché se non c'è un lavoratore, le attività andranno perse. –
@Not_a_Golfer: le cose sono un po 'più complicate di BLPOPping di una singola lista. Si noti che è necessario eseguire l'esecuzione ritardata dell'attività (ad esempio, l'utilità di pianificazione), non un semplice processore di attività. –