Function Compute支援HTTP觸發器,配置HTTP觸發器的函數可以通過WebSocket請求被觸發執行。此時函數可以看做一個Web Server,對WebSocket請求進行處理,並將處理結果返回給調用端。本文介紹如何在Function Compute控制台配置HTTP觸發器並使用WebSocket請求觸發。
前提條件
已建立函數,其運行環境為Node.js 14。具體操作,請參見建立函數。
步驟一:建立觸發器
登入Function Compute控制台,在左側導覽列,單擊函數。
在頂部功能表列,選擇地區,然後在函數頁面,單擊目標函數。
在函數詳情頁面,選擇配置頁簽,在左側導覽列,單擊觸發器,然後單擊建立觸發器。
在建立觸發程序面板,填寫相關資訊,然後單擊確定。
配置項
操作
本文樣本
觸發器類型
選擇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和認證方式。
步驟二:編寫並部署代碼
在函數詳情頁面的代碼頁簽,在代碼編輯器中編寫代碼,然後單擊部署代碼。
在控制台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.1或localhost。如果您沒有配置自訂監聽連接埠,預設使用9000連接埠。此時,WebIDE的目錄結構如下圖所示:

在WebIDE的終端視窗,執行
npm install ws命令來安裝依賴。安裝完成後,會自動組建檔案package-lock.json,目錄結構如下圖所示:

單擊部署代碼,將您的代碼部署到Function Compute中。
步驟三:測試函數
在函數詳情頁面,單擊觸發器管理頁簽,查看並複製觸發器的公網訪問地址。

使用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這段時間只會被計費一次,不會被重複計費。

更多說明
請求逾時
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 |
常見問題
為什麼WebSocket函數無法執行?
如果是您新建立的觸發器,會有10s左右的緩衝更新時間,請稍後再試。
請檢查函數代碼中的依賴包是否正確安裝,更多資訊,請參見為函數安裝第三方依賴。
請檢查函數監聽的連接埠和IP地址是否正確。監聽的IP地址可以是
0.0.0.0,不能是127.0.0.1或localhost。如果您沒有配置自訂監聽連接埠,預設使用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控制台,您還可以通過以下方式配置觸發器:
通過Serverless Devs工具配置觸發器。更多操作,請參見Serverless Devs常用命令。
通過SDK配置觸發器。更多操作,請參見SDK列表。
如需對建立的觸發器進行修改或刪除,具體操作,請參見觸發器管理。