VPC高速直連允許用戶端在Virtual Private Cloud內繞過公用網關,直接存取EAS服務執行個體,適用於高QPS、低延遲的推理情境。您可以使用官方SDK調用,也可以自行實現調用邏輯。
功能概述
適用情境
-
高效能要求:對於每秒查詢數(QPS)極高的大Cellular Data Package(如映像、語音辨識),直連可以大幅提升訪問效能。
-
低延遲敏感:對於線上推薦、金融風控等對回應時間有嚴苛要求的業務,直連能有效降低延遲。
工作原理
VPC高速直連基於以下兩點實現:
-
網路連通:為服務配置專用網路後,EAS會在指定的VPC和交換器內,為每個服務執行個體建立並綁定一張免費的輔助彈性網卡,打通VPC和EAS服務執行個體之間的網路。這樣VPC內用戶端可直接存取EAS服務執行個體,而無需通過網關,避免了四層SLB和七層網路轉寄。
-
服務發現:EAS提供服務發現機制,允許用戶端擷取服務所有執行個體的即時
IP:PORT列表。用戶端可基於該列表實現負載平衡和容錯移轉。
準備工作
在調用之前,請確認已為服務配置專用網路,詳情參見EAS訪問公網或內網資源。
-
每個彈性網卡會佔用交換器中的一個IP地址,請確保交換器的可用IP數不小於服務執行個體數。
-
配置安全性群組規則,實現網路隔離和存取控制。
重要用戶端(如ECS)與EAS服務之間的網路訪問受安全性群組規則控制。
-
普通安全性群組預設組內內網互連,故可以直接讓用戶端和EAS服務使用同一普通安全性群組。
-
若用戶端和EAS服務需使用不同安全性群組,請設定安全性群組規則實現互連。詳情參見不同安全性群組的執行個體內網互連。
-
通過官方SDK調用(推薦)
核心邏輯
VPC高速直連情境下,用戶端繞過網關直接存取服務執行個體,需自行處理服務發現、負載平衡和故障重試。EAS官方SDK已封裝這三項邏輯:
-
服務發現:SDK在初始化時啟動後台線程,定期調用EAS服務發現API,擷取後端執行個體的
IP:PORT和權重列表,緩衝到用戶端本地。API失敗時沿用上一次緩衝,保證可用性。 -
負載平衡:每次發起請求時,SDK從本地執行個體緩衝中按加權輪詢(Weighted Round Robin)演算法選擇一個目標執行個體,權重由服務發現API返回的執行個體權重決定。
-
故障重試:當請求失敗(網路異常、連線逾時、5xx響應)時,SDK從本機快取中重新選擇一個不同的執行個體進行重試。在多執行個體情境下,可避免單一實例異常導致請求失敗。
如果您計劃自行實現調用邏輯而不使用SDK,需要參考自行實現調用邏輯實現等價能力。
調用樣本
Python SDK調用
-
安裝或升級SDK。
pip install -U eas-prediction --user詳情參見Python SDK使用說明。
-
編寫調用代碼。
以字串作為輸入輸出的程式樣本如下,其他格式(TensorFlow或PyTorch等)的輸入輸出的程式樣本請參見Python SDK使用說明。
#!/usr/bin/env python from eas_prediction import PredictClient from eas_prediction import StringRequest from eas_prediction import TFRequest from eas_prediction import ENDPOINT_TYPE_DIRECT # 替換為真實的地址。格式是{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com # Uid為阿里雲帳號UID, RegionId為EAS服務的地區 ENDPOINT = "123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com" # 替換為真實的EAS服務名稱 SERVICE_NAME = "mnist_saved_model_example" # 替換為服務Token。可以在目標服務的詳情頁查看調用資訊來擷取。建議通過環境變數或Key Management Service(KMS)來管理和使用Token。 TOKEN = "M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****" if __name__ == '__main__': client = PredictClient(ENDPOINT, SERVICE_NAME) client.set_token(TOKEN) client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # 表示通過直連通道訪問服務。 client.init() # request = StringRequest('[{}]') req = TFRequest('predict_images') req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) resp = client.predict(req) print(resp)其中:
-
client = PredictClient()的函數入參分別為高速直連Endpoint地址和服務的名稱。 -
高速直連Endpoint地址:和地區綁定,格式為
{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com。其中,{Uid}為阿里雲帳號UID。例如華東2(上海)地區的高速直連Endpoint地址為123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com。 -
TOKEN:可以在目標服務的詳情頁查看調用資訊來擷取。
-
Java SDK調用
-
添加Maven依賴。
在Maven工程中使用EAS Java SDK,需在pom.xml檔案<dependencies>中添加eas-sdk的依賴,樣本如下,最新版本以Maven倉庫中顯示的為準。
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.20</version> </dependency>詳情參見Java SDK使用說明。
-
編寫調用代碼。
import com.aliyun.openservices.eas.predict.http.PredictClient; import com.aliyun.openservices.eas.predict.http.HttpConfig; public class TestString { public static void main(String[] args) throws Exception { // 為了確保client對象被正確共用,應當在啟動時建立並初始化client對象,而不是在每個請求中都建立一個新的client對象。 PredictClient client = new PredictClient(new HttpConfig()); // 替換為服務Token。您可以單擊目標服務的服務方式列下的調用資訊來查看Token資訊。 client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****"); // 直連訪問時請使用setDirectEndpoint方法,設定123**********.vpc.{region_id}.pai-eas.aliyuncs.com的網域名稱進行訪問,其中123**********需要替換為您自己的UID。例如華東2(上海)為cn-shanghai。 client.setDirectEndpoint("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com"); // 替換為服務名稱。 client.setModelName("scorecard_pmml_example"); // 定義輸入字串。 String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]"; System.out.println(request); // 通過EAS返回字串。 try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // 關閉用戶端。 client.shutdown(); return; } }
Golang SDK調用
使用Golang SDK調用時,編譯代碼時包管理工具會自動從Github下載SDK代碼,無需提前安裝。調用詳情參見Golang SDK使用說明。
使用Golang官方SDK調用服務的方法如下:
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// 設定123**********.vpc.{region_id}.pai-eas.aliyuncs.com的網域名稱進行訪問,其中123**********需要替換為您自己的UID。例如華東2(上海)為cn-shanghai。請替換為目標服務所在地區和服務名稱。
client := eas.NewPredictClient("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
// 替換為服務Token。您可以單擊目標服務的服務方式列下的調用資訊來查看Token資訊。
client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
client.SetEndpointType(eas.EndpointTypeDirect)
client.Init()
req := "[{\"fea1\": 1, \"fea2\": 2}]"
for i := 0; i < 100; i++ {
resp, err := client.StringPredict(req)
if err != nil {
fmt.Printf("failed to predict: %v\n", err.Error())
} else {
fmt.Printf("%v\n", resp)
}
}
}
自行實現調用邏輯
如果需要使用其他語言或有定製化需求,可以參考如下內容自行實現HTTP調用邏輯。
自行實現調用邏輯需要處理服務發現、負載平衡、故障重試等容錯邏輯,實現品質直接影響服務可用性。建議使用官方SDK。平台SLA不覆蓋因用戶端實現不當導致的服務中斷。
服務發現API
EAS在VPC環境中提供了一個HTTP介面用於服務發現。通過訪問該介面,您可以擷取服務所有後端執行個體的IP、連接埠和權重列表。
-
URL格式:
http://<您的阿里雲帳號ID>.vpc.<RegionID>.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/<服務名稱> -
認證方式:該API無需Token認證,但僅限在為服務配置的VPC內部訪問。
-
調用時機:此API為旁路介面,應由背景工作定期調用(例如,每5-10秒一次)。嚴禁在每次推理請求時調用此API,否則會嚴重影響效能。
調用樣本:
對於部署在華東1(杭州)的mnist_saved_model_example服務(該服務有兩個Instance),調用樣本如下:
$curl http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
注意將上述地址中的123**********替換為您自己的UID。
獲得的服務後端地址清單如下:
{
"correlative": [
"mnist_saved_model_example"
],
"endpoints": {
"items": [
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
},
{
"app": "mnist-saved-model-example",
"ip": "172.16.XX.XX",
"port": 50000,
"weight": 100
}
]
}
}
實現要點
自行實現用戶端調用邏輯時,您需要在用戶端處理服務發現、負載平衡和故障重試。完整的實現樣本可參考Python SDK源碼。下面是實現時需要特別注意的事項:
-
本機快取執行個體列表並定時重新整理:啟動後台線程,定時(建議每5-10秒)調用服務發現API,將返回的執行個體列表覆蓋到本機快取。
重要服務發現是旁路服務,嚴禁在每次推理請求時調用。API失敗或返回空列表時,必須沿用本機快取,切勿清空,否則服務不可用。
-
請求時負載平衡:每次發起推理請求時從本機快取中選擇一個執行個體,建議使用加權輪詢演算法,也可根據商務邏輯自訂。
-
失敗重試:請求出現串連失敗、逾時或5xx響應時,從本機快取中選擇一個不同的執行個體重試(要求執行個體數大於1才能切換)。
相關文檔
更多服務調用方式,參見調用方式概覽。