Sistema per la pianificazione di attività / callback paralleli

4

Sto cercando un sistema per la creazione di macchine a stati con transizioni temporizzate / pianificate e con eventi che si verificano periodicamente durante un determinato stato. Posso implementarlo da solo, sebbene ritenga che questo sia un requisito abbastanza comune che ci sarebbe una categoria di software per questo.

Non ho bisogno di una raccomandazione di libreria, venditore, ecc. Non so proprio come chiamare questa cosa, e quindi cosa google, perché non è un "cron" e non è t una "coda di messaggi". Non so se un tale strato lato server esiste attualmente, ma spero di trovare un'indicazione in un modo o nell'altro. Se questo tipo di domanda è motivo di voti bassi e voti stretti, indica decisamente questo, e magari indicami un altro SE o suggerisci miglioramenti.

L'applicazione che ho in mente è un sistema di eventi "a tempo" per videogiochi, come quelli che potresti vedere in un MMORPG (mostri periodici di mostri, ondate temporizzate, timer fallito, eventi programmati), o in un bot trivia ( timer per domande, tempo tra le domande, timer rotondo), ecc. Non sarà usato per simulazioni, fisica, ecc. quindi non lancerò eventi di granularità in tempo reale (sotto i secondi).

Il sistema che ho in mente sarebbe una sorta di sistema pub / sub e di schedulazione ibrido, che funziona interamente lato server. Sarebbe un po 'come un Javascript setTimeout , tranne che con un meccanismo più affidabile, probabilmente con una risoluzione di 1 secondo e con la possibilità di passare esplicitamente i parametri quando si pianifica il timeout. Probabilmente avrebbe anche una sorta di monitoraggio globale per scopi operativi e forse avrebbe una sorta di supporto per il ridimensionamento su più sistemi.

Non so se avrò bisogno di lanciare il mio, o se ci sono più sistemi generici che fanno già ciò che voglio che facciano. Preferirei usare un sistema esistente se possibile. C'è una tecnologia server comune che è simile, ma non credo che faccia proprio il lavoro.

Il sistema che voglio funziona in modo simile a Cron, con queste eccezioni:

  1. Dovrebbe essere funzione callback / micro-process oriented piuttosto che shell-oriented.
  2. Le attività dovrebbero probabilmente essere eseguite in un pool di sottoprocessi delegato o in-process del daemon, piuttosto che generare un nuovo processo per attività.
  3. Dovrebbe avere una risoluzione di 1 secondo (o più piccola)

Anche il sistema che voglio funziona come un messaggio o una coda di attività, con queste eccezioni:

  1. Dovrebbe consentire attività periodiche (già possibile in alcune code, credo)
  2. Dovrebbe supportare l'esecuzione parallela per le attività pianificate per un determinato tick, piuttosto che eseguirle in sequenza da una coda
  3. Non dovrebbe aspettarsi che le attività siano di lunga esecuzione e non dovrebbero costruire la sua interfaccia per le attività di lunga durata
  4. Dovrebbe essere altrettanto semplice eseguire attività ricorrenti come attività singole, senza dover creare colla per attività concatenate
  5. Dovrei essere in grado di cancellare le attività pianificate facilmente e rapidamente
  6. La robustezza di preservare e garantire l'esecuzione delle attività non è una priorità rispetto al sovraccarico per task. La scalabilità verticale e orizzontale è molto più importante di preservare attentamente i dati (a questo livello)
  7. Le attività dovrebbero probabilmente essere in grado di condividere lo stato a un certo livello (in modo che l'IPC e la latenza / overhead di esecuzione delle attività siano ridotte al minimo)
  8. Se il sistema supporta il ridimensionamento orizzontale, dovrei essere in grado di assegnare un'affinità alle attività raggruppate in modo che vengano eseguite dallo stesso stato condiviso, anziché essere inviate a un operatore arbitrario in un pool

La mia piattaforma di programmazione preferita è python, ma con un sistema stand-alone in qualsiasi linguaggio che consente l'IPC lato server a bassa latenza su un protocollo standard, mi piacerebbe utilizzare il mio linguaggio server-side preferito. Mi andrebbe anche bene con un sistema che si integra in modo specifico con i più diffusi linguaggi lato server, dato che le mie implementazioni di compiti sono probabilmente una porzione piuttosto piccola del mio sistema più grande.

Avere una capacità integrata di inviare facoltativamente eventi ai client in uno stile push sarebbe anche bello, ma sicuramente non deve essere parte di questa libreria o livello.

    
posta Merlyn Morgan-Graham 03.05.2016 - 10:41
fonte

1 risposta

1

Per essere onesti, questo mi fa pensare al ciclo JavaScript con setInterval e setTimeout e chiusure anche se non sono davvero in JavaScript.

Tuttavia qui ci sono alcuni problemi: se le tue attività hanno bisogno di un contesto condiviso e possono essere eseguite in parallelo, potresti avere qualche problema. La coda degli eventi non è mono-thread di solito per niente.

Potrebbe esserci un nome per questo design, tuttavia, considerando i vostri requisiti molto specifici (funzionalità, prestazioni), non credo che un solo modello di design si adatti.

L'unica cosa che vedo che assomiglia a questo è un motore del flusso di lavoro. Ho usato Activity, è un motore di flusso di lavoro leggero creato per essere in grado di elaborare facilmente migliaia di attività. Le attività hanno un contesto che è nel processo. Tuttavia non penso che questo si adatti per andare al di sotto del secondo.

Stavi parlando di MMO. Sai che hai due "orologi" diversi: uno è il famoso Frame Per Seconds che tutti conoscono, l'altro è l'orologio che gestisce la comunicazione con il gioco, ognuno di loro è indipendente. Fondamentalmente pianificano le proprie attività separatamente perché anche se sono fondamentalmente Task nei termini più astratti, i requisiti per loro sono totalmente diversi.

Avere nella stessa coda le attività che devono essere eseguite 10 volte in un secondo e altre solo una volta all'ora con tutti gli altri requisiti renderebbe la "coda" (o qualsiasi altra cosa) un oggetto dio in i miei occhi. Davvero troppo complesso e specifico per mettere un nome su di esso.

Quindi potrebbe essere necessario suddividere il problema e modificare di conseguenza la progettazione delle attività in più problemi indipendenti:

  • Attività con contesto condiviso
  • Attività con più esecuzioni entro il secondo.
  • Attività indipendenti con un intervallo lungo tra l'esecuzione.

Ognuno di loro potrebbe utilizzare la stessa interfaccia, ad esempio una facciata (o un proxy ?) per iscriversi di fatto a una coda diversa in base ai parametri forniti. Ciascuna coda riempirebbe solo il requisito per cui è stata creata per

  • uno per alte prestazioni,
  • uno per il contesto condiviso,
  • parallelismo.
  • alcuni mix: parallelismo + sola lettura condivisa-contesto?

Alla fine, faccio sì che ogni componente abbia la minore responsabilità di essere in grado di concentrarsi su ciò che è più importante per ciascuno di essi.

    
risposta data 03.05.2016 - 16:21
fonte

Leggi altre domande sui tag