modo migliore per caricare i dati per milioni di utenti

-1

Sto lavorando su un'app Spring / JSF in cui ho 1 scheduler per caricare l'attività di sonno dell'utente da fitbit. In questo momento quello che faccio è che ogni volta che lo scheduler entra in azione, carico%% di% degli utenti da ALL e per ogni utente invio una richiesta a fitbit api per recuperare mongoDB attività e salvarlo in sleep uno per uno.

A partire da ora, tuttavia, funziona bene, una volta che l'utente cresce a milioni, questo programmatore potrebbe richiedere del tempo per essere eseguito. Per non parlare, sto caricando TUTTI gli utenti in una volta.

In questo momento, quello che sto cercando di fare è cercare (cercare aiuto qui se sono sulla buona strada o no)

  1. Raggruppa gli utenti in qualche modo e recupera il sonno dell'utente per gruppo. Oppure posso usare mongoDB qui.
  2. Per ciascun utente, posso generare un thread separato e lasciare che il thread finisca in modo indipendente senza eseguire il hog del programma di pianificazione che viene chiamato dal contenitore di primavera.

Sono sulla buona strada o c'è un modo migliore per farlo? Inoltre, proprio ora, sto usando solo l'attività del sonno, in futuro ci saranno più attività che devo recuperare da fitbit.

    
posta Em Ae 10.07.2016 - 03:02
fonte

2 risposte

2

Questo sarebbe un buon uso per un setup produttore / consumatore. Senza entrare nell'implementazione in dettaglio, avresti un componente il cui compito è quello di estrarre l'elenco di utenti dal DB e aggiungerli tutti a una coda. Questo potrebbe essere attivato dal tuo timer. Quindi, avresti un componente che si trova lì in un ciclo che estrae un elemento dalla coda, rendendo la richiesta API e salvando i dati. Quando devi andare più veloce, puoi aggiungere solo più istanze di quel secondo componente, in modo da avere ancora un singolo produttore (aggiungendo elementi alla coda) ma più utenti (tirando fuori dalla coda e facendo il lavoro).

In termini di implementazione c'è un sacco di modi per farlo - Java ha un sacco di supporto per cose del genere, tipicamente basate su BlockingQueue . Se fossi in me, userei Akka , ma questa è un'altra domanda:)

    
risposta data 10.07.2016 - 03:44
fonte
1

Ecco la mia opinione su questo:

L'esigenza è di scoprire l'attività dormiente degli id utente che sono memorizzati in MongoDB, che può crescere fino a 1 milione. Successivamente questo requisito può essere esteso per trascinare altre attività dell'utente.

Per creare un sistema scalabile disaccoppiato, è possibile creare 2 servizi.

Servizio 1: preleva i UserId da mongoDB o altre origini dati (se vuoi cambiarlo in qualcosa di diverso domani) e tienilo in un servizio di coda. Suggerirei di utilizzare un servizio di coda basato su cloud come SQS.

Servizio 2: Raccoglie i dati da una coda e tenta di contattare servizi di terze parti come FitBit per ottenere l'attività. Diciamo che se il servizio Fitbit è inattivo / o il servizio è diventato abbastanza popolare e se c'è un aumento negli utenti è possibile aumentare gli host che possono consumare i messaggi. È possibile utilizzare la funzione Auto-Scale di Amazon Webservices per gestire la scalabilità automatica.

Diciamo che domani vuoi recuperare più attività degli utenti da altri sistemi come Google Fit per riassumere tutte le loro attività di fitness che la stessa architettura funziona perfettamente. L'unica modifica che devi fare è utilizzare un Servizio di notifica semplice, invece di SQS che trasferisce gli ID utente in varie code SQS e ogni coda verrà utilizzata da un gestore di attività diverso per elaborare i dati e aggiornare il tuo archivio dati.

    
risposta data 11.07.2016 - 19:40
fonte

Leggi altre domande sui tag