Questa è non (dovrebbe essere) una domanda di opinione, ma è una domanda da principianti, quindi se c'è solo una risorsa che non ho trovato che ho bisogno di leggere, indicatemi lì :)
Sono in fase di progettazione di un sistema ETL basato su microservizi. Un servizio in particolare sembra essere un candidato naturale per la programmazione funzionale over oop, ma non volevo essere una soluzione alla ricerca di un problema.
Il servizio riceverebbe un oggetto dati complesso sotto forma di GraphFragment (penso json)
[
{
"type":"node",
"label":"Product",
"properties": {}
},
{
"type":"node",
"label":"Factor",
"properties": {},
},
{
"type":"Edge",
"label":"INCLUDES_FACTOR",
"properties": {},
"from": 0, // Product
"to": 1, // Factor
},
]
Tranne molto più complesso con centinaia (forse migliaia, ma non di più) di nodi e spigoli, ognuno con molte proprietà.
Il microservizio, quindi, interroga il frammento del grafico e produce un report (anche in un oggetto simile a JSON). In quel rapporto ci sarebbero due diversi "tipi" di campi:
- Attributi (come un elenco di tutti i componenti di quel prodotto attraversando il grafico ad una profondità di n )
- Punteggi calcolati basati su una formula complessa che tiene conto della profondità di attraversamento, proprietà e pesi.
Il servizio in sé non ha la responsabilità di scrivere nulla fino alla fine, quando mette il prodotto finale su una coda kafka. Non dovrebbe richiedere nient'altro che il frammento del grafico.
Sembra una buona scelta per una pipeline con una collezione di funzioni che aggiungono ciascuna un attributo all'oggetto del report. Ogni funzione riceverebbe l'intero grafico e dovrebbe essere cieca rispetto all'output delle funzioni precedenti e future.
Alcuni altri requisiti sarebbero rapidi ed efficienti in termini di risorse. Questo processo specifico sarà usato molto più degli altri e dovrà essere il più performante possibile. Eseguire più funzioni in parallelo è interessante.
Quindi, suppongo di avere due domande:
-
Questo è un buon uso per la programmazione funzionale, forse in Kotlin o Scala (o Python), che sono i tre linguaggi più utilizzati nell'applicazione nel suo complesso.
-
Se le strutture dati sono immutabili, in che modo una funzione aggiunge un attributo al rapporto? È passato lo stato corrente del rapporto e quindi restituisce una copia del rapporto più il nuovo attributo.
Perché la memoria del suono mi spreca?
Apprezzo qualsiasi idea e sarei lieto di aggiungere chiarimenti.