Function Compute bir işlevi çalıştırdığında, işleyiciye bir context.Context nesnesi iletir. Bağlam, kodunuzun ek API çağrıları yapmadan istek kimlikleri, geçici kimlik bilgileri, işlev yapılandırması ve son tarih bilgileri gibi çalışma zamanı meta verilerine erişmesini sağlar.
Bağlam nesnesini aşağıdaki durumlarda kullanın:
İstek kimliği veya hesap kimliği gibi çağırma meta verilerini okuyun.
AccessKey çiftini sabit kodlamadan diğer Alibaba Cloud hizmetlerine (örneğin Object Storage Service (OSS)) erişmek için geçici kimlik bilgilerini kullanın.
İşlev zaman aşımına uğramadan önce ne kadar yürütme süresi kaldığını takip edin.
Bağlam değişkenleri
Aşağıdaki değişkenler fccontext nesnesinde mevcuttur. Bunları almak için github.com/aliyun/fc-runtime-go-sdk/fccontext paketini içe aktarın ve fccontext.FromContext(ctx) yöntemini çağırın.
| Değişken | Açıklama |
|---|---|
RequestID |
Geçerli çağırmanın benzersiz kimliği. Sorun gidermeyi kolaylaştırmak için bu değeri günlüklerinize kaydedin. |
Credentials |
Function Compute'ın hizmetle bağlantılı rolünüzü üstlenerek oluşturduğu geçici bir AccessKey çifti. Bu çift 36 saat boyunca geçerlidir. İşlev kodunuzdan OSS gibi hizmetlere erişmek için kullanın; kimlik bilgilerini kodun içinde saklamanıza gerek kalmaz. Ayrıntılar için bkz. Function Compute'a diğer Alibaba Cloud hizmetlerine erişim izni verme. |
Function |
Çağrılan işlevle ilgili temel meta veriler: ad, işleyici, bellek sınırı ve zaman aşımı süresi. |
Service |
İşlevin ait olduğu hizmetle ilgili meta veriler: ad, ilişkili Simple Log Service (SLS) projesi ve Logstore, sürüm ve takma ad. qualifier alanı, çağırma sırasında belirtilen sürümü veya takma adı tutar; versionId ise gerçekten yürütülen sürümü tutar. |
Region |
İşlevin çalıştığı bölgenin kimliği. Örneğin, Çin (Şanghay) bölgesi için cn-shanghai. Bölge kimliklerinin tam listesi için bkz. Hizmet uç noktaları. |
AccountId |
İşleve sahip olan Alibaba Cloud hesabının kimliği. |
Bağlam yöntemi
| Yöntem | Açıklama |
|---|---|
deadline |
İşlevin yürütme son tarihi (milisaniye cinsinden UNIX zaman damgası). İlgili time.Time değerini almak için ctx.Deadline() yöntemini çağırın. |
Tam veri yapısı için GitHub'daki fc-runtime-go-sdk kaynağına bakın.
Bağlam bilgilerini okuma
İşleyicinize parametre olarak context.Context ekleyin. Function Compute'a özel alanları açmak için fccontext.FromContext yöntemini çağırın.
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
}
Kalan yürütme süresini takip etme
Geçerli çağırma için mutlak son tarihi almak üzere ctx.Deadline() yöntemini kullanın ve ardından işlevinizin ne kadar süresi kaldığını hesaplayın. Aşağıdaki örnek, son tarihten 100 ms'lik bir tampon süre çıkarır ve zaman aşımına ulaşılmadan önce iş döngüsünü durdurur.
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)
}