Conecte clientes diretamente às instâncias de serviço em uma VPC, ignorando o encaminhamento pelo gateway para reduzir a latência.
Como funciona
O EAS cria uma Elastic Network Interface (ENI) gratuita para cada instância de serviço e a anexa à VPC e ao vSwitch especificados, estabelecendo um caminho de rede direto sem encaminhamento por gateway.
O EAS fornece uma API de descoberta de serviço que retorna pares IP:PORT em tempo real para todas as instâncias de serviço. Os clientes consultam essa API para implementar balanceamento de carga e failover.
Pré-requisitos
Conclua estas tarefas antes de chamar um serviço por conexão direta VPC:
Implante um serviço EAS com a conexão direta VPC ativada. Para mais detalhes, consulte Network configuration.
Verifique se o vSwitch tem endereços IP disponíveis suficientes. Cada ENI requer um endereço IP. A quantidade de IPs disponíveis deve ser igual ou superior ao número de instâncias.
Configure regras de grupo de segurança para permitir o tráfego entre os clientes e as instâncias de serviço.
As regras de grupo de segurança controlam o acesso à rede entre clientes (como instâncias ECS) e instâncias de serviço:
Por padrão, instâncias em um grupo de segurança básico podem se comunicar pela rede interna. Ao configurar a conexão direta VPC, selecione o grupo de segurança que contém as instâncias ECS que precisam de acesso.
Para usar grupos de segurança diferentes, configure regras de grupo de segurança para permitir a comunicação entre as instâncias. Consulte Allow access between instances in different security groups in a classic network.
Formato do endpoint
Os endpoints de conexão direta VPC seguem este formato:
{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com
|
Parâmetro |
Descrição |
Exemplo |
|
|
ID da conta Alibaba Cloud |
|
|
|
Região onde o serviço está implantado |
|
Exemplo: 123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com
Chamar o serviço usando SDKs (recomendado)
Os SDKs do EAS gerenciam automaticamente a descoberta de serviço, o balanceamento de carga e as tentativas de failover. Use um SDK para garantir chamadas confiáveis por conexão direta VPC.
Python SDK
-
Instale ou atualize o SDK:
pip install -U eas-prediction --user -
Chame o serviço usando o formato de requisição TensorFlow. Para outros formatos, consulte Python SDK guide.
O construtor
PredictClientrequer o endpoint de conexão direta VPC e o nome do serviço. Chameset_endpoint_type(ENDPOINT_TYPE_DIRECT)para ativar a conexão direta VPC e, em seguida, chameinit()para inicializar.#!/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 # VPC direct connection endpoint: {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com # Replace with your account ID and region ENDPOINT = "123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com" # Replace with your EAS service name SERVICE_NAME = "mnist_saved_model_example" # Replace with your service token from the service details page # Store tokens in environment variables or KMS, not in code TOKEN = "M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****" if __name__ == '__main__': client = PredictClient(ENDPOINT, SERVICE_NAME) client.set_token(TOKEN) client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # Enable VPC direct connection client.init() req = TFRequest('predict_images') req.add_feed('images', [1, 784], TFRequest.DT_FLOAT, [1] * 784) resp = client.predict(req) print(resp)
Java SDK
-
Adicione a dependência Maven ao arquivo
pom.xml. Para obter a versão mais recente, consulte o Maven repository. Para mais detalhes, consulte Java SDK guide.<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.20</version> </dependency> -
Chame o serviço.
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 { // Create and initialize the client once at startup // Do not create a new client for each request PredictClient client = new PredictClient(new HttpConfig()); // Replace with your service token from the service details page client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****"); // Set VPC direct connection endpoint: {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com // Replace with your account ID and region client.setDirectEndpoint("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com"); // Replace with your EAS service name client.setModelName("scorecard_pmml_example"); // Define input string String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]"; System.out.println(request); // Send prediction request try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // Shut down client when finished client.shutdown(); } }
Go SDK
O gerenciador de pacotes Go baixa o SDK automaticamente durante a compilação. Para mais detalhes, consulte Go SDK guide.
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// VPC direct connection endpoint: {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com
// Replace with your account ID, region, and service name
client := eas.NewPredictClient("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
// Replace with your service token from the service details page
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)
}
}
}
Criar um cliente personalizado
Se os SDKs não atenderem aos requisitos, implemente a lógica de invocação HTTP manualmente.
Clientes personalizados devem gerenciar a descoberta de serviço, o balanceamento de carga e as tentativas de failover. Uma implementação inadequada afeta diretamente a disponibilidade do serviço. O SLA da plataforma não cobre interrupções causadas por implementações de clientes personalizados. Sempre que possível, use um SDK.
API de descoberta de serviço
O EAS oferece uma API HTTP para descoberta de serviço dentro da VPC configurada. Essa API retorna endereços IP, portas e pesos de todas as instâncias de backend de um serviço.
|
Propriedade |
Detalhes |
|
URL |
|
|
Autenticação |
Não necessária. Acessível apenas de dentro da VPC configurada. |
|
Intervalo de consulta |
Chame a cada 5-10 segundos a partir de uma thread em segundo plano. |
A API de descoberta de serviço é um serviço de segundo plano. Não a chame para cada solicitação de inferência, pois chamadas frequentes degradam severamente o desempenho.
Exemplo de requisição:
Este exemplo consulta um serviço chamado mnist_saved_model_example implantado na China (Hangzhou). Substitua 123********** pelo ID da sua conta.
curl http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
Exemplo de resposta:
{
"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
}
]
}
}
Requisitos de implementação
Clientes personalizados confiáveis devem incluir três componentes principais:
Armazenar lista de instâncias em cache e atualizar periodicamente
Inicie uma thread em segundo plano que consulte a API de descoberta de serviço a cada 5-10 segundos.
Em caso de sucesso (HTTP 200 com lista de instâncias não vazia): Sobrescreva o cache local com a nova lista.
Em caso de falha (timeout, status diferente de 200 ou lista vazia): Continue usando o cache local. Não limpe o cache. Isso preserva a disponibilidade do serviço durante falhas transitórias.
Balancear requisições entre as instâncias
Ao enviar uma requisição, selecione uma instância de destino no cache local. Use um algoritmo como round-robin ponderado ou selecione instâncias com base na lógica de negócios.
Tentar novamente requisições com falha em instâncias diferentes
Se a conexão com uma instância falhar (por exemplo, devido a uma queda da instância), tente a requisição novamente. Caso o cache local contenha múltiplas instâncias, selecione uma instância diferente para a nova tentativa.
Para uma implementação de referência completa, consulte o Python SDK source code.