Google App Engine (GAE)各クライアント ライブラリの HTTP リクエストをスコープとする context.Context を使用することを提案します。これにより、クライアントが特定のリクエストに関連付けられ、データベース操作にコンテキスト固有のデータが提供されるようになります。
リクエストごとのアプローチ:
提供された例では、新しい Firestore クライアントがハンドラー関数内で作成されますrequest:
func (s *server) person(ctx context.Context, id int) { _, err := s.db.Client.Collection("people").Doc(uid).Set(ctx, p) }
このアプローチでは、クライアントが現在のリクエストから確実に分離されますが、特に長時間実行されるリクエストや高頻度の操作の場合、非効率的で不要なオーバーヘッドが発生する可能性があります。
グローバル クライアント アプローチ:
別のアプローチは、単一のグローバル Firestore クライアントを作成し、それを再利用することです。複数のリクエスト。ただし、これは GAE の古い Go ランタイムでは実現できませんでした。
GAE 標準の Go 1.11 ランタイムの導入により、コンテキスト スコープの制限が緩和されました。これにより、任意のコンテキストを使用できるようになりました。
新しい GAE 標準ランタイムでは、次のことが推奨されます。
バックグラウンドを使用して main() または init() 関数で Firestore クライアントを初期化します。 context:
func init() { var err error client, err = firestore.NewClient(context.Background()) }
リクエスト ハンドラーでは、API 呼び出しのリクエスト コンテキストを使用します:
func handleRequest(w http.ResponseWriter, r *http.Request) { doc := client.Collection("cities").Doc("Mountain View") doc.Set(r.Context(), someData) }
次のベスト プラクティスに従って、データベース操作でリクエスト固有のコンテキストを維持しながら、グローバル Firestore クライアントを再利用することで得られる効率の向上を活用できます。
以上がGoogle App Engine の Firestore クライアント: リクエストごとかグローバルか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。