真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

如何進(jìn)行云函數(shù)SCFNode.jsRuntime實(shí)踐

如何進(jìn)行云函數(shù)SCF Node.js Runtime實(shí)踐,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

饒平網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

騰訊云云函數(shù) SCF 最近新發(fā)布了 Node.js 12.16 的 runtime,也是國(guó)內(nèi)首家支持 Node.js 12.x 的主流云服務(wù)商。

Node.js 版本的升級(jí)帶來(lái)了新的特性以及性能方面的提升,有興趣的同學(xué)可以參考國(guó)外一博主總結(jié)的文章《Node.js 12: The future of server-side JavaScript》了解具體內(nèi)容。

其中比較重要的一點(diǎn)是啟動(dòng)速度提升,通過(guò) v8 code cache 的支持,構(gòu)建時(shí)提前為內(nèi)置庫(kù)生成代碼緩存,提升 30% 的啟動(dòng)耗時(shí)。

騰訊云云函數(shù) SCF 為了讓 Serverless 更加符合 Node.js 原生的使用體驗(yàn),針對(duì) Node.js runtime 做了針對(duì)性的優(yōu)化。 借這個(gè)機(jī)會(huì),我想和大家分享一下如何使用騰訊云云函數(shù)來(lái)開(kāi)發(fā) Node.js 應(yīng)用以及 scf 的 Node.js runtime 實(shí)現(xiàn)的原理。

入口函數(shù)的參數(shù)

首先我們看一下最基本的 Node.js 入口函數(shù):

exports.main_handler = (event, context, callback) => {
  console.log("Hello World");
  console.log(event);
  console.log(context);
  callback(null, event); 
};

runtime 會(huì)將三個(gè)參數(shù)傳遞到處理程序方法。

第一個(gè)參數(shù)是 event,用來(lái)傳遞觸發(fā)事件數(shù)據(jù)

包含來(lái)自調(diào)用程序的信息。調(diào)用程序在調(diào)用時(shí)將該信息作為 JSON 格式字符串傳遞,事件結(jié)構(gòu)因服務(wù)而異。

  • 定時(shí)觸發(fā)器的 event 對(duì)象就包括了觸發(fā)的時(shí)間,觸發(fā)器的名稱 {Message: "", Time: "2020-05-08T14:30:00Z", TriggerName: "time_5", Type: "Timer"}

  • apigateway 觸發(fā)器的 event 對(duì)象透?jìng)髁?http 請(qǐng)求的完整內(nèi)容以及 apigateway 定制化的 http 請(qǐng)求頭部信息

{"headerParameters":{},"headers":{...},"httpMethod":"GET","path":"/params_log","pathParameters":{},"queryString":{},"queryStringParameters":{},"requestContext":{"httpMethod":"ANY","identity":{},"path":"/params_log","serviceId":"service-9khp96qy","sourceIp":"120.229.9.165","stage":"release"}}

  • cos 觸發(fā)器的 event 對(duì)象包括了觸發(fā)執(zhí)行的具體 cos 操作以及 cos 對(duì)象

{"Records":[{"cos":{"cosBucket":{"appid":"1251133793","name":"test","region":"gz"},"cosNotificationId":"unkown","cosObject":{"key":"/1251133793/test/xxx.png","meta":{"Content-Type":"image/png","x-cos-request-id":"NWViNTZmMmFfOTJhODQwYV80MGZmXzI0Y2ZkYmM="},"size":6545739,"url":"...","vid":""},"cosSchemaVersion":"1.0"},"event":{"eventName":"cos:ObjectCreated:Put","eventQueue":"qcs:0:scf:ap-guangzhou:appid/1251133793:default.params_log.$DEFAULT","eventSource":"qcs::cos","eventTime":1588948779,"eventVersion":"1.0","reqid":1038862404,"requestParameters":{"requestHeaders":{"Authorization":"..."},"requestSourceIP":"120.229.9.165"},"reservedInfo":""}}]}

第二個(gè)參數(shù) context,函數(shù)運(yùn)行時(shí)信息

我們來(lái)看一下一個(gè)完整的 context 包含的內(nèi)容:

callbackWaitsForEmptyEventLoop: true,
getRemainingTimeInMillis: 200,
memory_limit_in_mb: 128,
time_limit_in_ms: 3000,
environment: "{"SCF_NAMESPACE":"demo","TENCENTCLOUD_SECRETID":"...","TENCENTCLOUD_SECRETKEY":"...","TENCENTCLOUD_SESSIONTOKEN":"..."}"
function_name: "params",
function_version: "$LATEST",
namespace: "demo",
request_id: "ab42b693-8bfd-4dc1-b228-60360a63e06c",
tencentcloud_appid: "...",
tencentcloud_region: "ap-chengdu",
tencentcloud_uin: "..."

從上面的內(nèi)容可以看到,該對(duì)象包含的內(nèi)容有:

  • 函數(shù)配置信息,比如設(shè)置的內(nèi)容大小,超時(shí)時(shí)間等

  • 執(zhí)行身份認(rèn)證信息。如果設(shè)置了函數(shù)的運(yùn)行角色(角色必須要包含對(duì)應(yīng)操作的授權(quán)策略),在環(huán)境變量中會(huì)注入 secretId,secretKey,sessionToken,在訪問(wèn)第三方云服務(wù),比如 cos、自定義監(jiān)控?cái)?shù)據(jù)上報(bào)時(shí)就可以使用這幾個(gè)值直接調(diào)用云 api,而不用在代碼里面去 hard code 各種密鑰信息

  • 環(huán)境變量:包括了用戶自定義的環(huán)境變量以及一些系統(tǒng)環(huán)境變量

  • 執(zhí)行環(huán)境基本信息:包括了當(dāng)前函數(shù)調(diào)用的地域,用戶的 appId,uin

第三個(gè)參數(shù) callback 是一個(gè)可選參數(shù),在非異步函數(shù)中返回執(zhí)行結(jié)果

回調(diào)函數(shù)采用兩個(gè)參數(shù):一個(gè) Error 和一個(gè)返回。返回對(duì)象必須與 JSON.stringify 兼容。異步函數(shù)將忽略 callback 的返回,必須通過(guò) return、throw exception 或者 promise 來(lái)處理返回或錯(cuò)誤

const https = require('https')
let url = "https://cloud.tencent.com/"

exports.main_handler = function(event, context, callback) {
  https.get(url, (res) => {
    callback(null, res.statusCode)
  }).on('error', (e) => {
    callback(Error(e))
  })
}

函數(shù)返回

我們來(lái)看一下,針對(duì)異步場(chǎng)景(async 函數(shù))和非異步場(chǎng)景,云函數(shù)怎么把返回值傳遞出去

異步函數(shù)

對(duì)于異步函數(shù),可以使用 return 和 throw 來(lái)發(fā)送返回或錯(cuò)誤。函數(shù)必須使用 async 關(guān)鍵字。在異步函數(shù)中,第三個(gè)參數(shù) callback 沒(méi)有定義

示例:異步函數(shù)

const https = require('https')
let url = "https://cloud.tencent.com/"

const httpRequest = url => {
  const promise = new Promise(function(resolve, reject) {
    https
      .get(url, res => {
        resolve(res.statusCode)
      })
      .on('error', e => {
        reject(Error(e))
      })
  })
  return promise
}

exports.handler =  async function(event, context) {
  try{
    const result = await httpRequest(url)
    // 在async函數(shù)中callback未定義
    // callback(null, result)
    return result
  }catch(e) {
    throw e
  }
}

同步函數(shù)

還是上面的例子,發(fā)起一個(gè) http 請(qǐng)求,如果用同步函數(shù)實(shí)現(xiàn),參照以下示例

示例:同步函數(shù),callback 返回

const https = require('https')
let url = "https://cloud.tencent.com/"

exports.handler = function(event, context, callback) {
  https.get(url, (res) => {
    // 只能通過(guò)callback返回,return會(huì)被忽略
    callback(null, res.statusCode)
  }).on('error', (e) => {
    callback(Error(e))
  })
}

返回的時(shí)機(jī)

正常的 Node.js web framework 在 response 返回后,異步邏輯還是繼續(xù)在執(zhí)行的。而 Serverless 場(chǎng)景下,由于機(jī)制和 framework的差別,對(duì)于已經(jīng)返回 responese 的情況,一種是等著異步都處理完再來(lái)返回,這樣保證了一次調(diào)用的完整性。另外一種就是在返回后就直接結(jié)束當(dāng)次調(diào)用,直接掛起異步處理。

騰訊云云函數(shù)針對(duì) Node.js 的異步場(chǎng)景,實(shí)現(xiàn)了返回和結(jié)束分離的特殊機(jī)制。

如何進(jìn)行云函數(shù)SCF Node.js Runtime實(shí)踐

  • 入口函數(shù)的同步執(zhí)行過(guò)程完成及返回后,云函數(shù)的調(diào)用將立刻返回,并將代碼的返回信息返回給函數(shù)調(diào)用方

  • 同步流程處理并返回后,代碼中的異步邏輯可以繼續(xù)執(zhí)行和處理,直到異步事件執(zhí)行完成后,云函數(shù)的實(shí)際執(zhí)行過(guò)程才完成和退出。

默認(rèn)情況下,函數(shù)執(zhí)行會(huì)等待所有異步執(zhí)行結(jié)束才算一次調(diào)用結(jié)束,但也給用戶提供了關(guān)閉事件循環(huán)等待的選項(xiàng),用戶可以關(guān)閉事件循環(huán)等待來(lái)自行控制函數(shù)的返回時(shí)機(jī)。通過(guò)在 callback 回調(diào)執(zhí)行前設(shè)置 context.callbackWaitsForEmptyEventLoop = false,可以使云函數(shù)在執(zhí)行返回后立刻凍結(jié)進(jìn)程,不再等待異步循環(huán)內(nèi)的事件

比如一下示例代碼,代碼里面發(fā)起了一個(gè)異步 http 請(qǐng)求,另外有一個(gè) 2s 后執(zhí)行的 setTimeout

const https = require('https')
let url = "https://cloud.tencent.com/"

const httpRequest = url => {
  const promise = new Promise(function(resolve, reject) {
    https
      .get(url, res => {
        resolve(res.statusCode)
      })
      .on('error', e => {
        reject(Error(e))
      })
  })
  return promise
}

exports.main_handler =  async function(event, context) {
  // 設(shè)置該選項(xiàng)為false會(huì)不等待異步隊(duì)列執(zhí)行完,而是在返回后直接凍結(jié)process
  //context.callbackWaitsForEmptyEventLoop = false
  try{
    const result = await httpRequest(url)
    setTimeout(() => {
        console.log('timeout log')
    }, 2000)
    return result
  }catch(e) {
    throw e
  }
}

在 http 請(qǐng)求完成后,會(huì)立即返回給調(diào)用方,不會(huì)等待 setTimeout 的異步實(shí)踐執(zhí)行完。而在返回后,程序會(huì)繼續(xù)執(zhí)行,直到 setTimeout 的事件執(zhí)行完才算本次調(diào)用結(jié)束。

在設(shè)置了 context.callbackWaitsForEmptyEventLoop = false 后,在 return 后進(jìn)程會(huì)被凍結(jié),setTimeout 里面的執(zhí)行邏輯會(huì)被掛起

完整流程圖

以下是單實(shí)例內(nèi) runtime 運(yùn)行的完整流程圖

如何進(jìn)行云函數(shù)SCF Node.js Runtime實(shí)踐

針對(duì) Node.js應(yīng)用,有以下幾個(gè)實(shí)踐建議:

  • 日志:runtime重寫(xiě)了 console 的幾個(gè)主要方法,而且是在 require 用戶文件之后,所以用戶自定義日志選項(xiàng)會(huì)無(wú)效

  • 緩存復(fù)用:在入口函數(shù)外可以定義變量,存儲(chǔ)可以復(fù)用的緩存對(duì)象,比如數(shù)據(jù)庫(kù)的連接等 Node.js 的模塊實(shí)現(xiàn)邏輯中,如果一個(gè) module 被 require 過(guò),該模塊就會(huì)被 cache 到內(nèi)存中,再次被 require時(shí)不會(huì)重新初始化。針對(duì)這一特性,如果實(shí)例一直再?gòu)?fù)用,那么在入口文件中,入口函數(shù)外定義的變量都不會(huì)被銷毀,可以達(dá)到復(fù)用的效果

  • 內(nèi)置部分 npm 包,可以直接使用,具體參照文檔。部署云函數(shù)代碼時(shí)推薦 npm install --production,減少代碼包的體積,提升上傳速度和執(zhí)行速度

  • 執(zhí)行角色:配置執(zhí)行角色,從 context 中可以獲取臨時(shí)的密鑰信息,可以用了訪問(wèn)有相應(yīng)權(quán)限的第三方服務(wù),而不用在代碼內(nèi)寫(xiě)死密鑰信息

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對(duì)創(chuàng)新互聯(lián)的支持。


當(dāng)前標(biāo)題:如何進(jìn)行云函數(shù)SCFNode.jsRuntime實(shí)踐
網(wǎng)頁(yè)地址:http://weahome.cn/article/ghgiod.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部