本文介紹在函數計算中使用Go運行時開發代碼時,所涉及的Context(上下文)的相關概念和使用示例。
什么是上下文
當函數計算運行您的函數時,它會將上下文對象(context.Context
)傳遞到執行方法中。該對象包含有關調用、服務、函數、鏈路追蹤和執行環境等信息。
事件請求處理程序(Event Handler)和HTTP請求處理程序(HTTP Handler)都支持上下文對象作為傳入參數,且格式和內容相同。上下文對象主要提供了以下參數。
字段 | 說明 |
變量 | |
RequestID | 本次調用請求的唯一ID。您可以記錄該ID,當函數調用出現問題時方便查詢。 |
Credentials | 函數計算服務通過扮演服務角色而獲取的一組臨時密鑰,其有效時間是36小時。您可以在代碼中使用 |
Function | 當前調用的函數的一些基本信息,例如函數名、函數入口、函數內存和超時時間。 |
Service | 當前調用的函數所在的服務信息,包含服務名稱、接入的日志服務SLS的Project和Logstore信息,以及服務的版本和別名信息。其中qualifier 表示調用函數時指定的服務版本或別名,version_id 表示實際調用的服務版本。 |
Region | 當前調用的函數所在地域ID,例如在華東2(上海)地域調用,則地域ID為cn-shanghai。詳細信息,請參見服務接入地址。 |
AccountId | 函數所屬的阿里云賬號ID(主賬號ID)。 |
方法 | |
deadline | 返回函數執行的超時時間,格式為Unix時間戳,單位:毫秒。 |
完整的數據結構,請參見context.go。
使用示例
示例一:打印Context信息
首先,函數的handler
需要包含context
參數,函數計算會把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)
}
文檔內容是否對您有幫助?