全部產品
Search
文件中心

Function Compute:上下文

更新時間:Jul 06, 2024

本文介紹在Function Compute中使用Go運行時開發代碼時,所涉及的Context(上下文)的相關概念和使用樣本。

什麼是上下文

Function Compute運行您的函數時,它會將內容物件(context.Context)傳遞到執行方法中。該對象包含有關調用、服務、函數、鏈路追蹤和執行環境等資訊。

事件請求處理常式(Event Handler)和HTTP請求處理常式(HTTP Handler)都支援內容物件作為傳入參數,且格式和內容相同。內容物件主要提供了以下參數。
表 1. Context資訊
欄位說明
變數
RequestID本次調用請求的唯一ID。您可以記錄該ID,當函數調用出現問題時方便查詢。
Credentials

Function Compute服務通過扮演服務角色而擷取的一組臨時密鑰,其有效時間是36小時。您可以在代碼中使用Credentials去訪問相應的服務例如OSS,這就避免了您把自己的AccessKey資訊編碼在函數代碼裡。詳細資料,請參見授予Function Compute訪問其他雲端服務的許可權

Function當前調用的函數的一些基本資料,例如函數名、函數入口、函數記憶體和逾時時間。
Service當前調用的函數所在的服務資訊,包含服務名稱、接入的Log ServiceSLS的Project和Logstore資訊,以及服務的版本和別名資訊。其中qualifier表示調用函數時指定的服務版本或別名,version_id表示實際調用的服務版本。
Region當前調用的函數所在地區ID,例如在華東2(上海)地區調用,則地區ID為cn-shanghai。詳細資料,請參見服務接入地址
AccountId函數所屬的阿里雲帳號ID(主帳號ID)。
方法
deadline返回函數執行的逾時時間,格式為Unix時間戳記,單位:毫秒。

完整的資料結構,請參見context.go

使用樣本

樣本一:列印Context資訊

首先,函數的handler需要包含context參數,Function Compute會把Context資訊中的變數資訊插入到context的取值中。然後,需要import aliyun/fc-runtime-go-sdk/fccontext,通過fccontext.FromContext方法擷取fccontext

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
}

樣本二:擷取函數剩餘執行時間

以下樣本展示了如何使用deadline擷取函數剩餘執行時間。

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)
}