客戶端建立模式
在 Google 中App Engine,一般建議重複使用 firestore.Client 實例進行多次呼叫。但是,單一客戶端還是每個請求客戶端更合適取決於所使用的App Engine 的特定版本:
帶有Go 1.11 運行時的App Engine Standard:
使用Go 1.11 運行時,可以利用任何上下文來初始化firestore.Client。這允許在 main() 函數或使用後台上下文的任何其他函數中建立客戶端。然後可以使用請求上下文在請求處理程序中進行 API 呼叫。
package main var client *firestore.Client func init() { var err error client, err = firestore.NewClient(context.Background()) // handle errors as needed } func handleRequest(w http.ResponseWriter, r *http.Request) { doc := client.Collection("cities").Doc("Mountain View") doc.Set(r.Context(), someData) // rest of the handler logic }
1.11 之前的Go 運行時的App Engine 標準:
在較早的Go 運行時,App Engine 強制對所有客戶端庫實例使用僅限於HTTP 請求的上下文。因此,必須為每個請求建立新的 firestore.Client:
func main() { // Setup server s := &server{db: NewFirestoreClient()} // Setup Router http.HandleFunc("/people", s.peopleHandler()) // Starts the server to receive requests appengine.Main() } func (s *server) peopleHandler() http.HandlerFunc { // pass context in this closure from main? return func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() // appengine.NewContext(r) but should it inherit from background somehow? s.person(ctx, 1) // ... } } func (s *server) person(ctx context.Context, id int) { // what context should this be? _, err := s.db.Client.Collection("people").Doc(uid).Set(ctx, p) // handle client results } func NewFirestoreClient() *Firestore { ctx := context.Background() client, err := firestore.NewClient(ctx, os.Getenv("GOOGLE_PROJECT_ID")) if err != nil { log.Fatal(err) } return &Firestore{ Client: client, } }
透過遵循基於 App Engine 版本的適當客戶端建立模式,您可以最佳化 Firestore 應用程式的效能和資源利用率。
以上是在 Google App Engine 中建立 Firestore 用戶端:單一客戶端還是每個請求?的詳細內容。更多資訊請關注PHP中文網其他相關文章!