2015-07-24 42 views
6

Công cụ hoặc bộ công cụ nào bạn sẽ sử dụng cho quy trình thu hẹp theo chiều ngang, thêm các máy mới vào một cụm phế liệu tự động và có N phiên bản trên mỗi máy nếu cần. Không phải là cần thiết cho tất cả các trường hợp để chia sẻ một hàng đợi công việc phổ biến, nhưng đó sẽ là tuyệt vời.Cắt ngang theo chiều ngang Scrapyd

Scrapy-cluster có vẻ đầy hứa hẹn cho công việc nhưng tôi muốn có giải pháp dựa trên Scrapyd nên tôi nghe các giải pháp thay thế và đề xuất khác.

+0

Bạn có tìm thấy giải pháp nào không? – HamoonDBA

+0

@HamoonDBA Tôi viết kịch bản cân bằng tải của riêng mình, kiểu devOps cho scrapyd bằng cách sử dụng scrapyd api và tính đến số lượng công việc mỗi lần một công cụ mới đến, Sẽ thêm một mẫu mã sau đó. – gerosalesc

Trả lời

1

Tôi đã lập trình cân bằng tải của riêng mình cho Scrapyd sử dụng API của nó và 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'] 

Đơn vị kiểm tra:

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) 

Mã này nhắm đến một phiên bản cũ của scrapyd vì nó đã được viết hơn một năm trước.

Các vấn đề liên quan