Il mio team e io stiamo sviluppando un'applicazione di livello enterprise e ho progettato un'architettura che è stata descritta come un "albero delle espressioni". L'idea di base è che i nodi foglia dell'albero sono espressioni molto semplici (forse semplici valori o stringhe). I nodi più vicini al tronco diventeranno sempre più complessi, prendendo i nodi più semplici come input e restituendo risultati più complessi per i loro genitori.
Guardando dall'altra parte, l'applicazione esegue alcune attività e per questo crea un'espressione root. L'espressione radice divide il suo input in unità più piccole e crea espressioni figlio che, una volta valutata, possono essere utilizzate per creare il proprio risultato. Il processo di suddivisione continua fino ai nodi foglia più semplici.
Ci sono due aspetti molto importanti di questa architettura:
-
Deve essere possibile manipolare i nodi dell'albero dopo che è stato creato. I nodi possono ricevere nuovi valori di input con cui lavorare e qualsiasi modifica nel risultato per quel nodo deve essere propagata di nuovo sull'albero al nodo radice.
-
L'applicazione deve sfruttare al meglio i processori disponibili e, in ultima analisi, essere scalabile per altri computer in una griglia o nel cloud. I nodi dell'albero si aggiornano spesso e notificano altri nodi interessati nell'albero quando ottengono un nuovo valore.
Sfortunatamente, non sono libero di discutere la mia effettiva applicazione, ma per facilitare un po 'la comprensione, potresti immaginare una specie di applicazione per fogli elettronici implementata con un'architettura simile, in cui le modifiche alle celle nella tabella vengono propagate tutte sopra il posto ad altre cellule che hanno bisogno del risultato. Il foglio di calcolo potrebbe diventare così massiccio che l'applicazione di un sistema multi-core multi-computer distribuito per risolverlo sarebbe di beneficio.
Il mio prototipo "Expression Engine" funziona bene su un singolo PC multi-core ma ho iniziato a riscontrare alcuni problemi di concorrenza (come previsto perché finora non mi sono occupato troppo) quindi è giunto il momento di iniziare a pensare di migrare il motore a una libreria più solida e questo porta a una serie di domande correlate:
-
Esiste un precedente per la mia architettura "Expression Tree" che potrei ricercare?
-
Quali concetti di programmazione dovrei prendere in considerazione. Mi rendo conto che questo approccio ha molte somiglianze con uno stile di programmazione funzionale, e sono già consapevole dei concetti di utilizzo di futures e attori. Ce ne sono altri?
-
Ci sono lingue o librerie che dovrei studiare? Questa domanda è ispirata dalla mia scoperta accidentale di Scala e della libreria di Akka (che ha un buon supporto per gli attori, i futures, i carichi di lavoro distribuiti, ecc.) E mi chiedo se c'è qualcos'altro che dovrei guardare anche io?