2015-07-24 18 views
6

Quale strumento o insieme di strumenti si utilizzeranno per ridimensionare orizzontalmente scrapyd aggiungendo nuove macchine a un cluster di scrapyd in modo dinamico e disponendo di N istanze per macchina se necessario. Non è necessario che tutte le istanze condividano una coda di lavoro comune, ma sarebbe fantastico.Ridimensionamento orizzontale Scrapyd

Scrapy-cluster sembra promettente per il lavoro ma voglio una soluzione basata su Scrapyd quindi ascolto altre alternative e suggerimenti.

+0

Trova qualche soluzione? – HamoonDBA

+0

@HamoonDBA Ho programmato il mio bilanciamento del carico, lo stile devOps per scrapyd utilizzando scrapyd api e tenendo conto del numero di lavori ogni volta che ne arriva uno nuovo, aggiungerò un esempio di codice in seguito. – gerosalesc

risposta

1

Ho programmato il mio bilanciamento del carico per Scrapyd utilizzando la sua API e un wrapper.

from random import shuffle 
from scrapyd_api.wrapper import ScrapydAPI 

class JobLoadBalancer(object): 

    @classmethod 
    def get_less_occupied(
      cls, 
      servers_urls=settings.SERVERS_URLS, 
      project=settings.DEFAULT_PROJECT, 
      acceptable=settings.ACCEPTABLE_PENDING): 

     free_runner = {'num_jobs': 9999, 'client': None} 
     # shuffle servers optimization 
     shuffle(servers_urls) 
     for url in servers_urls: 
      scrapyd = ScrapydAPI(target=url) 
      jobs = scrapyd.list_jobs(project) 
      num_jobs = len(jobs['pending']) 

      if free_runner['num_jobs'] > num_jobs: 
       free_runner['num_jobs'] = num_jobs 
       free_runner['client'] = scrapyd 
      # Optimization: if found acceptable pending operations in one server stop looking for another one 
      if free_runner['client'] and free_runner['num_jobs'] <= acceptable: 
       break 

     return free_runner['client'] 

prova Unità:

def setUp(self): 
     super(TestFactory, self).setUp() 
     # Make sure this servers are running 
     settings.SERVERS_URLS = [ 
      'http://localhost:6800', 
      'http://localhost:6900' 
     ] 
     self.project = 'dummy' 
     self.spider = 'dummy_spider' 
     self.acceptable = 0 

    def test_get_less_occupied(self): 
     # add new dummy jobs to first server so that choose the second one 
     scrapyd = ScrapydAPI(target=settings.SERVERS_URLS[0]) 
     scrapyd.schedule(project=self.project, spider=self.spider) 
     scrapyd.schedule(project=self.project, spider=self.spider) 
     second_server_url = settings.SERVERS_URLS[1] 
     scrapyd = JobLoadBalancer.get_less_occupied(
      servers_urls=settings.SERVERS_URLS, 
      project=self.project, 
      acceptable=self.acceptable) 
     self.assertEqual(scrapyd.target, second_server_url) 

Questo codice si rivolge a una versione precedente di scrapyd come è stato scritto più di un anno fa.