Il mio compito è elaborare delta di bilanciamento asincrono per più client e fornire importi di bilancio aggregati.
Ho un servizio REST che accetta richieste da N client C₁…Cₙ
, ognuna di esse ha il proprio valore di bilancio finanziario che cambia nel tempo. Questi client inviano gli aggiornamenti del saldo positivo / negativo al servizio REST, li accumula e li aggrega. Ad esempio, C₁ ha un saldo iniziale di 100
e invia questa sequenza: [+20, -15, +5]
, quindi il saldo risultante dovrebbe essere 110
.
La quantità di richieste è abbastanza grande e la mia soluzione attuale è la seguente. Ogni richiesta viene archiviata come record separato nella tabella DB che specifica l'ID client e un valore delta. Il pool di worker in background inserisce le somme delta per quei client che sono assegnati ad un determinato thread. Ad esempio, solo Thread₁
e nessun altro elaborerà, ad esempio, C₁, C₁₀, C₂₀ and C₃₀
. L'assegnazione viene eseguita all'inserimento di un nuovo record con valore delta.
Questo approccio ha uno svantaggio. Ad esempio, se più client (ad esempio, C₁₀, C₂₀
) che generano traffico pesante vengono assegnati sullo stesso thread di lavoro (ad esempio Thread₁
), tutti gli altri thread saranno inattivi per la maggior parte del tempo rispetto a questo Thread₁
. La riassegnazione di C₂₀
a Thread₂
renderebbe il sistema più performante, ma non è possibile in questo progetto. Richiede una riassegnazione dinamica che richiede una sorta di azione "stop-accepting-request" seguita dal ricalcolo del peso dei clienti e dalla riassegnazione. ( UPD : o calcola ogni peso del cliente in background e interrompe le richieste di accettazione almeno da quei client che dovrebbero essere riassegnati.)
Lasciando che i lavoratori elaborino record arbitrari porteranno a valori di bilancio errati poiché non è consentito che il saldo sia inferiore a zero.
Ci sono idee su come migliorare questa soluzione?