クライアント作成のパターン
Google App Engine では、複数の呼び出しで firestore.Client インスタンスを再利用することが一般的に推奨されます。ただし、単一クライアントとリクエストごとのクライアントのどちらが適切かは、使用する App Engine の特定のバージョンによって異なります:
App Engine Standard with Go 1.11 ランタイム:
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 中国語 Web サイトの他の関連記事を参照してください。