javascript - 如何更好地优化 Nodejs/Oracledb 环境的可用性、安全性和速度?
问题描述
环境:
- 前端是 Angular
- 后端是 NodeJs
- 云就是 AWS
- RDS 是 Oracle ○ 12.2.0.1.ru-2021-01.rur-2021-01.r1
- 我们的部署是通过使用 ECS/Fargate 中的 docker 容器的 Github 操作
- 我们的首要目标是:
- 安全
- 速度 i。我们有许多非常复杂的 PL/SQL 调用(由于数据量和调用次数,一些过程流程在 Teradata 上可能需要 20 多分钟)。我们尚未对 Oracle 进行全面测试,但我们希望能大幅缩短该时间。
我们愿意进行任何类型的 AWS 配置更改,花费更多,对前端或后端进行代码更改,以确保高可用性、安全性和顶级速度。
任何信息或建议将不胜感激。我们当前的用户流程如下。
用户流程
- 用户通过 AWS Cogito 登录应用程序。一个。Cognito 为用户 i 提供了一个令牌到前端。这将用于通过令牌身份验证进行 API 调用 b。Cognito 还向 localStorage 提供了一个 MD5 哈希值,用于确定用户的客户端 ID
- 用户浏览执行活动的站点,这些活动导致 CRUD 活动或复杂的 PL/SQL 命令
- 对于这些操作中的每一个,用户将他们的令牌以及他们的 MD5 哈希发送到后端(以及需要传递的任何其他变量)
- 对于给定的调用,后端首先将根据 Cognito 池验证令牌,然后如果成功,它将运行命令
- 如果环境使用 VPD 并且有多个客户端,那么它将基于 MD5 散列中发送的值建立连接设置(clientId、模块等)。此 MD5 散列使用 AWS Secrets Manager 标识客户端(密钥名称是 MD5 hash 和 secret 是实际客户端的名称)
示例 GET
async function simpleExecute(statement, binds = [],clientdetails = [], opts = {}) {
let conn;
opts.outFormat = oracledb.OBJECT;
try {
// Get Connection
conn = await oracledb.getConnection();
// Run Query
getresult = await conn.execute(statement, binds, opts);
} catch (err) {
console.error("Oracle Error ==>", err, "<== THIS IS WHERE THE ORACLE ERROR WILL SHOW!");
} finally {
// Finally close the connection
if (conn) {
try {
await conn.close();
console.log('Connection Closed.')
} catch (err) {
console.log('Error in close: ' + err);
} finally {
// return the result
console.log('Result Returned.');
return getresult;
}
}
}
}
module.exports.simpleExecute = simpleExecute;
示例 PL/SQL POST
async function procExecute (query, binds, clientdetails = []) {
let conn ;
// Get Connection
conn = await oracledb.getConnection();
try {
// Run the PL/SQL
const qryresult = await conn.execute(query);
// Run output SQL
postresult = await conn.execute("BEGIN DBMS_OUTPUT.GET_LINE(:ln, :st); END;"
, { ln: { dir: oracledb.BIND_OUT, type: oracledb.STRING, maxSize: 32767 },
st: { dir: oracledb.BIND_OUT, type: oracledb.NUMBER }
});
} catch (err) {
console.error("Oracle Error ==>", err, "<== THIS IS WHERE THE ORACLE ERROR WILL SHOW!");
} finally {
// Finally close the connection
if (conn) {
try {
await conn.close();
console.log('Connection Closed.')
} catch (err) {
console.log('Error in close: ' + err);
} finally {
// return the result
console.log('Result Returned.');
return postresult;
}
}
}
}
module.exports.procExecute = procExecute;
数据库设置
async function initialize() {
// Set Oracle Pool Settings
let hrPool = {
poolMin: 10,
poolMax: 10,
poolIncrement: 0
}
var secret = await getAwsSecret('MAIN');
const secretJSON = JSON.parse(secret);
hrPool.user = secretJSON[process.env.CURENV + 'username'];
hrPool.password = secretJSON[process.env.CURENV + 'password'];
hrPool.connectString = secretJSON[process.env.CURENV + 'host'] + '/' + secretJSON[process.env.CURENV + 'dbname'];
// Results Vars
var getresult;
var patchresult;
var postresult;
try {
await oracledb.createPool(hrPool);
} catch (err) {
console.log(err);
}
}
module.exports.initialize = initialize;
*请注意,某些逻辑已被删除,因为它是客户特定的并且不会影响功能。因此,如果您看到用于这些区域的 DBMS_OUTPUT 行之类的代码。
除了我们的安全和速度优先级之外,我们现在主要关心的是Oracledb 端的会话。当我自己对此进行测试并在连接设置中设置客户端 ID 时,我立即看到了 8 个会话,因为该站点快速连续地进行了许多调用。(网站上的所有内容都通过数据库填充,从表格到标题和下拉列表)。我担心这是否引起关注。我们的网站通常在每个环境中一次只供 1-4 位用户使用。
解决方案
推荐阅读
- git - 除了最后一次提交删除之前的所有提交
- c# - 使用 Excel 互操作时忽略 Excel 中设置的日期格式
- batch-file - 我们可以在不使用 for 循环的情况下仅提取字符串“04.07.2019 16:56:21”中的年份吗?
- javascript - 如何获取函数的返回错误值?(反应原生)
- java - giving child of firebase database name equal to USER ID key
- c# - 访问 HTTPContext
- javascript - 设置 mime 类型或运行本机媒体播放器
- c - glDrawElements() 大小为 4 的无效写入
- bash - 无法打印多列
- ruby-on-rails - 查找特定对象下的树结构中存在的所有对象