Domanda

Abbiamo un sottile strato web (Scalatra) che traduce le richieste HTTP in arrivo in eventi (classi di casi) che vengono inviati a a legato a filo Attore di elaborazione degli eventi. Alcuni degli eventi contengono l'ID di una radice aggregata che dobbiamo mutere per vari motivi. La quantità totale di dati dell'applicazione è troppo grande per adattarsi alla memoria, quindi dobbiamo recuperare l'aggregato, con il suo ID, da un'origine dati prima di operare su di esso. Ovviamente non vogliamo che l'attore di elaborazione di eventi blchi, quindi l'idea è di generare un nuovo (basato sugli eventi?) attore che carica i dati, li muta e li memorizza nella fonte dei dati. Idealmente, vorrei gestire la concorrenza nell'applicazione invece di fare affidamento sulle capacità acide della fonte di dati. Fondamentalmente ho bisogno di accesso serializzato/transazionale a ciascun aggregato.

Questo può essere ottenuto usando gli attori? Quale sarebbe l'approccio migliore? Mantenere un ConcurrentHashMap All'interno dell'attore di elaborazione dell'evento contenente attori con la chiave dell'ID radice aggregato?

O dobbiamo coinvolgere STM: S (Scalastm/Akka) o qualcosa di simile?

È stato utile?

Soluzione

Puoi rappresentare il tuo "radice aggregata" come attore. Quando si desidera mutere la radice aggregata, puoi inviare un messaggio per farlo dall'attore di gestione della richiesta. Puoi anche avere un attore broker intermedio che inoltra i messaggi all'attore corretto e gestisce Una cache di attori di radice aggregati (per ID) istanziando un attore che rappresenta i dati su richiesta e fermandoli secondo necessità. Sarà necessario STM se è necessario coordinare una mutazione tra gli attori che rappresentano i dati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top