Runtime Go di Function Compute meneruskan objek context.Context ke penanganan Anda pada setiap pemanggilan. Objek ini membawa metadata pemanggilan, kredensial sementara, informasi waktu eksekusi, dan data pelacakan analitik—semua yang Anda butuhkan untuk membangun fungsi yang berinteraksi dengan layanan Alibaba Cloud lainnya atau merespons timeout secara mulus.
Kapan menggunakan objek context
Gunakan objek context ketika penanganan Anda perlu:
Mengidentifikasi pemanggilan saat ini (ID permintaan, akun, wilayah)
Mengakses layanan Alibaba Cloud lainnya—seperti Object Storage Service (OSS)—tanpa hardcoding kredensial di kode Anda
Memantau waktu eksekusi dan menerapkan shutdown yang mulus sebelum fungsi mengalami timeout
Memeriksa konfigurasi fungsi atau layanan saat runtime
Baik penanganan event maupun penanganan HTTP menerima objek context yang sama dengan bidang yang identik.
Bidang Context
Impor paket aliyun/fc-runtime-go-sdk/fccontext dan panggil fccontext.FromContext(ctx) untuk mengekstrak objek fccontext bertipe dari context.Context standar Go.
Untuk struktur data lengkap, lihat context.go.
Variabel
| Field | Description |
|---|---|
RequestID | ID unik untuk pemanggilan. Catat ID ini untuk membantu pemecahan masalah error. |
Credentials | Pasangan Kunci Akses temporary yang diperoleh dengan mengasumsikan peran terkait layanan. Berlaku selama 36 jam. Gunakan ini untuk memanggil layanan seperti OSS tanpa hardcoding Pasangan Kunci Akses Anda di kode fungsi. Untuk informasi lebih lanjut, lihat Grant permissions across Alibaba Cloud accounts by using a RAM role. |
Function | Informasi dasar tentang fungsi yang dipanggil: nama, penanganan, memori, dan periode timeout. |
Service | Informasi tentang layanan tempat fungsi tersebut berada: nama, Proyek terkait dan penyimpanan log di Log Service, versi, dan alias. Bidang qualifier menentukan versi atau alias; version_id menentukan versi. |
Region | ID wilayah tempat fungsi dipanggil. Misalnya, cn-shanghai untuk wilayah China (Shanghai). Untuk informasi lebih lanjut, lihat Endpoints. |
AccountId | ID Akun Alibaba Cloud yang digunakan untuk memanggil fungsi. |
Metode
| Method | Description |
|---|---|
deadline | Titik waktu ketika eksekusi fungsi mengalami timeout, dinyatakan sebagai Stempel waktu UNIX dalam milidetik. Gunakan ctx.Deadline() untuk mengambil nilai ini. |
Contoh
Menampilkan informasi context
Contoh ini menunjukkan cara mengekstrak objek fccontext dan mencatat semua bidangnya. Contoh ini berguna untuk debugging metadata pemanggilan atau memverifikasi bahwa kredensial dan informasi wilayah telah diisi dengan benar.
package main
import (
"context"
"encoding/json"
"log"
"github.com/aliyun/fc-runtime-go-sdk/fc"
"github.com/aliyun/fc-runtime-go-sdk/fccontext"
)
func main() {
fc.Start(echoContext)
}
func echoContext(ctx context.Context) (string, error) {
fctx, _ := fccontext.FromContext(ctx)
log.Println(fctx.AccountId)
log.Printf("%#v\n", fctx)
res, _ := json.Marshal(fctx)
return string(res), nil
}Mendapatkan sisa waktu eksekusi
Contoh ini menunjukkan cara menggunakan ctx.Deadline() untuk menentukan berapa banyak waktu tersisa sebelum fungsi mengalami timeout, lalu keluar secara bersih 100 milidetik sebelum batas waktu habis alih-alih dihentikan di tengah operasi.
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/aliyun/fc-runtime-go-sdk/fc"
)
func LongRunningHandler(ctx context.Context) (string, error) {
deadline, _ := ctx.Deadline()
fmt.Printf("now: %s\ndeadline: %s\n", time.Now().String(), deadline.String())
deadline = deadline.Add(-100 * time.Millisecond)
timeoutChannel := time.After(time.Until(deadline))
for {
select {
case <-timeoutChannel:
return "Finished before timing out.", nil
default:
log.Print("hello!")
time.Sleep(50 * time.Millisecond)
}
}
}
func main() {
fc.Start(LongRunningHandler)
}