Google appengine: Desempenho da fila de tarefas
Atualmente, tenho um aplicativo em execução no appengine e estou executando alguns trabalhos usando a biblioteca adiada, algumas dessas tarefas são executadas diariamente, enquanto outras são executadas uma vez por mês. A maioria dessas tarefas consulta o armazenamento de dados para recuperar documentos e, em seguida, armazena as entidades em um índice (API de pesquisa). Algumas dessas tabelas são substituídas mensalmente e eu tenho que executar essas tarefas em todas as entidades (4 ~ 5M).
Um exemplo dessa tarefa é:
def addCompaniesToIndex(cursor=None, n_entities=0, mindate=None):
#get index
BATCH_SIZE = 200
cps, next_cursor, more = Company.query().\
fetch_page(BATCH_SIZE,
start_cursor=cursor)
doc_list = []
for i in range(0, len(cps)):
cp = cps[i]
#create a Index Document using the Datastore entity
#this document has only about 5 text fields and one date field
cp_doc = getCompanyDocument(cp)
doc_list.append(cp_doc)
index = search.Index(name='Company')
index.put(doc_list)
n_entities += len(doc_list)
if more:
logging.debug('Company: %d added to index', n_entities)
#to_put[:] = []
, doc_list[:] = []
deferred.defer(addCompaniesToIndex,
cursor=next_cursor,
n_entities=n_entities,
mindate=mindate)
else:
logging.debug('Finished Company index creation (%d processed)', n_entities)
Quando executo apenas uma tarefa, a execução leva cerca de 4-5s por tarefa adiada, portanto, a indexação das minhas entidades de 5 milhões de pessoas leva cerca de 35 horas.
Outra coisa é que, quando executo uma atualização em outro índice (por exemplo, uma das atualizações diárias) usando uma tarefa adiada diferente na mesma fila, ambas são executadas muito mais lentamente. E comece a demorar cerca de 10 a 15 segundos por chamada adiada, o que é insuportável.
Minha pergunta é: existe uma maneira de fazer isso mais rapidamente e escalar a fila de envio para mais de um trabalho em execução a cada vez? Ou devo usar uma abordagem diferente para esse problema?
Desde já, obrigado,