Come ridimensiono un bot / servizio?

8

Ho questo bot che ho creato per Twitter. È scritto in Python. Vive sul mio Raspberry Pi e ho impostato un cronjob per eseguirlo ogni 60 secondi.

La parte 2 del progetto consiste nella creazione di un'app Web che possa essere utilizzata per configurare il bot, anziché utilizzare direttamente il codice.

Nella Parte 3, voglio estendere l'app web con l'autenticazione a 3 zampe di Twitter per consentire ad altre persone di utilizzare il servizio con i loro account Twitter e configurarlo a loro piacimento.

Il bot impiega qualche secondo per completare la sua esecuzione. Quindi, se decido di usare uno script con un mega loop che scorre linearmente attraverso ogni utente, ci vorrà un po 'per finire. Non sarebbe un problema se il tempo non fosse un problema, ma lo è. Il bot scansiona le fonti e inoltra a Twitter tutto ciò che è nuovo da quando è stato eseguito l'ultima volta (60 secondi fa).

Sembra che con questi vincoli ho bisogno di essere in grado di eseguire questo servizio in parallelo per ciascun utente o qualche x numero di utenti, ma non conosco un modo rapido ed efficiente per farlo.

  • Non penso che abbia molto senso creare un nuovo script con le proprie credenziali e impostazioni di configurazione, e aggiornarli quando richiesto, per ogni utente e configurare un cronjob per lo script di ciascun utente.
  • Non penso di poter utilizzare uno script per scorrere linearmente ogni utente, perché ogni esecuzione richiede alcuni secondi per essere completata, quindi il tempo totale aumenterebbe con ogni nuovo utente.

Mi chiedo se ci siano servizi, framework, API o altri stili di architettura che potrebbero funzionare per ridimensionarlo. Cosa dovrei fare?

    
posta Dylan House 19.05.2016 - 05:22
fonte

5 risposte

2

Spostare i parametri di configurazione in un database back-end e creare l'interfaccia utente Web per modificare le impostazioni che lo script legge in ogni iterazione (nel caso in cui i parametri siano stati modificati)

Per la parte 3, inizia a guardare l'API di Twitter e i vari wrapper Python che sono là fuori.

Per migliorare la frequenza di esecuzione dello script per ciascun account, esaminare il multi-threading e il pooling di thread con python e inserire il lavoro di polling e aggiornare ciascun account in un thread separato. Il lavoro è principalmente legato all'IO, quindi non esitare a creare più thread di quanti siano i core del processore.

Esamina i vari wrapper di servizio che potrebbero essere disponibili e che puoi sfruttare. Sono sicuro che ce ne sono alcuni. Un processo di wrapper di servizi è quello di avvolgere il codice con alcune funzionalità di monitoraggio e al minimo rilevare quando il codice si è arrestato in modo anomalo o non risponde e riavviarlo.

Potresti prendere in considerazione l'acquisizione del database back-end ogni volta che ciascun account viene aggiornato, in modo che gli utenti possano sapere quando i loro dati sono stati interrogati l'ultima volta. Non sarebbe una cattiva idea dare la possibilità di attivare un aggiornamento dalla pagina dell'interfaccia utente web.

    
risposta data 19.06.2016 - 15:29
fonte
1

Prima metti il lavoro cron. Convertire il programma in modo che abbia un lungo ciclo di esecuzione. Non hai bisogno di 60 e-mail all'ora per dirti che è rotto.

Per ridimensionare, calcola un hash stabile del nome utente (o di qualsiasi altro attributo stabile) dell'utente. Decidi quante copie del bot eseguire (puoi cambiare idea su quante). Chiameremo questo numero N.

Prendi il valore hash modulo N - questo ti dice quale istanza ("shard") del bot dovrebbe trattare con quell'utente.

    
risposta data 19.05.2016 - 08:42
fonte
0

perché è necessario eseguire in Raspberry Pi invece del server corretto? Penso che le capacità di elaborazione parallela siano piuttosto limitate. Comunque, ecco la mia idea, non so se funziona in Raspberry Pi.

Primo passo, parametrizza lo script python in modo che un argomento della riga di comando specifichi quale utente debba essere eseguito. Secondo, fai in modo che l'app Web manipoli le voci di cron, quindi ogni nuovo utente indica una nuova voce di cron, con l'ID utente specificato nella riga di comando.

    
risposta data 12.06.2016 - 05:12
fonte
0

Puoi consultare il servizio AWS Lambda combinato con il gateway API di AWS. Esegue l'esecuzione bilanciata del carico del codice in base a vari eventi come la modifica del database o la richiesta HTTP in entrata.

    
risposta data 18.08.2016 - 16:54
fonte
0

In primo luogo, prova ad eseguirlo su un VPS o qualcosa del genere e guarda come funziona. Il Raspberry Pi potrebbe essere fantastico, ma non è potente.

In secondo luogo, modifica lo script Python per utilizzare i parametri per eseguire l'autenticazione e quindi aggiornare i lavori di cron per utilizzare i nuovi parametri.

In terzo luogo, o aggiungi più lavori di cron e li fai girare tutti come istanze di Python, è orribile, ma la maggior parte della latenza è probabilmente da qualunque servizio tu stia cercando informazioni.

Il modo migliore per farlo sarebbe capire quanti utenti uno script Python può gestire al minuto, e usare un numero leggermente inferiore a quello per essere il limite per l'istanza Python, e crea istanze dello script Python (da un altro script del controllore) in base al numero di utenti che devono essere controllati. In questo modo, se il numero è di 15 utenti al minuto e si hanno 18 utenti, verrà creato un altro "demone" Python o gestore per gestire gli altri utenti. È necessario assicurarsi che lo stile "daemon" possa comunicare con tutti gli altri e che il controller assegni a quali utenti ciascun demone è responsabile per / etc.

    
risposta data 02.10.2016 - 13:35
fonte

Leggi altre domande sui tag