È un problema di progettazione che sto elencando qui.
Ho diverse serie di operazioni commerciali che vengono eseguite per diverse entità aziendali.
Operazioni:
- Operazione A
- Operazione B
- Operazione C
Ad esempio, ho un'entità A. I dati dell'entità A potrebbero essere in parti, ad esempio:
- Entità A (Jan Data)
- Entità B (dati febbraio) ecc.
Per completare un caso d'uso, devono essere eseguite tutte le operazioni (A, B, C). Ora queste operazioni sono eseguite e sono indipendenti l'una dall'altra e possono essere eseguite in parallelo, l'unica condizione è che dovrebbero essere di entità diverse. Quindi l'Entità A non può avere tutte le operazioni (A, B o C) in esecuzione in parallelo. E queste operazioni sono in esecuzione sul lato server.
Come ridimensionare questo e fornire una soluzione?
Sto pensando di seguire la soluzione e vorrei avere input dalla comunità su questo.
Penso a tre code per operazioni che ho citato sopra
- Coda A che esegue l'operazione A
- coda B che esegue l'operazione B
- coda C che esegue l'operazione C
E tutti i consumatori ascolteranno queste code.
- Consumatore A (o più consumatori)
- Consumatore B (o più consumatori)
- Consumatore C (o più consumatori)
E il mio server verrebbe bilanciato dal carico e avrò una coda di messaggi singoli contenente queste tre code.
Quindi è possibile che io abbia 2 server in esecuzione e su ogni server ci siano per esempio 5 thread (consumatori) in esecuzione, quindi ci saranno 10 istanze di Consumer A in esecuzione in parallelo a prelevare i dati dalla coda messaggi A.
Come ho affermato in precedenza che per la stessa entità A (che è il caso d'uso aziendale che ho) tutte queste operazioni (Operazione A, Operazione B e Operazione C) non possono essere eseguite in parallelo, dovrebbero essere solo di loro vengono eseguiti.
Quindi quello che penso è avere una voce di database per l'Entità A e tutti i consumatori devono verificare se esiste una voce Database per l'Entità A,
-
se non poi
- Crea una voce nel database per l'entità A
- Vai ed esegui l'operazione
- Rimuovi la voce dal database per l'entità A
-
se c'è una voce nel Database trovata
- Accoda nuovamente i dati per l'entità A dalla coda in cui è stata selezionata.
C'è una soluzione migliore possibile per un simile problema di progettazione?