Menunggu pelaksanaan pertanyaan AWS Athena dalam Go SDK

王林
Lepaskan: 2024-02-09 15:09:18
ke hadapan
1088 orang telah melayarinya

在 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
}
Salin selepas log masuk

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)
Salin selepas log masuk

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
}
Salin selepas log masuk

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan