2015-07-24 14 views
6

Jakiego narzędzia lub zestawu narzędzi używałbyś do skalowania poziomego scrapydu dodając nowe maszyny do klastra złomu dynamicznie i mając N instancji na maszynę, jeśli jest to wymagane. Nie jest konieczne, aby wszystkie wystąpienia współużytkowały wspólną kolejkę zadań, ale byłoby to niesamowite.Skalowanie w poziomie Scrapyd

Scrapy-cluster wydaje się obiecujący dla tego zadania, ale chcę rozwiązania opartego na Scrapyd, więc słucham innych alternatyw i sugestii.

+0

Czy znalazłeś jakieś rozwiązanie? – HamoonDBA

+0

@HamoonDBA Skryptowałem własny system równoważenia obciążenia, styl devOps dla scrapydów przy użyciu apiksu ze złomem i biorąc pod uwagę liczbę zadań za każdym razem, gdy przychodzi nowy, Dodam próbkę kodu później. – gerosalesc

Odpowiedz

1

Napisałem swój własny moduł równoważenia obciążenia dla programu Scrapyd za pomocą jego interfejsu API i 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'] 

Test Jednostka:

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) 

Kod ten skierowany jest starszą wersję scrapyd jak było napisane więcej niż rok temu.