Al momento disponiamo di un sistema di vendita / acquisto che utilizza un singolo database. Abbiamo prodotti con un campo per il numero che abbiamo nell'inventario (diciamo 100 widget). Abbiamo una tabella clienti. Quando qualcuno aggiunge un widget al carrello, inseriamo un record in una tabella di join tra il cliente e il prodotto che rappresenta l'intenzione di acquistare. Tale record customer_product ha uno stato che indica che è nel carrello o che l'acquisto è stato completato ("In sospeso", "Acquistato").
Quando una richiesta cliente colpisce il sistema per aggiungere un prodotto al proprio carrello, contiamo il numero di record customer_product acquistati e in sospeso per quel prodotto e lo si disabilita se il numero è uguale al totale (100). In questo modo, ci assicuriamo che non consentiamo a 101 persone di avere 100 articoli.
Il database è il collo di bottiglia del nostro sistema e la tabella dei join viene colpita molto. Sospetto che i blocchi di riga e pagina influenzino le prestazioni sotto carico. Immagino che sistemi come Amazon / eBay debbano avere un'architettura db distribuita, e tuttavia in qualche modo gestire il problema di 2 persone che vogliono mettere l'ultimo oggetto nel loro carrello allo stesso tempo. Mi piacerebbe rearchitect il nostro negozio / carrello per alleviare il vincolo db.
Con un singolo database, possiamo fare qualcosa nella nostra clausola WHERE inserto record di join per includere un conteggio delle subquery in modo che se due transazioni di db stanno cercando di fare "l'ultimo widget" inserire contemporaneamente che qualsiasi tentativo di commit secondo fallirà perché il conteggio lo impedirà dopo che la penultima transazione prende l'ultimo widget e cambia il conteggio. Ma in un database distribuito, suppongo che quel trucco non funzionerà.
Quali principi guida o schemi generali dell'architettura di sistema si applicano quando si affrontano tali sfide di concorrenza e risorse condivise in un sistema distribuito?
Nota: sono a conoscenza di domande simili (come Best practice per gestire la concorrenza in un paniere in un sito di e-commerce ). Questa domanda riguarda specificamente come gestirlo in un'architettura distribuita dove ogni istanza di db ha una copia delle tabelle e cambia in un propogate agli altri solo ogni tanto (almeno così è come la immagino - non ho effettivamente impostato su un sistema db distribuito prima).