首页 > 解决方案 > 如何更好地优化 Nodejs/Oracledb 环境的可用性、安全性和速度?

问题描述

环境:

我们愿意进行任何类型的 AWS 配置更改,花费更多,对前端或后端进行代码更改,以确保高可用性、安全性和顶级速度。

任何信息或建议将不胜感激。我们当前的用户流程如下。

用户流程

  1. 用户通过 AWS Cogito 登录应用程序。一个。Cognito 为用户 i 提供了一个令牌到前端。这将用于通过令牌身份验证进行 API 调用 b。Cognito 还向 localStorage 提供了一个 MD5 哈希值,用于确定用户的客户端 ID
  2. 用户浏览执行活动的站点,这些活动导致 CRUD 活动或复杂的 PL/SQL 命令
  3. 对于这些操作中的每一个,用户将他们的令牌以及他们的 MD5 哈希发送到后端(以及需要传递的任何其他变量)
  4. 对于给定的调用,后端首先将根据 Cognito 池验证令牌,然后如果成功,它将运行命令
  5. 如果环境使用 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 位用户使用。

标签: javascriptnode.jsoracleamazon-web-servicesnode-oracledb

解决方案


推荐阅读