cloudantpython库是否在执行无服务器函数之间缓存数据库?

2024-04-28 11:35:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个无服务器函数,通过python-cloudant库调用Cloudant数据库,与客户端的连接在函数处理程序之外,以便缓存它,如下所示:

httpAdapter = HTTPAdapter(pool_connections=5, pool_maxsize=100)
client = Cloudant(cloudantUsername, cloudantPassword, url=cloudantURL, adapter=httpAdapter, connect=True)

def update(event, context):
    db = client['db_name']
    document_id = event['pathParameters']['id']
    document = db[document_id]
    document['foo'] = 'bar'
    document.save()
    return json.dumps(document)

def get(event, context):
    db = client['db_name']
    document_id = event['pathParameters']['id']
    document = db[document_id]
    return json.dumps(document)

当我这样做时,任何类型的重复执行(create、update、get)都会得到很低的延迟(<;100ms),因为“connection”是重用的,这就是目的所在。(“connection”用倒逗号表示,因为cloudant/couchdb没有保持管道打开的概念)。你知道吗

但是,我注意到了一些奇怪的行为-如果我调用/update,并将文档_rev增加到2-XXXX,然后调用/get,函数返回带有_rev2-XXXX的文档。如果我再次调用/update,则_rev正确地递增为3-XXXX,但当我再次调用/get时,会得到文档修订版2-XXXX(即不是更新版本)。当这种情况发生时,update函数将在约90毫秒内执行,而get将在约10毫秒内执行(太快,无法实际调用数据库)。你知道吗

我可以通过在函数处理程序中移动Cloudant客户端的设置来消除这种行为,如下所示:

httpAdapter = HTTPAdapter(pool_connections=5, pool_maxsize=100)

def update(event, context):
    client = Cloudant(cloudantUsername, cloudantPassword, url=cloudantURL, adapter=httpAdapter, connect=True)
    db = client['db_name']
    document_id = event['pathParameters']['id']
    document = db[document_id]
    document['foo'] = 'bar'
    document.save()
    return json.dumps(document)

def get(event, context):
    client = Cloudant(cloudantUsername, cloudantPassword, url=cloudantURL, adapter=httpAdapter, connect=True)
    db = client['db_name']
    document_id = event['pathParameters']['id']
    document = db[document_id]
    return json.dumps(document)

当我这样做时,/get总是返回文档的正确版本。这种行为是出乎意料的,因为我认为将客户机设置放在处理程序之外只会在执行之间缓存客户机,但每次仍会调用数据库。看起来它们是在调用/update时生成的,而不是在调用/get时生成的。你知道吗

将客户机声明放在处理程序之外是否会以某种方式缓存数据库?如果是这样,有没有办法阻止它这样做?你知道吗

Edit:我发现可以通过显式调用document.fetch(),强制函数调用在处理程序外部声明客户端的数据库,如下所示:

def get(event, context):
    db = client['db_name']
    document_id = event['pathParameters']['id']
    document = db[document_id]
    document.fetch()
    return json.dumps(document)

Tags: 函数nameclienteventid数据库处理程序db