我正在开发一个基本的 Flask 应用程序来接收用户的输入请求并将其插入到 MongoDB Atlas Cluster 中。
我有一个 POST 类型的路由 /save
。该端点接收请求,建立新的 mongo 连接,插入到 mongo,最后关闭连接。这种方法慢,平均响应延迟为 700-800 毫秒,即使我只尝试插入一个文档。
注意:我的用例对于使用批量插入没有意义。
示例代码
app = Flask(__name__)
app.logger.setLevel(logging.INFO)
DBNAME = 'DBNAME as String'
CONNSTRING = 'CONNECTION as String'
class mongoDB:
def __init__(self):
try:
self.client = MongoClient(CONNSTRING, maxPoolSize=None)
self.database = self.client[DBNAME]
app.logger.info('Mongo Connection Established')
except Exception as e:
app.logger.warning('Mongo Connection could not be established')
app.logger.warning('Error Message: ' + str(e))
def close_connection(self):
try:
self.client.close()
except Exception as e:
app.logger.warning('connection failed to close')
app.logger.warning('Error Message: ' + str(e))
@app.route('/save', methods=['POST'])
def save():
data_info = flask.request.get_json()
try:
db = mongoDB()
image_collection = db.database['DUMMY_COLLECTION']
image_collection.insert_one({'VALUE_ID' : data_info['value1'], 'VALUE_STRING' : data_info['value2']})
app.logger.info('Inserted Successfully')
return {'message': 'Success'}, 200, {'Content-Type': 'application/json'}
except Exception as e:
app.logger.error('Error Adding data to Mongo: ' + str(e))
return {'message': 'Error'}, 500, {'Content-Type': 'application/json'}
finally:
db.close_connection()
app.logger.info('connection closed')
if __name__ == '__main__':
app.run()
但是,如果我在应用程序初始化时建立 Mongo 连接并保持打开状态并且从不关闭连接,则延迟会降至 70-80 毫秒。
有人可以帮助理解保持开放连接而不是为每个请求建立新连接的后果吗?或者有什么方法可以减少打开多个连接时的延迟?
注意-:保持多个连接方法,我尝试使用 writeConcern=0、maxPoolSize=None 和 Journal=False,但所有这些都根本没有改善延迟。
如有任何帮助,我们将不胜感激。谢谢
最佳答案
MongoClient(CONNSTRING, maxPoolSize=None)
不仅仅是一个连接,而是一个连接池。这意味着,有了该对象,您就可以向 MongoDB 发出多个并发请求。通过设置 maxPoolSize=None ,您可以使它们不受限制(这在重负载下可能会产生一些影响)。
为每个请求创建一个连接池是一种反模式(正如您通过高延迟意识到的那样),其原因是您需要每次支付创建连接池和与数据库握手的成本。
最好的方法是在启动时启动一个,然后维护它。这意味着您应该处理数据库或网络故障时可能出现的所有异常。但是,我认为大多数事情已经由 MongoClient
处理了。
关于python - PyMongo Flask 应用程序缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72874989/