Volevo fare questa domanda che mi ha infastidito per molto tempo. Recentemente, ho iniziato a sviluppare un sistema distribuito che ha ricerche di database continue e frequenti in un ciclo. Lascia che te lo descriva.
Ci sono voci in una coda, che possono essere accoppiate tra loro. Ad esempio, supponiamo di avere una coda come:
A B C D E F
Con certe regole, queste possono essere abbinate come, A-B, C-E, D-F. Chi corrisponde a chi e perché è irrilevante per questa domanda, penso. Una cosa importante è che può esserci una sola corrispondenza per un elemento, e quindi deve lasciare la coda.
È necessario un programma per lavorare continuamente su questa coda (o elencare, se ignoriamo la sequenza) per trovare le corrispondenze, e ridurre la coda il più velocemente possibile.
Supponendo che il numero di elementi in questa coda possa essere molto grande, penso che ci dovrebbero essere più programmi che lavorano su questa coda. Quindi una cosa che ho pensato è stata la creazione di più nodi che eseguono questo programma, che sono chiamati "Matchers".
Il problema è che se matcher1 corrisponde ad A-B in un determinato momento e Matcher2 corrisponde a B-C, abbiamo una race condition per B. Data la natura distribuita dei matcher, la sincronizzazione può essere su un database che fornisce la garanzia di coerenza. Come quando viene abbinato, potrebbe essere marcato sul database che mantiene la coda. Tuttavia non sembra esserci un modo affidabile per essere sicuri che altri concorrenti abbiano la relazione prima-accade con questa operazione, quindi nessuna garanzia che il cambiamento venga osservato. Soprattutto se il database utilizzato è sharded o distribuito, quindi è necessario un po 'di tempo per la propagazione. Quindi non sono sicuro di quanto bene funzionerebbe.
Un'altra soluzione che ho trovato è stata quella di assegnare determinati gruppi nella coda esclusivamente a un solo matcher. Ad esempio,
Matcher1 ha A B C D Matcher2 ha E F G H
Ora matcher1 abbina solo A-B-C-D tra loro e matcher2 E-F-G-H. Quindi, è possibile mantenere i Matcher con un solo thread, quindi non si verifica alcuna condizione di competizione. Oppure potremmo usare un sistema mutex locale per bloccare il riconoscimento di una corrispondenza, per vedere se ci fosse un'altra corrispondenza in quel momento, quindi in questo modo possiamo anche usare il multithreading nei nodi, pur essendo al sicuro con le condizioni di gara.
Sono consapevole, quello che ho scritto potrebbe mancare di coerenza, ma ciò riflette esattamente come è nella mia mente. Sono abbastanza abile con il multithreading e il parallelismo, tuttavia non ho mai visto un vero sistema high-end in tempo reale, con problemi di race condition implementati, quindi mi manca il dipartimento dell'esperienza.
Volevo ottenere un feedback sulle mie idee e forse ricevere alcune idee migliori da voi ragazzi. Per favore, indirizzami per risolvere la mia domanda, nel caso in cui manchi severamente.
EDIT : questa domanda ha molto poco a che fare con i metodi per sincronizzare un programma in esecuzione su una singola macchina. Lo stesso programma è in esecuzione su più nodi in un cluster e devono essere sincronizzati.