VPC高速直連是一種高效能的服務調用方式,允許用戶端在Virtual Private Cloud內部繞過公用網關,直接存取EAS服務執行個體。本文介紹其工作原理、配置方法,並提供使用官方SDK調用和自行實現調用邏輯的詳細指引。
功能概述
適用情境
高效能要求:對於每秒查詢數(QPS)極高的大Cellular Data Package(如映像、語音辨識),直連可以大幅提升訪問效能。
低延遲敏感:對於線上推薦、金融風控等對回應時間有嚴苛要求的業務,直連能有效降低延遲。
工作原理
核心機制包括:
網路連通:為服務配置專用網路後,EAS會在指定的VPC和交換器內,為每個服務執行個體建立並綁定一張免費的輔助彈性網卡,打通VPC和EAS服務執行個體之間的網路。這樣VPC內用戶端可直接存取EAS服務執行個體,而無需通過網關,避免了四層SLB和七層網路轉寄。
服務發現:EAS提供服務發現機制,允許用戶端擷取服務所有執行個體的即時
IP:PORT列表。用戶端可基於該列表實現負載平衡和容錯移轉。
準備工作
在調用之前,請確認已為服務配置專用網路,詳情請參見專用網路配置。
每個彈性網卡會佔用交換器中的一個IP地址,請確保交換器的可用IP數不小於服務執行個體數,以滿足服務執行個體的IP需求。
配置安全性群組規則,實現網路隔離和存取控制。
重要用戶端(如ECS)與EAS服務執行個體之間的網路訪問受安全性群組規則控制。
預設普通安全性群組內,執行個體之間是內網互連的。可以在為EAS服務配置VPC高速直連時,選擇需要訪問EAS服務的ECS執行個體所在安全性群組。
當需要配置使用不同的安全性群組時,請設定安全性群組的規則支援ECS執行個體之間能夠互連。詳情請參見不同安全性群組的傳統網路執行個體內網互連。
通過官方SDK調用(推薦)
EAS官方SDK封裝了服務發現、負載平衡和故障重試等複雜邏輯,是實現VPC高速直連調用的首選方式。
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依賴。
使用Java編寫用戶端代碼時,在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進行服務調用時,由於在編譯代碼時,Golang的包管理工具會自動從Github上將Golang SDK的代碼下載到本地,因此您無需提前安裝Golang SDK。該Golang 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
}
]
}
}實現邏輯詳解
一個健壯的自訂用戶端調用應包含以下三個核心邏輯:
本機快取執行個體列表並定時重新整理
重要服務探索服務是一個旁路的服務,不可在每次發起推理請求時調用服務發現API。
用戶端啟動一個後台線程,定時(建議每5-10秒)調用服務發現API。
成功時:當HTTP狀態代碼為200且返回的執行個體列表不為空白時,用新列表覆蓋本機快取。
失敗時:當API調用失敗(如逾時、返回非200狀態代碼)或返回空列表時,必須沿用本機快取,切勿清空,以保證服務的可用性。
請求時負載平衡
每次發起推理請求時,根據本機快取的執行個體列表選擇一個目標執行個體。建議採用加權輪詢(Weighted Round Robin)等演算法,也可根據自己的商務邏輯來進行選擇。
失敗重試
發起請求時,如遇串連失敗等情況,則表示服務執行個體可能發生異常(如使用者執行個體發生crash等),用戶端需要進行重試。在本機快取中執行個體數多於1的情況下,重新從緩衝中擷取一個不同的執行個體進行重試。
完整的實現流程,請參見Python SDK的實現。
相關文檔
更多的服務調用方式,請參見調用方式概覽。