Otteniamo chiamate simultanee alla nostra applicazione Web da un fornitore e sospettiamo che ci stia causando aggiornamenti persi perché vengono elaborati nello stesso momento su macchine diverse.Come posso elaborare la maggior parte dei lavori in parallelo ma serializzare un sottoinsieme?
Abbiamo bisogno di serializzare l'elaborazione di quelle chiamate se e solo se interessano lo stesso record utente.
Un mio collega ha proposto un flusso AWS Kinesis in cui utilizziamo l'ID utente come chiave di partizione. L'idea è che la stessa chiave di partizione collochi il record nello stesso frammento. Ogni frammento viene elaborato da un solo operatore e non ci saranno problemi di concorrenza. In base alla progettazione, sarà garantito che i record appartenenti allo stesso utente non vengano elaborati in parallelo. Questa soluzione ridimensiona e risolve il problema, ma ci restituirà almeno uno sprint.
Stiamo cercando una soluzione che possiamo implementare più rapidamente.
Altre soluzioni che abbiamo discusso finora:
- che ritardare l'elaborazione dei callback, potenzialmente da un periodo di tempo casuale. In questo scenario, è ancora possibile (anche se meno probabile) che diversi lavoratori lavorino allo stesso utente nello stesso momento.
- Qualsiasi sistema di accodamento ha il difetto di essere limitato a un solo operatore o al rischio di elaborazione parallela o uguale a quanto indicato in (1).
Siamo su uno stack Rails con MySQL e preferiamo AWS per le nostre soluzioni.
Esiste una soluzione a questo problema che consentirà di ottenere risultati più rapidi rispetto al passaggio a Kinesis?