A conexão direta VPC é um método de alto desempenho para chamar services. Ela permite que clientes dentro de uma Virtual Private Cloud (VPC) acessem instâncias de service do PAI-EAS diretamente, sem passar por gateways públicos. Este tópico explica o funcionamento, a configuração e fornece instruções detalhadas para chamar um service usando os sdks oficiais ou crie um cliente personalizado.
Visão geral
Casos de uso
Requisitos de alto desempenho: Para services com alto tráfego e grande volume de consultas por segundo (QPS), como reconhecimento de imagem ou fala, a conexão direta melhora significativamente o desempenho de acesso.
Aplicações sensíveis à latência: Em services que exigem tempos de resposta rápidos, como recomendação online e controle de risco financeiro, a conexão direta reduz efetivamente a latência.
Como funciona
A conexão direta VPC baseia-se em dois mecanismos:
Conectividade de rede: Após configure uma VPC para um service, o PAI-EAS cria e anexa uma interface de rede elástica auxiliar gratuita para cada instância de service na VPC e no vSwitch especificados. Isso estabelece um caminho de rede direto entre a VPC e as instâncias de service do PAI-EAS. Consequentemente, os clientes dentro da VPC acessam as instâncias de service do PAI-EAS diretamente, sem passar por um gateway, evitando o encaminhamento de rede de camada 4 do slb e de camada 7.
Descoberta de service: O PAI-EAS oferece um mecanismo de descoberta de service que permite aos clientes obter uma lista em tempo real de pares
IP:PORTde todas as instâncias de service. Os clientes usam essa lista para implementar balanceamento de carga e failover.
Acesso entre regiões e faturamento
P: Qual a diferença entre o acesso interno VPC entre regiões e o acesso pela rede pública?
A principal diferença depende do seu tipo de gateway:
Gateway dedicado: Além de estabelecer a conectividade da VPC, execute etapas adicionais de configuração relacionadas ao CEN no PAI-EAS. Para mais informações, consulte Cross-VPC access to a dedicated gateway using CEN.
P: O acesso interno VPC entre regiões gera custos de tráfego? Por que ainda é recomendado?
Sim, o tráfego de rede interna entre regiões incorre em taxas. Apesar disso, o acesso interno pela VPC é recomendado para ambientes de produção pelos seguintes motivos:
Segurança: O tráfego não passa pela internet pública, eliminando riscos de exposição externa.
Desempenho: Menor latência e conexões mais estáveis em comparação ao acesso pela rede pública.
Eficiência de custos: Os custos de tráfego de rede interna entre regiões geralmente são menores que os custos de tráfego de saída pela rede pública.
Pré-requisitos
Antes de começar, certifique-se de ter configurado uma VPC para o seu service. Para mais informações, consulte Network configuration.
Cada interface de rede elástica consome um endereço IP do vSwitch. Verifique se o vSwitch possui endereços IP disponíveis suficientes para todas as instâncias de service.
-
Configure regras de grupo de segurança para gerencie o isolamento de rede e o controle de acesso.
ImportanteAs regras de grupo de segurança controlam o acesso à rede entre clientes, como instâncias ECS, e os services do PAI-EAS.
Por padrão, instâncias no mesmo grupo de segurança básico podem se comunicar pela rede interna. Coloque o cliente e o service do PAI-EAS no mesmo grupo de segurança.
Se o cliente e o service do PAI-EAS precisarem usar grupos de segurança diferentes, configure regras para permitir a comunicação entre eles. Para mais informações, consulte Allow access between instances in different security groups in a classic network.
Configuração de endpoint estável para services com múltiplas réplicas
Quando seu service escala para múltiplas réplicas, os IPs das instâncias de backend podem mudar. Utilize as abordagens a seguir para manter um endereço de conexão estável.
Princípio subjacente: O PAI-EAS usa o slb (Server Load Balancer) para expor um Service Endpoint unificado para cada service. Independentemente de quantas réplicas de backend estejam em execução, os clientes precisam se conectar apenas a este único endereço — não é necessário rastrear alterações individuais de IP das instâncias.
Opção 1 (Recomendada): Use o domínio público com uma lista de permissões de IP de backend. Configure o backend para permitir tráfego apenas do intervalo de IPs da sua VPC par. Isso fornece um endereço de domínio estável sem configuração adicional de dns.
Opção 2: Configure o Alibaba Cloud PrivateZone na sua VPC par para resolver um domínio personalizado para o endereço IP privado do PAI-EAS. Observe que, se o endereço IP mudar, atualize o registro dns ou integre um mecanismo de descoberta de service para manter a resolução atualizada.
Chamar outros services EAS a partir de um contêiner EAS
Se o seu service EAS precisar chamar outro service EAS de dentro do seu contêiner, observe o seguinte:
Erros 401 ou falhas de conexão: Geralmente ocorrem quando uma aplicação em contêiner chama outro service EAS usando um endpoint público. As causas comuns são restrições de rede no ambiente do contêiner ou configuração incorreta de token.
Abordagem recomendada: Use o endereço interno da VPC para chamadas entre services. Isso garante conectividade e melhora a segurança.
Alternativa: Se for obrigatório usar um endpoint público, configure um gateway dedicado. Note que isso envolve custos adicionais de ALB.
Requisito de autenticação: Independentemente do tipo de endereço utilizado, cada requisição deve incluir um token de Authorization válido no cabeçalho da requisição.
Chamar services usando um sdk oficial (Recomendado)
Lógica principal
Ao usar uma conexão direta VPC, o cliente ignora o gateway e se conecta diretamente às instâncias de service. Isso significa que o cliente é responsável por lidar com a descoberta de service, balanceamento de carga e nova tentativa após falha. Os sdks oficiais do PAI-EAS encapsulam essa lógica para você:
Descoberta de service: O sdk inicia uma thread em segundo plano durante a inicialização para chamar periodicamente a API de descoberta de service do PAI-EAS. Ele recupera e armazena em cache uma lista de pares
IP:PORTe pesos das instâncias de backend. Se a chamada à API falhar, o sdk continua usando a última lista em cache para garantir a disponibilidade.Balanceamento de carga: Para cada requisição, o sdk selecione uma instância alvo do cache local usando um algoritmo de round-robin ponderado. Os pesos são determinados pelos pesos das instâncias retornados pela API de descoberta de service.
Nova tentativa após falha: Se uma requisição falhar devido a erro de rede, tempo limite de conexão ou resposta 5xx, o sdk tenta novamente a requisição em uma instância diferente do cache local. Em uma implantação com múltiplas instâncias, isso evita que uma única instância defeituosa cause falhas nas requisições.
Se você planeja crie um cliente personalizado sem usar um sdk, implemente capacidades equivalentes. Para mais informações, consulte Build a custom client.
Exemplos
Python sdk
-
Instale ou atualize o sdk.
pip install -U eas-prediction --userPara mais informações, consulte Python sdk guide.
-
Escreva o código de invocação.
O código a seguir apresenta um exemplo de programa que usa strings como entrada e saída. Para exemplos com outros formatos de entrada e saída, como TensorFlow ou PyTorch, consulte Python sdk guide.
#!/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 # Replace with the actual endpoint in the format {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com. # Uid is your Alibaba Cloud account ID, and RegionId is the region ID of your PAI-EAS service. ENDPOINT = "123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com" # Replace with your PAI-EAS service name. SERVICE_NAME = "mnist_saved_model_example" # Replace with your service token. You can find the token on the service details page. We recommend managing tokens using environment variables or Key Management Service (KMS). TOKEN = "M2FhNjJlZDBmMzBmMzE4NjFiNzZhMmUxY2IxZjkyMDczNzAzYjFi****" if __name__ == '__main__': client = PredictClient(ENDPOINT, SERVICE_NAME) client.set_token(TOKEN) client.set_endpoint_type(ENDPOINT_TYPE_DIRECT) # Access the service over the direct connection. 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)Onde:
O construtor
client = PredictClient()aceita o endpoint de conexão direta VPC e o nome do service como argumentos.Endpoint de conexão direta VPC: Este endpoint é específico da região e usa o formato
{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com.{Uid}é o ID da sua conta Alibaba Cloud. Por exemplo, o endpoint de conexão direta VPC para China (Shanghai) é123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com.TOKEN: Você encontra o token em Invocation Information na página de detalhes do service.
Java sdk
-
Adicione a dependência Maven.
Para usar o EAS Java sdk no seu projeto Maven, adicione a dependência eas-sdk à seção <dependencies> do seu arquivo pom.xml. Para a versão mais recente, verifique o repositório Maven.
<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.20</version> </dependency>Para mais informações, consulte Java sdk guide.
-
Escreva o código de invocaçã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 { // To ensure the client object is shared correctly, create and initialize it at startup. Do not create a new client for each request. PredictClient client = new PredictClient(new HttpConfig()); // Replace with your service token. You can find the token under Invocation Information on the service details page. client.setToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****"); // For direct connections, use the setDirectEndpoint method with a domain name in the format {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com. Replace {Uid} with your account ID. For example, the region ID for China (Shanghai) is cn-shanghai. client.setDirectEndpoint("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com"); // Replace with your service name. client.setModelName("scorecard_pmml_example"); // Define the input string. String request = "[{\"money_credit\": 3000000}, {\"money_credit\": 10000}]"; System.out.println(request); // Get the string response from PAI-EAS. try { String response = client.predict(request); System.out.println(response); } catch (Exception e) { e.printStackTrace(); } // Shut down the client. client.shutdown(); return; } }
Go sdk
Ao usar o Go sdk, o gerenciador de pacotes Go baixa automaticamente o código-fonte do sdk do GitHub durante a compilação. Não é necessário instalá-lo previamente. Para mais informações sobre o uso do Go sdk, consulte Go sdk guide.
O código a seguir mostra como chamar um service usando o Go sdk:
package main
import (
"fmt"
"github.com/pai-eas/eas-golang-sdk/eas"
)
func main() {
// Use the endpoint in the format {Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com. Replace {Uid} with your account ID and specify the service region and name. For example, the region ID for China (Shanghai) is cn-shanghai.
client := eas.NewPredictClient("123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
// Replace with your service token. You can find the token under Invocation Information on 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)
}
}
}
Crie um cliente personalizado
Caso precise usar outra linguagem de programação ou tenha requisitos personalizados, siga estas diretrizes para implementar a lógica de invocação HTTP.
Ao crie um cliente personalizado, você é responsável por lidar com lógicas complexas de tolerância a falhas, incluindo descoberta de service, balanceamento de carga e novas tentativas após falha. A implementação do seu cliente afeta diretamente a disponibilidade do service. Recomendamos fortemente o uso de um sdk oficial. O Acordo de Nível de Serviço (SLA) da plataforma não cobre interrupções de service causadas por clientes implementados incorretamente.
API de descoberta de service
O PAI-EAS fornece uma API HTTP para descoberta de service dentro da VPC configurada. A API retorna uma lista de endereços IP, portas e pesos de todas as instâncias de backend de um service.
URL:
http://<Your Alibaba Cloud Account ID>.vpc.<RegionID>.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/<Service Name>Autenticação: Nenhum token é necessário. A API é acessível apenas de dentro da VPC configurada para o service.
Intervalo de polling: Esta é uma API de canal lateral e deve ser chamada periodicamente por uma tarefa em segundo plano, por exemplo, a cada 5 ou 10 segundos. Não chame esta API para cada requisição de inferência. Fazer isso degrada severamente o desempenho.
Exemplo:
O exemplo a seguir mostra como consultar um service chamado mnist_saved_model_example implantado em China (Hangzhou) com duas instâncias.
$curl http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
Substitua 123********** pelo ID da sua conta.
A resposta a seguir mostra uma lista de endereços de service de backend:
{
"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
}
]
}
}
Solução de problemas: Falhas de acesso ao domínio VPC
Sintoma: O domínio VPC está inacessível, mas o service pode ser acessado via endereço IP direto retornado pela API de descoberta de service.
Causa comum: Sintaxe incorreta do comando curl — por exemplo, a URL não está entre aspas, o que faz com que o shell interprete mal caracteres especiais como & ou ? na URL.
Solução: Coloque a URL entre aspas duplas e execute uma requisição de teste mínima via endereço IP ou domínio VPC para verifique a conectividade:
# Test using the VPC domain (URL must be enclosed in double quotes)
curl "http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/api/predict/your-service-name" \
-H "Authorization: your-token"
# Test using a direct IP address (replace with an IP from the service discovery API response)
curl "http://172.16.XX.XX:50000/api/predict/your-service-name" \
-H "Authorization: your-token"
Requisitos de implementação
Ao crie um cliente personalizado, você deve lidar com a descoberta de service, balanceamento de carga e novas tentativas após falha. Para uma implementação de referência completa, consulte o código-source do Python sdk. A seguir estão os principais requisitos de implementação:
-
Armazene a lista de instâncias em cache localmente e atualize-a periodicamente: Inicie uma thread em segundo plano para chamar periodicamente a API de descoberta de service, por exemplo, a cada 5 ou 10 segundos. Substitua a lista de instâncias em cache local pela lista retornada.
ImportanteA API de descoberta de service é um service de canal lateral. Não a chame para cada requisição de inferência. Se a chamada à API falhar ou retornar uma lista vazia, continue usando a lista em cache local. Não limpe o cache. Deixar de fazer isso tornará seu service indisponível.
Balanceie as requisições: Para cada requisição de inferência, selecione uma instância do cache local. Recomendamos o uso de um algoritmo round-robin ponderado, mas você também pode usar um algoritmo personalizado com base na sua lógica de negócios.
Tente novamente requisições com falha: Se uma requisição falhar devido a erro de conexão, tempo limite ou resposta 5xx, tente novamente a requisição em uma instância diferente do cache local. Isso requer pelo menos duas instâncias disponíveis.
Documentação relacionada
Para mais informações sobre métodos de invocação de service, consulte Invocation methods overview.