我有一个应用程序,通过Firebase Cloud Functions,连接到一个MySQL云数据库。
我正在使用的SQL CLOUD机器是免费的和最低级别的一个。(db-f1-micro,共享内核,1vCPU, 0.614 GB)
我在下面报告一个简单查询的使用架构。
我有一个名为"database.js"它将我的连接(池)导出到数据库。
const mysqlPromise = require('promise-mysql');
const cf = require('./config');
const connectionOptions = {
connectionLimit: cf.config.connection_limit, // 250
host: cf.config.app_host,
port: cf.config.app_port,
user: cf.config.app_user,
password: cf.config.app_password,
database: cf.config.app_database,
socketPath: cf.config.app_socket_path
};
if(!connectionOptions.host && !connectionOptions.port){
delete connectionOptions.host;
delete connectionOptions.port;
}
const connection = mysqlPromise.createPool(connectionOptions)
exports.connection = connection
下面是我如何使用连接在一个"可调用的云函数"中执行查询
请注意,表很轻(不超过2K条记录)
// import connection
const db = require("../Config/database");
// define callable function
exports.getProdottiNegozio = functions
.region("europe-west1")
.https.onCall(async (data, context) => {
const { id } = data;
try {
const pool = await db.connection;
const prodotti = await pool.query(`SELECT * FROM products WHERE shop_id=? ORDER BY name`, [id]);
return prodotti;
} catch (error) {
throw new functions.https.HttpsError("failed-precondition", error);
}
});
在执行查询并返回预期结果的意义上,一切工作正常,但是存在性能问题。
查询执行有时非常慢。(最多10秒!!).
我注意到有些时候他们在早上相当快(大约1秒),但有时他们很慢,使我的应用程序非常慢。
检查GCP控制台内的日志,我注意到出现了此消息。
severity: "INFO"
textPayload: "2021-07-30T07:44:04.743495Z 119622 [Note] Aborted connection 119622 to db: 'XXX' user: 'YYY' host: 'cloudsqlproxy~XXX.XXX.XXX.XXX' (Got an error reading communication packets)"
在这一切的最后,我希望一些帮助来理解如何提高应用程序的性能。
这只是一个SQL CLOUD机器的问题吗?增加资源以获得良好的查询执行是否足够?或者我对代码的体系结构以及我如何组织函数和对数据库的调用是错误的?
提前感谢大家:)
不要使用自动扩展解决方案直接连接到数据库:
- 你不应该使用自动伸缩web服务(Firebase Functions)直接连接到数据库。假设您有400个请求,这意味着如果每个函数在启动时尝试连接,则打开了400个连接到数据库。您的数据库将开始拒绝(或排队)新的连接。理想情况下,您应该托管一个永久在线的服务,并让Firebase Function告诉该服务在现有连接中查询什么。
Firebase函数需要它的甜蜜时间来启动:
- Firebase Functions对于每个调用的函数需要100~300ms的启动时间(冷启动)。所以把它加到你的等待时间里。更重要的是,如果你的函数在响应之前依赖于与其他东西的连接。
函数寿命短:
- 你也应该知道Firebase函数不存在很长时间。它们应该是单任务微服务。如果我没记错的话,它们的寿命是90秒。确保你的查询时间不会超过这个
针对您的问题:
-
如果你的数据库在白天变慢,可能是因为使用量增加了。
-
您正在使用共享核心,这意味着您与该区域/区域中其他较低层数据库共享最低层的资源。您可能需要增加资源,例如移动到专用核心,或优化查询。我建议提高你的CPU。对于小型CPU选项,成本非常低