在Function Compute中,您可以通過配置HTTP觸發器讓函數響應WebSocket請求。當HTTP觸發器配置完成後,相關聯的函數便能夠作為一個Web Server,對WebSocket請求進行處理,並將處理結果返回給請求端。
前提條件
步驟一:建立函數
- 登入Function Compute控制台,在左側導覽列,單擊服務及函數。
- 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
- 在函數管理頁面,單擊建立函數。
在建立函數頁面,選擇使用自訂運行時建立,設定相關參數,然後單擊建立。
需要設定的參數說明如下,其餘參數保持預設值即可,更多參數說明,請參見建立函數。
函數名稱:設定您要建立的函數名稱,例如websocket-demo。
請求處理常式類型:選擇處理 HTTP 要求。
運行環境:選擇Node.js 18。
步驟二:編寫並部署代碼
在函數詳情頁面,單擊函數代碼頁簽,在代碼編輯器中編寫代碼。
在控制台WebIDE的目前的目錄,將下面的代碼複製到index.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
,表示伺服器將監聽所有可用的網路介面。IP地址不能設定為127.0.0.1
或localhost
。WebSocket Server監聽的連接埠號碼是一個介於0到65535之間的整數,通常會選擇一個大於1024的整數。這裡
port
的值需要設定為您在建立函數時配置的監聽連接埠,預設值為9000
連接埠。
此時,WebIDE的目錄結構如下圖所示:
在WebIDE的終端視窗,執行
npm install ws
命令來安裝依賴,如果您使用的是Python語言,安裝依賴的方法請參見通過Function Compute控制台安裝依賴。安裝完成後,會自動組建檔案package-lock.json,目錄結構如下圖所示:
單擊部署代碼,將您的代碼部署到Function Compute中。
步驟三:測試函數
在函數詳情頁面,單擊觸發器管理頁簽,查看並複製觸發器的公網訪問地址。
說明HTTP觸發器建立成功後,訪問地址不會變更。
使用Postman來測試函數的正確性。更多資訊,請參見Postman。
在Postman中建立WebSocket請求。
將該URL複製到Postman中,並將Scheme由HTTPS變更成WSS。
根據需求配置Params及Headers。
串連WebSocket,串連成功後即可以發送訊息。
輸入要發送的訊息並進行發送,然後查看訊息接收的情況。
超過執行逾時時間後,會斷開與WebSocket伺服器的串連。
測試過程如下圖所示:
(可選)如果您在用Postman工具測試的過程出現FCCommonError的錯誤,請確認您HTTP觸發器的認證方式,如您無需鑒權訪問,可在HTTP觸發器建立時或建立後選擇無需認證進行測試。
更多說明
請求逾時
Function Compute在執行逾時時間上,並不會區分WebSocket請求和HTTP請求。如果您的WebSocket串連存活時間超過了您設定的執行逾時時間,WebSocket串連會被強制關閉,您的用戶端會收到1006狀態代碼。
串連保活和逾時重連
當您的WebSocket串連建立之後,除了在串連時間長度超過您設定的執行逾時時間會中斷連線之外,Function Compute不會幹涉您的任何邏輯。如果在存續期間,您的WebSocket串連在一段時間內沒有資料轉送,則該串連可能會被網路中的中間節點關閉,比如NAT Gateway(使用者用戶端的內網地址到外網地址的映射)、路由器配置等。這種情況下,串連的具體逾時時間不是固定的,如果在逾時時間範圍內沒有任何資料轉送,NAT可能會斷開該WebSocket串連,您可能需要通過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剛才發送的訊息。
計費方式
使用WebSocket的計費方式與使用HTTP的計費方式完全一致,您可以將WebSocket看作連線時間較長的HTTP調用。關於計費的更多資訊,請參見計費概述。
對於並發度設定為1的函數,計費時間從WebSocket串連建立開始到WebSocket串連斷開結束。
對於並發度大於1的函數,執行個體的計費時間從收到第一個WebSocket串連建立開始,到最後一個WebSocket串連斷開結束。一個執行個體中多個串連同時存在期間,不會被重複計費。
如下圖所示,一個函數的並發度設定為2,第一個請求到達的時間為T1,結束時間為T3,第二個請求到達時間為T2,結束時間為T4,計費時間為T4-T1,其中T2到T3這段時間只會被計費一次,不會被重複計費。
更多樣本
Custom Runtime | Custom Container |
常見問題
相關文檔
WebSocket協議在Runtime支援、逾時時間、資料轉送等方面有使用限制,請參見WebSocket協議使用限制。
HTTP觸發器支援同步調用和非同步呼叫,具體使用請參見調用方式。
Function Compute允許HTTP函數的調用請求跨域訪問,對跨域請求的處理方式請參見CORS請求處理。