我目前有一个应用程序在appengine上运行,我使用延迟库执行一些作业,其中一些任务每天运行一次,而其中一些任务每月执行一次。这些任务中的大多数都会查询Datastore以检索文档,然后将实体存储在索引(Search API)中。其中一些表格每月更换一次,我必须在所有实体(4〜5M)上运行这些任务。这样的任务的Google appengine:任务队列性能
一为例是:
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)
当我只运行一个任务,执行需要大约每推迟任务4-5s,所以索引我5M实体将需要大约35小时。
另一件事是,当我运行的另一指标的更新(例如,每天更新一)使用在同一个队列不同的递延任务,都被执行速度慢了很多。并开始每个延迟的呼叫约10-15秒,这是无法忍受的。
我的问题是:有没有办法更快地做到这一点,缩放推队列每次运行一个以上的工作吗?或者我应该使用不同的方法解决这个问题?
由于提前,
嗨丹,我申请你的想法,我的代码,但我的印象中,从数据存储读取实际上是很多比插入索引这些实体,因此,我期待的吞吐量增益不是很大比较贵,我想尽量减少读取操作的大小可能会有帮助,会做更多的测试并回复给您。 – Clds
在这种情况下,最好是使用keys_only查询,然后在排队完成下一个任务之后,为页面组装键列表并为其执行批量读取以获取文档并更新索引。 –
顺便说一句 - 您实际上可以检查您对数据存储区读取成本的怀疑:在开发控制台中检查应用程序的日志 - 某些日志条目在请求持续时间列中有蓝色链接 - 单击链接,然后单击“查看跟踪”在弹出菜单中,您将看到StackDriver中的appstats-like跟踪,以便您更好地了解该特定请求花费的时间。 –