Come gestire molti utenti di dispositivi mobili sul lato server?

2

Ho creato un'applicazione sociale per Android in cui gli utenti possono vedere gli altri utenti intorno a loro tramite la posizione GPS. All'inizio la cosa è andata bene perché avevo un basso numero di utenti, ma ora che ho un numero crescente di utenti (circa 1500 +100 ogni giorno) ha rivelato un problema importante nella mia progettazione.

Nel servlet di Google App Engine ho HashMap statico che contiene tutti gli oggetti profili utente, attualmente 1500 e questo numero aumenterà con la registrazione di più utenti.

Perché lo sto facendo?

Ogni utente che richiede agli utenti che lo circondano mette a confronto il suo GPS con altri utenti e controlla se si trovano nel raggio di 10 km. Questo accade ogni cinque minuti in media. Di conseguenza, non riesco a ottenere gli utenti da db ogni volta perché la quota di operazioni di lettura / scrittura GAE mi farà a pezzi.

Il problema con questo design è?

Man mano che il numero di utenti aumenta, Hashmap diventa null ogni 4-6 ore, penso che questa volta si accorci, ma non ne sono sicuro. Lo aggiusto ricaricando gli utenti dal db ogni volta che rilevo che diventa nullo, ma questo causa DOS ai miei utenti per 30 secondi, quindi sto cercando una soluzione migliore.
Immagino che ciò accada perché la dimensione dell'hashmap. Ho ragione?

Mi è stato consigliato di utilizzare un database spaziale, ma ciò significa che non posso più lavorare con GAE e ciò significa che ho bisogno di ricostruire il mio grande server tutto da capo e perdere il mio DB esistente.

C'è qualcosa che posso fare con gli strumenti esistenti?

Grazie.

    
posta Rami 30.09.2012 - 15:56
fonte

1 risposta

1

Ci sono un paio di cose che potrei suggerire, senza sapere molto di più sulle specificità della tua situazione. In molti modi, il problema indicato è analogo a un problema di rilevamento collisione comune.

  1. Riduci la risoluzione. In un certo senso, hai già adottato misure per ridurre la risoluzione limitando il tasso di aggiornamento (a cinque minuti). Un secondo modo sarebbe utilizzare un concetto di "bounding box" su un punto specifico per identificare la vicinanza o gli utenti vicini all'interno di un'area. Nel tuo caso, a ciascun utente verrebbe assegnato un rettangolo circostante. Se i rettangoli di due utenti si incontrano o intersecano, sono abbastanza vicini da renderizzare / visualizzare nello stesso punto e semplicemente annotare ciascun marker con più coordinate esatte.

  2. La struttura dei dati che stai utilizzando potrebbe essere ok, ma potrebbe essere necessario un tuning. È difficile dirlo senza vedere un certo grado di implementazione. Una possibile alternativa che generalmente funziona bene con il concetto di bounding box è un quadruplo; specialmente uno che considera e gestisce il movimento periodico degli oggetti contenuti.

  3. Strategia di memorizzazione nella cache. Se non stai partizionando la tua cache in aree o quad di livello superiore, potresti volerlo prendere in considerazione. In questo modo, quando gli aggiornamenti si verificano all'intervallo impostato, è sufficiente aggiornare la cache per le aree parziali / selezionate in cui a) si hanno utenti e b) gli utenti si sono spostati.

risposta data 24.10.2012 - 21:33
fonte

Leggi altre domande sui tag