Tous les produits
Search
Centre de documentation

Platform For AI:SDK pour Go

Dernière mise à jour :Aug 09, 2026

Ce guide décrit les API du SDK officiel pour Go et fournit des exemples de code complets pour les formats d'entrée et de sortie courants.

Remarque

Pour plus d'informations sur les cas d'utilisation du SDK et les principes d'appel, consultez la rubrique SDK d'appel de service.

Prérequis

Lorsque vous appelez un service d'inférence à l'aide du SDK pour Go, le gestionnaire de packages Go télécharge automatiquement le code source du SDK depuis GitHub lors de la compilation. Il n'est pas nécessaire d'installer le SDK au préalable. Si vous devez personnaliser la logique d'appel, téléchargez le code source du SDK pour Go et modifiez-le localement.

Pour importer le SDK, utilisez le code suivant :

import (
    "github.com/pai-eas/eas-golang-sdk/eas"
)

Démarrage rapide

Sélectionnez la classe Request correspondant au format des données d'entrée de votre modèle. L'exemple ci-dessous illustre un appel minimal de bout en bout utilisant une requête sous forme de chaîne de caractères.

package main

import (
    "fmt"
    "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "my_service")
    client.SetToken("YOUR_SERVICE_TOKEN")
    client.Init()

    resp, err := client.StringPredict("[{}]")
    if err != nil {
        fmt.Printf("failed to predict: %v\n", err.Error())
    } else {
        fmt.Printf("%v\n", resp)
    }
}

Référence de l'API

Le SDK pour Go met à disposition les classes suivantes, regroupées par fonctionnalité :

Groupe

Description

Client principal

PredictClient : configure les informations relatives au service telles que l'endpoint, le nom du service et le token, envoie des requêtes et reçoit les réponses.

Entrée et sortie

  • TFRequest / TFResponse : encapsule les requêtes et les réponses pour les modèles TensorFlow.

  • TorchRequest / TorchResponse : encapsule les requêtes et les réponses pour les modèles PyTorch.

  • Pour les scénarios basés sur des chaînes de caractères, aucune classe Request ou Response dédiée n'est requise. Transmettez directement une chaîne à la méthode StringPredict() et recevez une réponse sous forme de chaîne.

Service de file d'attente

  • QueueClient : client de file d'attente asynchrone utilisé pour envoyer des données, s'abonner aux envois de données et interroger l'état de la file d'attente.

  • types.Watcher : observateur, créé par QueueClient.Watch(), qui reçoit les données envoyées.

PredictClient

Classe cliente principale utilisée pour configurer les informations du service, envoyer des requêtes et recevoir les résultats de prédiction.

Méthode

Description

NewPredictClient(endpoint string, serviceName string) *PredictClient

  • Crée un objet PredictClient.

  • Paramètres :

    • endpoint : obligatoire. Adresse de l'endpoint du serveur. Pour un service standard, définissez ce paramètre sur l'endpoint de la passerelle par défaut.

    • serviceName : obligatoire. Nom du service.

  • Renvoie un objet PredictClient.

SetEndpoint(endpointName string)

  • Définit l'endpoint du service.

  • endpointName spécifie l'adresse de l'endpoint du serveur. Pour un service standard, définissez ce paramètre sur l'endpoint de la passerelle par défaut.

SetServiceName(serviceName string)

  • Définit le nom du service à appeler.

  • serviceName spécifie le nom du service à appeler.

SetEndpointType(endpointType string)

  • Définit le type de passerelle pour le serveur.

  • endpointType spécifie le type de passerelle. Le système prend en charge les types de passerelle suivants :

    • "DEFAULT" : passerelle par défaut. Ce type est utilisé si aucun type de passerelle n'est spécifié.

    • "DIRECT" : accède au service via un canal de connexion directe haut débit.

SetToken(token string)

  • Définit le token d'accès au service.

  • token spécifie le token d'authentification utilisé pour accéder au service.

SetHttpTransport(transport *http.Transport)

  • Définit la propriété Transport du client HTTP.

  • transport spécifie l'objet Transport utilisé lors de l'envoi de requêtes HTTP.

SetRetryCount(max_retry_count int)

  • Définit le nombre de tentatives pour les requêtes ayant échoué.

  • max_retry_count spécifie le nombre de tentatives en cas d'échec d'une requête. La valeur par défaut est 5.

    Important

    Les requêtes sont automatiquement relancées en cas d'échec dû à une erreur de processus serveur, à une erreur serveur ou à une interruption de la connexion persistante à la passerelle. Par conséquent, ne définissez pas ce paramètre sur 0.

SetTimeout(timeout int)

  • Définit le délai d'expiration de la requête.

  • timeout spécifie la durée du délai d'expiration de la requête en millisecondes (ms). La valeur par défaut est 5000.

Init()

Initialise l'objet PredictClient. Après avoir défini les paramètres à l'aide des méthodes précédentes, vous devez appeler Init() pour appliquer les modifications.

Predict(request Request) Response

  • Soumet une requête de prédiction à un service d'inférence.

  • Paramètre : un objet implémentant l'interface Request, tel que StringRequest, TFRequest ou TorchRequest.

  • Valeur renvoyée : un objet implémentant l'interface Response, tel que StringResponse, TFResponse ou TorchResponse.

StringPredict(request string) string

  • Soumet une requête de prédiction sous forme de chaîne à un service d'inférence.

  • request spécifie la chaîne de requête à envoyer.

  • Renvoie une chaîne contenant la réponse du service.

TorchPredict(request TorchRequest) TorchResponse

  • Soumet une requête de prédiction PyTorch à un service d'inférence.

  • request spécifie un objet de la classe TorchRequest.

  • Renvoie l'objet TorchResponse correspondant.

TFPredict(request TFRequest) TFResponse

  • Soumet une requête de prédiction TensorFlow à un service d'inférence.

  • request spécifie un objet de la classe TFRequest.

  • Renvoie l'objet TFResponse correspondant.

TFRequest

Construit les données d'entrée pour les modèles TensorFlow.

Méthode

Description

TFRequest(signatureName string)

  • Crée un objet TFRequest.

  • signatureName spécifie le Signature Name du modèle demandé.

AddFeed(?)(inputName string, shape []int64{}, content []?)

  • Spécifie un tenseur d'entrée pour la requête de service TensorFlow.

  • Paramètres :

    • inputName : alias du tenseur d'entrée.

    • shape : TensorShape du tenseur d'entrée.

    • content : contenu du tenseur d'entrée, aplati en un tableau unidimensionnel. Les types pris en charge incluent INT32, INT64, FLOAT32, FLOAT64, STRING et BOOL. Le nom de la méthode indique le type de données (par exemple, AddFeedInt32()). Pour les autres types de données, vous devez construire la requête au format PB en vous référant au code source.

AddFetch(outputName string)

  • Spécifie l'alias d'un tenseur de sortie à récupérer.

  • outputName spécifie l'alias du tenseur de sortie à récupérer.

    Pour un modèle SavedModel, ce paramètre est facultatif. S'il n'est pas défini, toutes les sorties sont renvoyées.

    Pour un modèle gelé (frozen model), ce paramètre est obligatoire.

TFResponse

Analyse les données de sortie des modèles TensorFlow.

Méthode

Description

GetTensorShape(outputName string) []int64

  • Récupère le TensorShape du tenseur de sortie pour l'alias spécifié.

  • outputName spécifie l'alias du tenseur dont vous souhaitez récupérer la forme de sortie.

  • Valeur renvoyée : la forme du tenseur, chaque dimension étant représentée dans un tableau.

Get(?)Val(outputName string) [](?)

  • Récupère le vecteur de données du tenseur de sortie. La sortie est un tableau unidimensionnel. Utilisez cette méthode conjointement avec la méthode GetTensorShape() pour reconstruire le tenseur multidimensionnel. Les types pris en charge incluent FLOAT, DOUBLE, INT, INT64, STRING et BOOL. Le nom de la méthode indique le type de données, par exemple GetFloatVal().

  • outputName spécifie l'alias du tenseur dont vous souhaitez récupérer les données de sortie.

  • Valeur renvoyée : un tableau unidimensionnel contenant les données aplaties du tenseur de sortie.

TorchRequest

Construit les données d'entrée pour les modèles PyTorch.

Méthode

Description

TorchRequest()

Crée un objet TorchRequest.

AddFeed(?)(index int, shape []int64{}, content []?)

  • Spécifie un tenseur d'entrée pour la requête de service PyTorch.

  • Paramètres :

    • index : index du tenseur d'entrée.

    • shape : TensorShape du tenseur d'entrée.

    • content : contenu du tenseur d'entrée, aplati en un tableau unidimensionnel. Les types pris en charge incluent INT32, INT64, FLOAT32 et FLOAT64. Le nom de la méthode indique le type de données (par exemple, AddFeedInt32()). Pour les autres types de données, vous devez construire la requête au format PB en vous référant au code source.

AddFetch(outputIndex int)

  • Spécifie par son index un tenseur de sortie à récupérer. Cette méthode est facultative. Si vous n'appelez pas cette méthode, toutes les sorties sont renvoyées.

  • outputIndex spécifie l'index du tenseur de sortie.

TorchResponse

Analyse les données de sortie des modèles PyTorch.

Méthode

Description

GetTensorShape(outputIndex int) []int64

  • Récupère le TensorShape du tenseur de sortie pour l'index spécifié.

  • outputIndex spécifie l'index du tenseur de sortie.

  • Valeur renvoyée : la forme du tenseur, chaque dimension étant représentée dans un tableau.

Get(?)Val(outputIndex int) [](?)

  • Récupère le vecteur de données du tenseur de sortie. La sortie est un tableau unidimensionnel. Utilisez cette méthode conjointement avec la méthode GetTensorShape() pour reconstruire le tenseur multidimensionnel. Les types pris en charge incluent FLOAT, DOUBLE, INT et INT64. Le nom de la méthode indique le type de données, par exemple GetFloatVal().

  • outputIndex spécifie l'index du tenseur dont vous souhaitez récupérer les données de sortie.

  • Valeur renvoyée : un tableau unidimensionnel contenant les données aplaties du tenseur de sortie.

QueueClient

Interagit avec le service de file d'attente EAS pour produire, consommer et gérer les données.

Méthode

Description

NewQueueClient(endpoint, queueName, token string) (*QueueClient, error)

  • Crée un objet QueueClient.

  • Paramètres :

    • endpoint : adresse de l'endpoint du serveur.

    • queueName : nom du service de file d'attente.

    • token : token du service de file d'attente.

  • Renvoie un objet QueueClient et une erreur, le cas échéant.

Truncate(ctx context.Context, index uint64) error

  • Tronque les données de la file d'attente situées avant l'index spécifié, en ne conservant que les données à partir de cet index.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • index : index des données à tronquer dans la file d'attente.

Put(ctx context.Context, data []byte, tags types.Tags) (index uint64, requestId string, err error)

  • Écrit un enregistrement dans la file d'attente.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • data : contenu des données à écrire dans la file d'attente.

  • Valeurs renvoyées :

    • index : index de l'enregistrement de données actuel dans la file d'attente. Vous pouvez utiliser cet index pour interroger les données de la file d'attente.

    • requestId : ID de requête généré automatiquement pour l'enregistrement de données. Cet ID est un tag spécial que vous pouvez également utiliser pour interroger l'enregistrement.

GetByIndex(ctx context.Context, index uint64) (dfs []types.DataFrame, err error)

  • Récupère un enregistrement de la file d'attente par son index. L'enregistrement est automatiquement supprimé de la file d'attente lors de sa récupération.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • index : index des données à interroger dans la file d'attente.

  • dfs : résultat de la requête, encapsulé sous forme d'objet DataFrame.

GetByRequestId(ctx context.Context, requestId string) (dfs []types.DataFrame, err error)

  • Récupère un enregistrement de la file d'attente par son ID de requête. L'enregistrement est automatiquement supprimé de la file d'attente lors de sa récupération.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • requestId : ID de requête des données à interroger dans la file d'attente.

  • dfs : résultat de la requête, encapsulé sous forme d'objet DataFrame.

Get(ctx context.Context, index uint64, length int, timeout time.Duration, autoDelete bool, tags types.Tags) (dfs []types.DataFrame, err error)

  • Interroge les données de la file d'attente selon des conditions spécifiées. Les méthodes GetByIndex() et GetByRequestId() sont des wrappers simples de la méthode Get().

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • index : index de départ des données à interroger.

    • length : nombre d'enregistrements de données à interroger. Un maximum de length enregistrements à partir de index (inclus) est renvoyé.

    • timeout : temps d'attente pour la requête. Si length enregistrements deviennent disponibles pendant cette période, l'appel retourne immédiatement. Sinon, l'appel retourne une fois la durée d'expiration atteinte.

    • autoDelete : valeur booléenne indiquant s'il faut supprimer automatiquement les données interrogées de la file d'attente. Si la valeur est false, les données peuvent être interrogées plusieurs fois. Vous pouvez supprimer manuellement les données en appelant la méthode Del().

    • tags : interroge les données contenant des tags spécifiés. Ce paramètre est de type map[string]string. Le système parcourt length enregistrements à partir de l'index spécifié et renvoie les données contenant les tags spécifiés.

  • dfs : résultat de la requête, encapsulé sous forme d'objet DataFrame.

Del(ctx context.Context, indexes ...uint64)

  • Supprime les données possédant les index spécifiés de la file d'attente.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • indexes : liste des index des données à supprimer de la file d'attente.

Attributes() (attrs types.Attributes, err error)

  • Récupère les informations d'attribut de la file d'attente, y compris la longueur totale et la longueur actuelle des données.

  • attrs : informations d'attribut de la file d'attente, de type map[string]string.

Watch(ctx context.Context, index, window uint64, indexOnly bool, autocommit bool) (watcher types.Watcher, err error)

  • S'abonne aux données de la file d'attente. Le service de file d'attente envoie les données au client selon des conditions spécifiées.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • index : index de départ pour l'abonnement.

    • window : taille de la fenêtre d'abonnement. Il s'agit du nombre maximal d'enregistrements que le service de file d'attente peut envoyer à une seule instance client à la fois.

      Remarque

      Le serveur n'envoie pas de nouveaux enregistrements tant que les précédents n'ont pas été validés (commit). Si vous validez N enregistrements, le service de file d'attente envoie N autres enregistrements. Cela garantit que le client ne traite pas plus d'enregistrements que la taille de la fenêtre à tout moment et aide à limiter la concurrence.

    • indexOnly : valeur booléenne indiquant s'il faut envoyer uniquement les valeurs d'index.

    • autocommit : valeur booléenne indiquant s'il faut valider automatiquement un enregistrement après son envoi. Nous vous recommandons de définir ce paramètre sur false. Après avoir reçu et traité un enregistrement, validez-le manuellement. Si une instance tombe en panne avant la validation, le service de file d'attente redistribue les données non validées à d'autres instances pour traitement.

  • Valeur renvoyée : un objet watcher permettant de lire les données envoyées.

Commit(ctx context.Context, indexes ...uint64) error

  • Valide les enregistrements possédant les index spécifiés.

    Remarque

    La validation indique que les données envoyées par le service de file d'attente ont été traitées. Le service peut alors supprimer les données de la file d'attente et ne les enverra pas à d'autres instances.

  • Paramètres :

    • ctx : contexte de l'opération actuelle.

    • indexes : liste des index des données à valider dans la file d'attente.

types.Watcher

Lit les données envoyées depuis le canal d'abonnement du service de file d'attente.

Méthode

Description

FrameChan() <-chan types.DataFrame

  • Renvoie un objet channel. Les données envoyées depuis le serveur sont écrites dans ce channel, à partir duquel vous pouvez effectuer une boucle pour lire les données.

  • Valeur renvoyée : un objet channel pour la lecture des données envoyées.

Close()

Ferme un objet watcher et sa connexion de données backend.

Remarque

Un client ne peut avoir qu'un seul objet watcher actif à la fois. Vous devez fermer l'objet watcher actuel avant d'en créer un nouveau.

Exemples

Inférence synchrone par format

Choisissez l'exemple de code en fonction des types d'entrée et de sortie de votre service.

String

Si vous déployez un service avec un processeur personnalisé, vous l'appelez généralement à l'aide de chaînes, par exemple lors de l'appel d'un service de modèle PMML. Le programme suivant présente un exemple complet.

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
    client.SetToken("YWFlMDYyZDNmNTc3M2I3MzMwYmY0MmYwM2Y2MTYxMTY4NzBkNzdj****")
    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)
        }
    }
}

TensorFlow

Pour les modèles TensorFlow, utilisez respectivement TFRequest et TFResponse comme formats de données d'entrée et de sortie. Le programme suivant présente un exemple complet.

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "mnist_saved_model_example")
    client.SetToken("YTg2ZjE0ZjM4ZmE3OTc0NzYxZDMyNmYzMTJjZTQ1YmU0N2FjMTAy****")
    client.Init()

    tfreq := eas.TFRequest{}
    tfreq.SetSignatureName("predict_images")
    tfreq.AddFeedFloat32("images", []int64{1, 784}, make([]float32, 784))

    for i := 0; i < 100; i++ {
        resp, err := client.TFPredict(tfreq)
        if err != nil {
            fmt.Printf("failed to predict: %v", err)
        } else {
            fmt.Printf("%v\n", resp)
        }
    }
}

PyTorch

Pour les modèles PyTorch, utilisez respectivement TorchRequest et TorchResponse comme formats de données d'entrée et de sortie. Le programme suivant présente un exemple complet.

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    client := eas.NewPredictClient("182848887922****.cn-shanghai.pai-eas.aliyuncs.com", "pytorch_resnet_example")
    client.SetTimeout(500)
    client.SetToken("ZjdjZDg1NWVlMWI2NTU5YzJiMmY5ZmE5OTBmYzZkMjI0YjlmYWVl****")
    client.Init()
    req := eas.TorchRequest{}
    req.AddFeedFloat32(0, []int64{1, 3, 224, 224}, make([]float32, 150528))
    req.AddFetch(0)
    for i := 0; i < 10; i++ {
        resp, err := client.TorchPredict(req)
        if err != nil {
            fmt.Printf("failed to predict: %v", err)
        } else {
            fmt.Println(resp.GetTensorShape(0), resp.GetFloatVal(0))
        }
    }
}

Connexion directe VPC

Une connexion directe VPC vous permet d'accéder aux services déployés dans un groupe de ressources dédié Elastic Algorithm Service (EAS). Vous devez également connecter le groupe de ressources au vSwitch spécifié avant de pouvoir utiliser ce mode. Pour savoir comment acheter un groupe de ressources dédié EAS et configurer la connectivité réseau, consultez les rubriques Utiliser les groupes de ressources EAS et Configurer EAS pour accéder aux ressources publiques ou internes. Cette méthode diffère d'un appel standard car elle nécessite seulement une ligne de code supplémentaire : client.SetEndpointType(eas.EndpointTypeDirect). Ce mode est idéal pour les services à fort trafic et à haute concurrence. Voici un exemple de code :

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
)

func main() {
    // Format of a VPC direct connection endpoint: {uid}.vpc.{region-id}.pai-eas.aliyuncs.com. You can find the endpoint on the Invocation Information tab of the service details page in the EAS console.
    client := eas.NewPredictClient("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com", "scorecard_pmml_example")
    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)
        }
    }
}

Paramètres de connexion client

Vous pouvez définir les paramètres de connexion du client à l'aide de la propriété http.Transport. L'exemple suivant montre comment configurer ces paramètres :

package main

import (
        "fmt"
        "github.com/pai-eas/eas-golang-sdk/eas"
        "net/http"
        "time"
)

func main() {
    // Format of a VPC direct connection endpoint: {uid}.vpc.{region-id}.pai-eas.aliyuncs.com. You can find the endpoint on the Invocation Information tab of the service details page in the EAS console.
    client := eas.NewPredictClient("182848887922****.vpc.cn-shanghai.pai-eas.aliyuncs.com", "network_test")
    client.SetToken("MDAwZDQ3NjE3OThhOTI4ODFmMjJiYzE0MDk1NWRkOGI1MmVhMGI0****")
    client.SetEndpointType(eas.EndpointTypeDirect)
    client.SetHttpTransport(&http.Transport{
        MaxConnsPerHost:       300,
        TLSHandshakeTimeout:   100 * time.Millisecond,
        ResponseHeaderTimeout: 200 * time.Millisecond,
        ExpectContinueTimeout: 200 * time.Millisecond,
    })
}

Service de file d'attente

Vous pouvez utiliser QueueClient pour envoyer des données à un service de file d'attente, interroger des données, consulter l'état du service de file d'attente et vous abonner aux envois de données depuis ce service. Dans cet exemple, une goroutine envoie des données au service de file d'attente, tandis qu'une autre utilise un watcher pour s'abonner et recevoir ces données.

Remarque

Lorsque vous déployez un service d'inférence asynchrone dans EAS, une file d'attente d'entrée et une file d'attente de sortie sont générées automatiquement. Les adresses suivent généralement les formats ci-dessous :

File d'attente d'entrée : <domain>/api/predict/<service_name>

File d'attente de sortie : <domain>/api/predict/<service_name>/sink

Utilisez <service_name> ou <service_name>/sink pour créer le QueueClient selon vos besoins.

    const (
        QueueEndpoint = "182848887922****.cn-shanghai.pai-eas.aliyuncs.com"
        // For example, if the EAS service name is test_qservice, the input queue name is test_qservice, and the output queue name is test_qservice/sink.
        QueueName     = "test_qservice"
        QueueToken    = "YmE3NDkyMzdiMzNmMGM3ZmE4ZmNjZDk0M2NiMDA3OTZmNzc1MTUx****"
    )
    queue, err := NewQueueClient(QueueEndpoint, QueueName, QueueToken)

    // truncate all messages in the queue
    attrs, err := queue.Attributes()
    if index, ok := attrs["stream.lastEntry"]; ok {
        idx, _ := strconv.ParseUint(index, 10, 64)
        queue.Truncate(context.Background(), idx+1)
    }

    ctx, cancel := context.WithCancel(context.Background())

    // create a goroutine to send messages to the queue
    go func() {
        i := 0
        for {
            select {
            case <-time.NewTicker(time.Microsecond * 1).C:
                _, _, err := queue.Put(context.Background(), []byte(strconv.Itoa(i)), types.Tags{})
                if err != nil {
                    fmt.Printf("Error occured, retry to handle it: %v\n", err)
                }
                i += 1
            case <-ctx.Done():
                break
            }
        }
    }()

    // create a watcher to watch the messages from the queue
    watcher, err := queue.Watch(context.Background(), 0, 5, false, false)
    if err != nil {
        fmt.Printf("Failed to create a watcher to watch the queue: %v\n", err)
        return
    }

    // read messages from the queue and commit manually
    for i := 0; i < 100; i++ {
        df := <-watcher.FrameChan()
        err := queue.Commit(context.Background(), df.Index.Uint64())
        if err != nil {
            fmt.Printf("Failed to commit index: %v(%v)\n", df.Index, err)
        }
    }

    // everything is done, close the watcher
    watcher.Close()
    cancel()

Dépannage

Pour résoudre les problèmes courants lors de l'appel de services avec le SDK pour Go, y compris leurs causes et solutions, consultez la section « Troubleshoot invocation exceptions » de la rubrique SDK d'appel de service.

Pour obtenir la liste complète des codes d'état de service, des messages d'erreur et des actions recommandées, consultez la rubrique Annexe : Codes d'état de service et erreurs courantes.