python - library - scrapy ruby
Escalar horizontalmente Scrapyd (1)
Ordené mi propio equilibrador de carga para Scrapyd utilizando su API y un contenedor .
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'']
Prueba de unidad:
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)
Este código se dirige a una versión anterior de scrapyd tal como fue escrita hace más de un año.
¿Qué herramienta o conjunto de herramientas usaría para escalar horizontalmente scrapyd agregando nuevas máquinas a un clúster scrapyd dinámicamente y teniendo N instancias por máquina si es necesario? No es necesario que todas las instancias compartan una cola de trabajos común, pero sería increíble.
Scrapy-cluster parece prometedor para el trabajo, pero quiero una solución basada en Scrapyd, así que escucho otras alternativas y sugerencias.