Sto lavorando su un problema in cui una chiamata per ridurre un contatore arriverà a un servizio e se il contatore è maggiore a zero allora la chiamata dovrebbe essere in grado di ridurlo altrimenti fallire.
Piuttosto semplice? eh!
Per una richiesta ottieni il valore del contatore, riduci e rimetti
Bene diventa interessante con i vincoli di seguito:
- La richiesta è sandbox: così la richiesta può arrivare a qualsiasi host, ogni richiesta crea un nuovo thread e muore dopo aver restituito la risposta. (Quindi nessun aggiornamento di batch possibile out of the box, in altre parole non è possibile aggiornare il contatore con -10 per conto di 10 richieste se ogni richiesta voleva fare -1)
- Massimizza la percentuale di successo delle richieste parallele per lo stesso aggiornamento contatore
- Riduci l'impatto sulla latenza dovuto alla soluzione (< 700ms)
- Il contatore è archiviato in un archivio dati (diciamo che DynamoDB potrebbe non essere l'archivio dati giusto per accedere alla stessa chiave con una frequenza elevata in quanto provoca una partizione calda e aumentare il throughput solo per supportare questo strano modello di chiamata non è accettabile)
Qual è il problema esattamente, chiedi?
-
L'accesso allo stesso record molte volte tende a creare uno scenario di partizionamento a caldo in cui la maggior parte dei sottostanti data store inizia a rallentare quando il tipo di richiesta / modello di accesso sembra un tipo di attacco. (non suggerire di mantenere un throughput elevato per supportare il pattern, non è accettabile!)
-
Elaborazione diretta di una richiesta utilizzata per funzionare quando non vi è alcuna contesa o per non dire che molte richieste parallele aggiornano lo stesso contatore. Ora la maggior parte delle richieste (99%) non riusciranno a causa di casi di errore di blocco / condizionali e i tentativi richiederanno molto tempo a tutti loro per avere successo. (Sto bene alcune richieste falliscono ~ 10%)
Informazioni sui guasti: "errore dovuto al contatore che raggiunge 0" non è riprovabile mentre "errore dovuto a blocco / casi di errore condizionale" è riprovabile.
L'obiettivo è massimizzare il più possibile il tasso di successo della richiesta parallela.
Nota a margine:
Non sono limitato o limitato con particolare modello di dati o negozio. Ciò significa che puoi elaborare qualsiasi modello di dati che ti aiuti a risolvere il problema in modo efficiente e a scegliere qualsiasi archivio dati che ritieni sia giusto per tale caso d'uso.
Ho una soluzione abbastanza buona (usando casualità) di cui posso parlare in seguito. (Non metterlo in primo piano per mantenere il problema aperto e interessante da risolvere piuttosto che discutere una singola soluzione)
Volevo raccogliere pensieri qui, come ti avvicinerai!