EAS支持通過Python官方SDK或自行實現調用邏輯的方式對服務進行VPC高速直連調用。本文詳細介紹這兩種調用方式的實現方法。
調用原理
VPC高速直連調用、公網調用及VPC地址調用的鏈路如下圖所示。
開啟服務運行所在資源組的VPC高速直連功能后,EAS會在您指定的安全組內綁定輔助網卡,打通您的VPC和EAS服務實例之間的網絡。之后您可以在自己的VPC中直接訪問EAS實例,無需通過網關訪問服務,避免了四層SLB和七層網絡轉發。同時,EAS預置的RPC實現了HTTP相關協議棧,對于高QPS(Queries Per Second)的大流量服務(例如圖像服務),可以大幅度提高訪問性能、降低訪問延時。
前提條件
如果您使用專屬資源組部署服務,則部署服務前,需要為專屬資源組開通VPC高速直連功能,詳情請參見配置網絡連通。
安全組控制ECS實例機器的出入流量,用戶的ECS實例和EAS服務實例之間的網絡互通也受安全組的配置控制。默認普通安全組內,實例之間是內網互通的,您可以在配置VPC高速直連時,選擇需要訪問在線服務的ECS實例所在安全組,從而支持實例之間網絡互通。當需要配置使用不同的安全組時,請設置安全組的規則支持ECS實例之間能夠互通。
調用方式
為方便用戶調用服務,EAS提供了以下兩種方式實現VPC高速直連調用:
EAS封裝了調用邏輯并提供了Python SDK、Java SDK和Golang SDK的調用方法,您可以直接使用SDK實現VPC高速直連調用。
推薦使用官方SDK調用服務,從而有效減少編寫調用邏輯的時間并提高服務調用穩定性。如果您需要使用其他語言或希望自己編寫實現調用邏輯,下文也提供了方法指導供您參考。此外,自行實現調用邏輯需要根據不同框架構建服務請求,詳情請參見構建通用Processor服務請求。
使用官方SDK調用
Python SDK調用
使用Python官方SDK調用服務的方法如下:
安裝。
pip install -U eas-prediction --user
該Python SDK的調用詳情請參見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 if __name__ == '__main__': client = PredictClient('http://pai-eas-vpc.cn-shanghai.aliyuncs.com', 'mnist_saved_model_example') # 替換為服務Token。您可以單擊目標服務的服務方式列下的調用信息來查看Token信息。 client.set_token('M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****') 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) for x in range(0, 1000000): resp = client.predict(req) print(resp)
其中
client = PredictClient()
的函數入參分別為高速直連Endpoint地址(endpoint參數),服務的名稱(service_name參數)。高速直連Endpoint地址和地域綁定的,他的格式是pai-eas-vpc.{RegionId}.aliyuncs.com
,例如華東2(上海)地域的高速直連Endpoint地址為pai-eas-vpc.cn-shanghai.aliyuncs.com
。
Java SDK調用
使用Java官方SDK調用服務的方法如下:
添加依賴項,EAS SDK的最新版本以Maven倉庫中顯示的為準。
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.13</version> </dependency>
該Java SDK的調用詳情請參見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方法,設置pai-eas-vpc.{region_id}.aliyuncs.com的域名進行訪問,例如華東2(上海)為cn-shanghai。 client.setDirectEndpoint("pai-eas-vpc.cn-shanghai.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() {
// 設置pai-eas-vpc.{region_id}.aliyuncs.com的域名進行訪問,例如華東2(上海)為cn-shanghai。請替換為目標服務所在地域和服務名稱。
client := eas.NewPredictClient("pai-eas-vpc.cn-shanghai.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)
}
}
}
自行實現調用邏輯
推薦您使用PAI提供的官方SDK來進行直連訪問,如果您有特殊業務場景的需求,需要使用其他語言或希望自己編寫調用邏輯,則可以參見如下方法,自行實現直連訪問功能,采用HTTP接口調用。EAS提供服務發現機制,在VPC環境中,通過如下地址即可獲得服務的后端地址列表。
地域 | 地址 |
華東2(上海) | http://pai-eas-vpc.cn-shanghai.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
華北2(北京) | http://pai-eas-vpc.cn-beijing.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
華東1(杭州) | http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/ |
例如訪問華東1(杭州)的mnist_saved_model_example服務(該服務有兩個Instance),示例如下。
$curl http://pai-eas-vpc.cn-hangzhou.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
獲得的服務后端地址列表如下。
{
"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
}
]
}
}
如上所示,通過服務發現可以獲得客戶模型服務mnist_saved_model_example的兩個實例的ip、port及weight信息。相關的IP在用戶部署服務時選擇的VPC中即可直接連通。
對于通過服務發現來進行直連訪問的方法請參考如下步驟:
客戶端代碼中建立后臺線程,定時訪問上述的服務發現服務,建議每5秒訪問一次,獲取當前服務最新的實例列表,并將其保存在本地緩存中。
在發起推理請求時,從本地緩存中獲取一個實例IP+端口發起訪問,可使用Weighted Round Robin算法進行獲取,也可根據自己的業務邏輯來進行選擇。
發起請求時,如遇連接失敗等情況,則表示服務實例可能發生異常(如用戶實例發生crash等),客戶端需要進行重試,重新從緩存中獲取一個新的實例,在本地緩存中實例數多于1的情況下,新IP+Port組合應該避免與已經失敗的IP+Port相同,即確保更換一個實例進行重試。
在使用服務發現進行直連訪問時,請遵循下面幾條原則,否則可能導致服務訪問異常:
服務發現服務是一個旁路的服務,不可在每次發起請求時對服務發現服務進行請求。
訪問服務發現服務時,在返回狀態碼為200且返回實例數不為空時,再更新緩存,返回非200時,千萬不能清空緩存。
直連的方式負載均衡和重試邏輯都需要在客戶端側完成,穩定性依賴客戶端實現,平臺側不負責直連場景的客戶端請求容錯,在實現時請嚴格遵循上述的步驟來實現容錯邏輯,否則平臺側無法保障SLA。
完整的實現流程,請參見Python SDK的實現。
相關文檔
更多的服務調用方式,請參見調用方式概覽。