全部產品
Search
文件中心

Function Compute:配置HTTP觸發器並使用WebSocket觸發

更新時間:Jul 06, 2024

Function Compute支援HTTP觸發器,配置HTTP觸發器的函數可以通過WebSocket請求被觸發執行。此時函數可以看做一個Web Server,對WebSocket請求進行處理,並將處理結果返回給調用端。本文介紹如何在Function Compute控制台配置HTTP觸發器並使用WebSocket請求觸發。

前提條件

已建立函數,其運行環境為Node.js 14。具體操作,請參見建立函數

步驟一:建立觸發器

  1. 登入Function Compute控制台,在左側導覽列,單擊函數

  2. 在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。

  3. 在函數詳情頁面,選擇配置頁簽,在左側導覽列,單擊觸發器,然後單擊建立觸發器

  4. 在建立觸發程序面板,填寫相關資訊,然後單擊確定

    配置項

    操作

    本文樣本

    觸發器類型

    選擇HTTP 觸發器

    HTTP 觸發器

    名稱

    填寫自訂的觸發器名稱。

    http-trigger

    版本或別名

    預設值為LATEST,如果您需要建立其他版本或別名的觸發器,需先在函數詳情頁的版本或別名下拉式清單選擇該版本。關於版本和別名的簡介,請參見版本管理別名管理

    LATEST

    要求方法

    指定可以通過哪些方法觸發器該HTTP觸發器。

    GET, POST, PUT, DELETE

    禁用公網存取 URL

    預設選擇,即允許公網網域名稱訪問該觸發器。

    如果選擇,建立的HTTP觸發器將不提供預設的公網網域名稱。此時,如果通過公網網域名稱來調用函數,將會提示錯誤access denied due to function internet URL is disable。通過自訂網域名的訪問,則不受影響。

    認證方式

    選擇Function Compute對HTTP請求的認證方式。取值說明如下:

    • 無需認證:無需對HTTP請求進行身份認證,支援匿名訪問,任何人可發起HTTP請求調用您的函數。

    • 簽名認證:需要對HTTP請求進行身份認證。關於簽名認證的範例程式碼,請參見通過簽名訪問HTTP觸發器地址

    • JWT 認證:需要對HTTP請求進行JWT認證。更多資訊,請參見為HTTP觸發器配置JWT認證鑒權

    無需認證

    建立完成後,您可以根據情況對HTTP觸發器的配置項進行修改,包括版本或別名要求方法禁用公網存取 URL認證方式

步驟二:編寫並部署代碼

  1. 在函數詳情頁面的代碼頁簽,在代碼編輯器中編寫代碼,然後單擊部署代碼

    在控制台WebIDE的目前的目錄,將下面的代碼複製到index.js檔案中。本文以Node.js代碼為例。

    const WebSocket = require('ws');
    
    const WebSocketServer = WebSocket.Server;
    
    const wss = new WebSocketServer({
      host: "0.0.0.0",
      port: 9000,
    });
    
    wss.on('connection', function (ws, req) {
      console.log(`[SERVER] connection()`);
      ws.on('message', function (message) {
        ws.send(`${message}`, (err) => {
          if (err) {
            console.log(`[SERVER] error: ${err}`);
          }
        });
      })
    });
    說明

    WebSocket Server監聽的IP地址是0.0.0.0,不能是127.0.0.1localhost。如果您沒有配置自訂監聽連接埠,預設使用9000連接埠。

    此時,WebIDE的目錄結構如下圖所示:directory1

  2. 在WebIDE的終端視窗,執行npm install ws命令來安裝依賴。

    安裝完成後,會自動組建檔案package-lock.json,目錄結構如下圖所示:dir2

  3. 單擊部署代碼,將您的代碼部署到Function Compute中。

步驟三:測試函數

  1. 在函數詳情頁面,單擊觸發器管理頁簽,查看並複製觸發器的公網訪問地址。

    trigger

  2. 使用Postman來測試函數的正確性。

    將該URL複製到Postman中,並將Scheme由HTTPS變更成WSS。更多資訊,請參見Postman

計費方式

使用WebSocket的計費方式與使用HTTP的計費方式完全一致,您可以將WebSocket看作連線時間較長的HTTP調用。

  • 對於並發度設定為1的函數,計費時間從WebSocket串連建立開始到WebSocket串連斷開結束。

  • 對於並發度大於1的函數,執行個體的計費時間從收到第一個WebSocket串連建立開始,到最後一個WebSocket串連斷開結束。一個執行個體中多個串連同時存在期間,不會被重複計費。

    如下圖所示,一個函數的並發度設定為2,第一個請求到達的時間為T1,結束時間為T3,第二個請求到達時間為T2,結束時間為T4,計費時間為T4-T1,其中T2到T3這段時間只會被計費一次,不會被重複計費。websocket-billing

更多說明

請求逾時

Function Compute在執行逾時時間上,並不會區分WebSocket請求和HTTP請求。如果您的WebSocket串連存活時間超過了您設定的執行逾時時間,WebSocket串連會被強制關閉,您的用戶端會收到1006狀態代碼。

串連保活和逾時重連

當您的WebSocket串連建立之後,除了在串連時間長度超過您設定的執行逾時時間會中斷連線之外,Function Compute不會幹涉您的任何邏輯。如果在存續期間,您的WebSocket串連在一段時間內沒有資料轉送,則該串連可能會被網路中的中間節點(比如NAT Gateway)關閉。這種情況下,您可能需要通過WebSocket協議提供的Ping、Pong幀來對串連進行保活或者驗證WebSocket串連是否可用。

如果您的業務需要設定超過Function Compute能夠提供的最大請求逾時時間,或者您的應用期望在運行期間保持邏輯上的串連穩定,您可以在用戶端代碼中加上逾時重連機制。您可以藉助Reconnecting-WebSocket的庫或SocketIO庫來實現該機制。

關於粘性會話(會話親和性)

Function Compute是無狀態的,當函數的並發請求度較大的時候,Function Compute無法保證來自同一用戶端的多個請求會被同一個容器處理。您可能需要通過外部儲存(Redis、Memcached、Kafka、資料庫等)來維持WebSocket請求在多個容器執行個體之間的狀態。

例如,對於聊天室應用,Function Compute無法保證所有的使用者同時串連到同一個函數執行個體上。所以使用者的函數可以藉助Redis的發布訂閱功能來實現聊天室,使用者加入一個聊天室的時候,會訂閱(Sub)該聊天室所在的頻道,當使用者1發送資訊的時候,函數收到該訊息,將其發布(Pub)到Redis中聊天室所在的頻道,因為在相同的聊天室的使用者均已經訂閱(Sub)了該聊天室的頻道,所以該聊天室的所有使用者都會收到使用者1剛才發送的訊息。

更多樣本

Custom Runtime

Custom Container

Python

Python

Node.js

Node.js

Golang

Golang

常見問題

為什麼WebSocket函數無法執行?

  • 如果是您新建立的觸發器,會有10s左右的緩衝更新時間,請稍後再試。

  • 請檢查函數代碼中的依賴包是否正確安裝,更多資訊,請參見為函數安裝第三方依賴

  • 請檢查函數監聽的連接埠和IP地址是否正確。監聽的IP地址可以是0.0.0.0,不能是127.0.0.1localhost。如果您沒有配置自訂監聽連接埠,預設使用9000連接埠。

錯誤排查

WebSocket握手完成之前發生的錯誤主要分為以下兩種:

  • 請求錯誤是指發送的Request不符合標準,在Response裡報錯狀態代碼為4xx。

  • 函數錯誤,即編寫的函數有問題,會報5xx狀態代碼。

錯誤類型

HTTP狀態代碼

原因分析

是否計費

請求錯誤

400

您的請求超過Request限制項的限制。更多資訊,請參見HTTP觸發器概述

400

調用需要身份認證的函數的Request沒有傳入Date資訊或Authorization資訊。

403

調用需要身份認證的函數的Request的簽名錯誤,即Authorization不正確。由於Date參與簽名計算,且超過15 min,簽名失效,一種常見的原因是使用需要訪問認證的HTTP觸發器,Request header中發送的Date據目前時間超過15 min,導致簽名失效。

403

您的Request請求使用了HTTP觸發器中未配置的要求方法。WebSocket函數要求HTTP觸發器必須支援GET方法,如果沒有配置該方法,會報該錯誤

404

向沒有設定HTTP觸發器的函數發送WebSocket請求。

使用者流控

429

使用者被流控,可減小並發量或者聯絡阿里雲Function Compute團隊提高並發度。

系統錯誤

500

Function Compute系統錯誤,可重試解決。

系統流控

503

Function Compute系統流控。可用指數退避方式重試。

WebSocket握手完成之後的錯誤,均為函數代碼產生或引起的錯誤,您可以仔細檢查您的代碼,或者查看代碼運行中產生的日誌。更多資訊,請參見查看調用日誌

更多資訊

除了Function Compute控制台,您還可以通過以下方式配置觸發器:

如需對建立的觸發器進行修改或刪除,具體操作,請參見觸發器管理