Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Menunggu pelaksanaan pertanyaan AWS Athena dalam Go SDK

Menunggu pelaksanaan pertanyaan AWS Athena dalam Go SDK

王林
王林ke hadapan
2024-02-09 15:09:181037semak imbas

在 Go SDK 中等待 AWS Athena 查询执行

editor php Baicao sedang menunggu panduan pelaksanaan pertanyaan AWS Athena dalam Go SDK, yang direka untuk membantu pembangun mengoptimumkan prestasi pertanyaan dan meningkatkan kelajuan tindak balas aplikasi. AWS Athena ialah perkhidmatan pertanyaan tanpa pelayan yang boleh menjalankan pertanyaan SQL secara langsung dalam baldi S3 tanpa skema atau pemuatan data yang dipratakrifkan. Walau bagaimanapun, disebabkan sifat pelaksanaan tak segerak pertanyaan, pembangun perlu menunggu pertanyaan selesai sebelum mendapatkan keputusan. Panduan ini akan menerangkan cara menggunakan mekanisme tunggu dalam Go SDK untuk menunggu dengan berkesan semasa pelaksanaan pertanyaan dan mendapatkan keputusan selepas pertanyaan selesai, memberikan pengalaman pengguna dan prestasi aplikasi yang lebih baik.

Kandungan soalan

Saya mempunyai kod berfungsi yang menjalankan pertanyaan athena dan menunggu pertanyaan selesai dengan mengundi getqueryresults 返回的 error menggunakan kod berikut:

func getqueryresults(client *athena.client, queryid *string) []types.row {

    params := &athena.getqueryresultsinput{
        queryexecutionid: queryid,
    }

    data, err := client.getqueryresults(context.todo(), params)

    for err != nil {
        println(err.error())
        time.sleep(time.second)
        data, err = client.getqueryresults(context.todo(), params)
    }

    return data.resultset.rows
}

Masalahnya ialah saya sama sekali tidak mempunyai cara untuk memecahkan gelung jika pertanyaan gagal.

Sebagai contoh, dalam python saya boleh melakukan perkara berikut:

    while athena.get_query_execution(QueryExecutionId=execution_id)["QueryExecution"][
        "Status"
    ]["State"] in ["RUNNING", "QUEUED"]:
        sleep(2)

Saya boleh daftar masuk for 循环内进行类似 strings.contains(err.error(),"failed") tetapi saya sedang mencari cara yang lebih bersih.

Saya cuba mencari yang setara untuk go tetapi tidak berjaya. Adakah terdapat sebarang fungsi dalam go sdk yang boleh mengembalikan status pelaksanaan? Adakah terdapat cara yang lebih baik untuk menyemak ralat dalam go dan bukannya err != nil ?

Solution

sdk telah menyediakan fungsi cuba semula.

Ini adalah contoh menggunakan aws-sdk-go-v2.

package main

import (
    "context"
    "fmt"
    "time"

    "github.com/aws/aws-sdk-go-v2/aws"
    "github.com/aws/aws-sdk-go-v2/service/athena"
    "github.com/aws/aws-sdk-go-v2/service/athena/types"
)

func main() {
    cfg := aws.NewConfig()
    ath := athena.NewFromConfig(*cfg)

    ctx, cancelFunc := context.WithTimeout(context.Background(), time.Minute*5)
    defer cancelFunc()

    rows, err := GetQueryResults(ctx, ath, aws.String("query-id"), 10)
    if err != nil {
        panic(err) // TODO: handle error
    }

    fmt.Println(rows)
}

func GetQueryResults(ctx context.Context, client *athena.Client, QueryID *string, attempts int) ([]types.Row, error) {
    t := time.NewTicker(time.Second * 5)
    defer t.Stop()

    attemptsFunc := func(o *athena.Options) { o.RetryMaxAttempts = attempts }

WAIT:
    for {
        select {
        case <-t.C:
            out, err := client.GetQueryExecution(ctx, &athena.GetQueryExecutionInput{
                QueryExecutionId: QueryID,
            }, attemptsFunc)
            if err != nil {
                return nil, err
            }

            switch out.QueryExecution.Status.State {
            case types.QueryExecutionStateCancelled,
                types.QueryExecutionStateFailed,
                types.QueryExecutionStateSucceeded:
                break WAIT
            }

        case <-ctx.Done():
            break WAIT
        }
    }

    data, err := client.GetQueryResults(ctx, &athena.GetQueryResultsInput{
        QueryExecutionId: QueryID,
    })
    if err != nil {
        return nil, err
    }

    return data.ResultSet.Rows, nil
}

Atas ialah kandungan terperinci Menunggu pelaksanaan pertanyaan AWS Athena dalam Go SDK. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam