Cosa ho
Questo è un prototipo . Ho un pool di 100 client collegati al server tramite websocket che segnalano cose e in attesa di comandi. Il server esegue il polling della tabella di database commands
di tipo MEMORY
in un ciclo utilizzando una query con WHERE client_id=?
. Posso inserire una combinazione di client_id
+ command
in quella tabella e, una volta fatto, il ciclo corrispondente corrisponderà e SELECT
esso e lo riporterà al client.
Qual è il problema
L'approccio sembra funzionare, ma per quanto ho capito sto parlando di n
di connessioni e query di database simultanee in un ciclo infinito ( n
è il numero di client), che non suona efficace. Sarebbe molto meglio fare una query in un ciclo e poi controllare in qualche modo il client_id
, se esiste, e distribuire i risultati ai client corrispondenti.
Questo mi ricorda l'approccio in cui stai selezionando gli articoli per primo e poi for () {}
il set di risultati e fai query separate per ottenere i dettagli su ciascun elemento, il che si traduce in n+1
di query eseguite. La soluzione è una grande query con JOIN
s e anche il preloading degli altri dati che non rientrano nella query JOIN
ed principale. Ci dovrebbe essere anche il modo più efficace di eseguire il polling del database.
UPDATE : ho trovato questa risposta nella relativa sezione, e dice più o meno la stessa cosa:
Hammering your database isn't really a good idea. While I'm pretty sure you've realized this, others might not have. I remember a friend of mine tried to use a php script and a Javascript AJAX function in a loop for a semi-real time game. He very quickly realized that performance degraded as more people joined, simply because he was executing a ton of queries per second which hammered the database.
Quindi il polling del database per ogni client sembra non scalabile e inefficace quanto la creazione di un'applicazione di chat AJAX.
Quello che sto chiedendo
Immagino che ogni possibile approccio di programmazione debba essere stato nominato e coperto ora, quindi come si chiama questo? Qual è il consiglio / approccio comune qui?