全部產品
Search
文件中心

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

更新時間:Feb 21, 2025

Function Compute中,您可以通過配置HTTP觸發器讓函數響應WebSocket請求。當HTTP觸發器配置完成後,相關聯的函數便能夠作為一個Web Server,對WebSocket請求進行處理,並將處理結果返回給請求端。

前提條件

建立服務

步驟一:建立函數

  1. 登入Function Compute控制台,在左側導覽列,單擊服務及函數
  2. 在頂部功能表列,選擇地區,然後在服務列表頁面,單擊目標服務。
  3. 函數管理頁面,單擊建立函數
  4. 建立函數頁面,選擇使用自訂運行時建立,設定相關參數,然後單擊建立

    需要設定的參數說明如下,其餘參數保持預設值即可,更多參數說明,請參見建立函數

    • 函數名稱:設定您要建立的函數名稱,例如websocket-demo

    • 請求處理常式類型:選擇處理 HTTP 要求

    • 運行環境:選擇Node.js 18

步驟二:編寫並部署代碼

  1. 在函數詳情頁面,單擊函數代碼頁簽,在代碼編輯器中編寫代碼。

    在控制台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.1localhost

    • WebSocket Server監聽的連接埠號碼是一個介於0到65535之間的整數,通常會選擇一個大於1024的整數。這裡port的值需要設定為您在建立函數時配置的監聽連接埠,預設值為9000連接埠。

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

  2. 在WebIDE的終端視窗,執行npm install ws命令來安裝依賴,如果您使用的是Python語言,安裝依賴的方法請參見通過Function Compute控制台安裝依賴

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

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

步驟三:測試函數

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

    image.png

    說明

    HTTP觸發器建立成功後,訪問地址不會變更。

  2. 使用Postman來測試函數的正確性。更多資訊,請參見Postman

    1. 在Postman中建立WebSocket請求。

      將該URL複製到Postman中,並將Scheme由HTTPS變更成WSS。

    2. 根據需求配置Params及Headers。

    3. 串連WebSocket,串連成功後即可以發送訊息。

    4. 輸入要發送的訊息並進行發送,然後查看訊息接收的情況。

    5. 超過執行逾時時間後,會斷開與WebSocket伺服器的串連。

    測試過程如下圖所示:

    image.png

    (可選)如果您在用Postman工具測試的過程出現FCCommonError的錯誤,請確認您HTTP觸發器的認證方式,如您無需鑒權訪問,可在HTTP觸發器建立時或建立後選擇無需認證進行測試。

    image

更多說明

請求逾時

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

更多樣本

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狀態代碼。

錯誤類型

X-Fc-Error-Type

HTTP狀態代碼

原因分析

是否計費

請求錯誤

FcCommonError

400

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

FcCommonError

400

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

FcCommonError

403

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

FcCommonError

403

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

FcCommonError

404

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

使用者流控

FcCommonError

429

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

系統錯誤

FcCommonError

500

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

系統流控

FcCommonError

503

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

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

相關文檔

  • WebSocket協議在Runtime支援、逾時時間、資料轉送等方面有使用限制,請參見WebSocket協議使用限制

  • HTTP觸發器支援同步調用和非同步呼叫,具體使用請參見調用方式

  • Function Compute允許HTTP函數的調用請求跨域訪問,對跨域請求的處理方式請參見CORS請求處理