透過 WebSocket 建立永久連線

您可以使用 WebSocket,在行動裝置和電腦等用戶端與 App Engine 執行個體之間建立永久連線。這種開放式連線可讓用戶端和伺服器之間隨時雙向交換資料,因此可降低延遲,改善資源使用情形。

WebSocket

RFC 6455 中定義的 WebSocket 通訊協定會在用戶端和伺服器之間提供全雙工通訊管道。該管道是透過包含「upgrade」標頭的 HTTP(S) 要求啟動的。

WebSocket 的常見用途包括:

  • 即時事件更新,例如社交媒體動態饋給、體育賽事比分、新聞,或股市價格
  • 使用者通知,例如軟體或內容更新
  • 即時通訊應用程式
  • 協作編輯工具
  • 多人對戰遊戲

WebSocket 隨時可供您的應用程式使用,無需經過任何額外設定。WebSocket 連線建立後經過 1 小時就會逾時。

透過 WebSocket 執行範例應用程式

請按照 App Engine 上適用於 .NET 的「Hello, World!」中的操作說明設定環境和專案,並瞭解如何在 App Engine 中建構 .NET 應用程式。

複製範例應用程式

將範例應用程式複製到您的本機電腦,然後前往 websockets 目錄:

git clone https://github.com/GoogleCloudPlatform/dotnet-docs-samples
cd dotnet-docs-samples/appengine/flexible/WebSocket/

在本機執行範例

在本機電腦上執行 Hello World 應用程式:

  1. 安裝 2.2 版 .NET Core SDK 或更近期的版本。

  2. 在 PowerShell 中執行下列指令:

     dotnet restore
     dotnet run
    
  3. 在網路瀏覽器中,輸入下列網址:

     http://localhost:5000/chat
    

在 App Engine 上部署並執行範例

如要將應用程式部署至 App Engine 彈性環境,請在 app.yaml 所在的目錄中執行下列指令:

gcloud beta app deploy .\bin\Debug\netcoreapp2.2\publish\app.yaml

工作階段相依性

部分用戶端並不支援 WebSocket。為因應這種情況,許多應用程式會採用 socket.io 這類程式庫,在遇到不支援 WebSocket 的用戶端時恢復使用 http 長時間輪詢。

App Engine 通常會將要求平均分配到可用的執行個體,但在使用 HTTP 長時間輪詢時,來自特定使用者的多項連續要求必須傳送到同一個執行個體。

如要讓 App Engine 將同一名使用者的要求傳送到同一個執行個體,您可以啟用工作階段相依性。這樣一來,App Engine 就會檢視 Cookie,辨識哪些要求是由同一名使用者送出,然後將這些要求轉送到同一個執行個體。

系統會儘可能實作 App Engine 中的工作階段相依性。開發應用程式時,建議您一律假設工作階段相依性不保證有效。在下列情況下,用戶端可能會失去目標執行個體的相依性:

  • App Engine 自動配置器可以新增或移除為應用程式提供服務的執行個體。應用程式可能會重新分配負載,因此目標執行個體可能會變動。為了將此風險降到最低,請確認您已設定執行個體的數量下限以處理預期負載。
  • 如果目標執行個體未通過健康狀態檢查,App Engine 會將工作階段移到健康狀態良好的執行個體。
  • 如果執行個體因系統維護或軟體更新而重新啟動,就會失去工作階段相依性。App Engine 彈性環境 VM 執行個體每週會重新啟動一次。

由於工作階段相依性不保證有效,因此建議您只將這項功能運用於發揮 socket.io 和其他程式庫的功能,以便在連線中斷的情況下恢復使用 HTTP 長時間輪詢。切勿使用工作階段相依性來建構有狀態的應用程式。

啟用及停用工作階段相依性

根據預設,所有 App Engine 應用程式的工作階段相依性都為停用狀態。工作階段相依性是在應用程式的版本層級設定,且可以在部署時啟用或停用。

如要為您的 App Engine 版本啟用工作階段相依性,請在 app.yaml 檔案中新增下列項目:

network:
  session_affinity: true

只要該版本使用最新的 app.yaml 部署完畢,系統就會開始透過同一個執行個體提供新的要求 (只要該執行個體可用)。

如要停用工作階段相依性,請從 app.yaml 檔案移除上述項目或將資料值設為 false:

network:
  session_affinity: false
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
.NET 文件適用的 App Engine 彈性環境