Connectez directement les clients aux instances de service au sein d'un VPC, en contournant la redirection par passerelle pour réduire la latence.
Fonctionnement
EAS crée une interface réseau élastique (ENI) gratuite pour chaque instance de service et l'attache au VPC et au vSwitch que vous spécifiez, établissant ainsi un chemin réseau direct sans redirection par passerelle.
EAS fournit une API de découverte de service qui renvoie en temps réel des paires IP:PORT pour toutes les instances de service. Les clients interrogent cette API pour mettre en œuvre l'équilibrage de charge et le basculement.
Prérequis
Effectuez les tâches suivantes avant d'appeler un service via une connexion directe VPC :
Déployez un service EAS avec la connexion directe VPC activée. Pour plus de détails, consultez la rubrique Configuration réseau.
Assurez-vous que le vSwitch dispose de suffisamment d'adresses IP disponibles. Chaque ENI nécessite une adresse IP. Le nombre d'IP disponibles doit être supérieur ou égal au nombre d'instances.
Configurez les règles du groupe de sécurité pour autoriser le trafic entre les clients et les instances de service.
Les règles du groupe de sécurité contrôlent l'accès réseau entre les clients (tels que les instances ECS) et les instances de service :
Par défaut, les instances d'un groupe de sécurité de base peuvent communiquer via le réseau interne. Lors de la configuration de la connexion directe VPC, sélectionnez le groupe de sécurité contenant les instances ECS nécessitant un accès.
Pour utiliser différents groupes de sécurité, configurez les règles afin d'autoriser la communication entre les instances. Consultez la rubrique Autoriser l'accès entre des instances situées dans différents groupes de sécurité d'un réseau classique.
Format du point de terminaison
Les points de terminaison de connexion directe VPC respectent le format suivant :
{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com
| Paramètre | Description | Exemple |
|---|---|---|
{Uid} |
ID du compte Alibaba Cloud | 123********** |
{RegionId} |
Région où le service est déployé | cn-shanghai |
Exemple : 123**********.vpc.cn-shanghai.pai-eas.aliyuncs.com
Appeler le service à l'aide des SDK (recommandé)
Les SDK EAS gèrent automatiquement la découverte de service, l'équilibrage de charge et les nouvelles tentatives en cas de basculement. Utilisez un SDK pour des appels fiables via une connexion directe VPC.
Python SDK
-
Installez ou mettez à niveau le SDK :
pip install -U eas-prediction --user -
Appelez le service en utilisant le format de requête TensorFlow. Pour les autres formats, consultez le Guide du SDK Python.
Le constructeur
PredictClientnécessite le point de terminaison de connexion directe VPC et le nom du service. Appelezset_endpoint_type(ENDPOINT_TYPE_DIRECT)pour activer la connexion directe VPC, puis appelezinit()pour initialiser.#!/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
-
Ajoutez la dépendance Maven au fichier
pom.xml. Pour obtenir la dernière version, consultez le dépôt Maven. Pour plus de détails, voir le Guide du SDK Java.<dependency> <groupId>com.aliyun.openservices.eas</groupId> <artifactId>eas-sdk</artifactId> <version>2.0.20</version> </dependency> -
Appelez le service.
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
Le gestionnaire de packages Go télécharge automatiquement le SDK lors de la compilation. Pour plus de détails, consultez le Guide du SDK Go.
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)
}
}
}
Créer un client personnalisé
Si les SDK ne répondent pas à vos besoins, implémentez vous-même la logique d'invocation HTTP.
Les clients personnalisés doivent gérer la découverte de service, l'équilibrage de charge et les nouvelles tentatives en cas de basculement. Une mauvaise implémentation affecte directement la disponibilité du service. Le SLA de la plateforme ne couvre pas les interruptions de service causées par des implémentations de clients personnalisés. Utilisez un SDK chaque fois que possible.
API de découverte de service
EAS fournit une API HTTP pour la découverte de service au sein du VPC configuré. L'API renvoie les adresses IP, les ports et les poids de toutes les instances backend d'un service.
| Propriété | Détails |
|---|---|
| URL | http://{Uid}.vpc.{RegionId}.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/{ServiceName} |
| Authentification | Aucune authentification requise. Accessible uniquement depuis le VPC configuré. |
| Intervalle d'interrogation | Appelez l'API toutes les 5 à 10 secondes depuis un thread d'arrière-plan. |
L'API de découverte de service est un service d'arrière-plan. Ne l'appelez pas pour chaque requête d'inférence, car des appels fréquents dégradent considérablement les performances.
Exemple de requête :
Cet exemple interroge un service nommé mnist_saved_model_example déployé en Chine (Hangzhou). Remplacez 123********** par votre ID de compte.
curl http://123**********.vpc.cn-hangzhou.pai-eas.aliyuncs.com/exported/apis/eas.alibaba-inc.k8s.io/v1/upstreams/mnist_saved_model_example
Exemple de réponse :
{
"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
}
]
}
}
Exigences d'implémentation
Des clients personnalisés fiables doivent inclure trois composants principaux :
Mettre en cache la liste des instances et actualiser périodiquement
Démarrez un thread d'arrière-plan qui interroge l'API de découverte de service toutes les 5 à 10 secondes.
En cas de succès (HTTP 200 avec une liste d'instances non vide) : Écrasez le cache local avec la nouvelle liste.
En cas d'échec (délai dépassé, statut différent de 200 ou liste vide) : Continuez à utiliser le cache local. Ne videz pas le cache. Cela préserve la disponibilité du service lors de pannes transitoires.
Équilibrer la charge des requêtes entre les instances
Lors de l'envoi d'une requête, sélectionnez une instance cible à partir du cache local. Utilisez un algorithme tel que le round-robin pondéré, ou sélectionnez les instances en fonction de la logique métier.
Retenter les requêtes ayant échoué sur différentes instances
Si la connexion à une instance échoue (par exemple, en raison d'un crash de l'instance), retentez la requête. Si le cache local contient plusieurs instances, sélectionnez une autre instance pour la nouvelle tentative.
Pour une implémentation de référence complète, consultez le code source du SDK Python.