我使用 Google App Engine blobstore 来保存大量用户数据——大小从几百字节到几百 KB 不等。blob_info 保存为数据存储实体的属性。
有时,在生产环境中,从 blobstore 读取会失败并出现 BlobNotFoundError('',)。该异常没有提供任何细节,我无法弄清楚为什么会发生故障。
根据谷歌的文档:
“如果 blob 不引用实际的 Blobstore 值,则 fetch_data 会引发 BlobNotFoundError。” https://developers.google.com/appengine/docs/python/blobstore/functions#fetch_data
“fetch_data() 函数找不到与给定 BlobInfo 或 BlobKey 值对应的 Blobstore 值。” https://developers.google.com/appengine/docs/python/blobstore/exceptions#BlobNotFoundError
最令人费解的是,故障是间歇性的。
下面是我用于读取/写入 blobstore 的代码。仅当 blob_info(从数据存储区读取)不是 None 时才会尝试读取。
有什么建议么?
def read(blob_info):
blob_reader = blobstore.BlobReader(blob_info.key(), buffer_size=358400)
try:
data = blob_reader.read()
finally:
blob_reader.close()
return data
def write(data, mime_type):
file_name = files.blobstore.create(mime_type=mime_type)
with files.open(file_name, 'a') as f:
f.write(data)
files.finalize(file_name)
blob_key = files.blobstore.get_blob_key(file_name)
# This is a hack to handle an apparent GAE delay synchronizing the blobstore
for i in range(1,3):
if blob_key:
break
else:
time.sleep(0.05)
blob_key = files.blobstore.get_blob_key(file_name)
new_blob_info = blobstore.BlobInfo.get(str(blob_key))
return new_blob_info