Elaborazione del feed web più volte al giorno
-
23-08-2019 - |
Domanda
Ok, ecco in breve l'accordo:Esamino il web (tutti i tipi di dati, blog/notizie/forum) così come appare su Internet.Quindi elaboro questo feed ed eseguo analisi sui dati elaborati.Il ragno non è un grosso problema.Posso ottenerlo praticamente in tempo reale man mano che Internet riceve nuovi dati.L'elaborazione è un collo di bottiglia, coinvolge alcuni algoritmi computazionalmente pesanti.
Sto cercando di costruire una strategia per programmare i miei spider.L'obiettivo principale è garantire che l'analisi prodotta come risultato finale rifletta l'effetto del maggior numero possibile di input recenti.Cominciate a pensarci, l’obiettivo ovvio è quello di garantire che i dati non si accumulino.Ottengo i dati tramite gli spider, passo al codice di elaborazione, aspetto che l'elaborazione finisca e poi faccio altri spider.Questa volta portando tutti i dati che sono apparsi mentre aspettavo che l'elaborazione finisse.Ok, questo è un pensiero molto ampio.
Qualcuno di voi può condividere i propri pensieri, magari pensare ad alta voce.Se fossi in me cosa ti passerebbe per la mente?Spero di aver dato un senso alla mia domanda.A proposito, questa non è l'indicizzazione di un motore di ricerca.
Soluzione
Sembra che vuoi evitare che i processori rimangano troppo indietro rispetto agli spider.Immagino che tu voglia essere in grado di ridimensionare anche questo.
Il mio consiglio è di implementare una coda utilizzando un database SQL client/server.MySQL funzionerebbe bene per questo scopo.
Obiettivi di progettazione
- Evita che gli spider si allontanino troppo dai processori
- Consentire un equilibrio di potere tra spider e processori (tenendoli occupati)
- Mantieni i dati il più aggiornati possibile
- Scalare e aumentare secondo necessità
Coda:Crea una coda per archiviare i dati degli spider prima che vengano elaborati.Questo potrebbe essere fatto in diversi modi, ma non sembra che l'IO sia il collo di bottiglia.
Un approccio semplice sarebbe quello di avere una tabella SQL con questo layout:
TABLE Queue
Queue_ID int unsigned not null auto_increment primary key
CreateDate datetime not null
Status enum ('New', 'Processing')
Data blob not null
# pseudo code
function get_from_queue()
# in SQL
START TRANSACTION;
SELECT Queue_ID, Data FROM Queue WHERE Status = 'New' LIMIT 1 FOR UPDATE;
UPDATE Queue SET Status = 'Processing' WHERE Queue_ID = (from above)
COMMIT
# end sql
return Data# or false in the case of no records found
# pseudo code
function count_from_queue()
# in SQL
SELECT COUNT(*) FROM Queue WHERE Status = 'New'
# end sql
return (the count)
Ragno:
Quindi hai più processi spider..Ognuno di loro dice:
if count_from_queue() < 10:
# do the spider thing
# save it in the queue
else:
# sleep awhile
repeat
In questo modo ogni ragno sarà l'uno o l'altro riposando O ragno.La decisione (in questo caso) si basa sul fatto che ci siano meno di 10 elementi in sospeso da elaborare.Lo adatteresti ai tuoi scopi.
Processore
Quindi hai più processi del processore..Ognuno di loro dice:
Data = get_from_queue()
if Data:
# process it
# remove it from the queue
else:
# sleep awhile
repeat
In questo modo, ogni processore sarà l'uno o l'altro riposando O in lavorazione.
In sintesi: Sia che tu lo abbia in esecuzione su un computer o su 20, una coda fornirà il controllo necessario per garantire che tutte le parti siano sincronizzate e non siano troppo avanti l'una rispetto all'altra.