Configura solicitudes de preparación para mejorar el rendimiento

Puedes usar solicitudes de preparación para reducir la latencia de respuestas y solicitudes durante la carga del código de tu app en una instancia recién creada.

Con frecuencia, App Engine necesita cargar el código de tu app en una instancia nueva. La carga de una instancia puede suceder en las siguientes situaciones:

  • Cuando vuelves a implementar una versión de tu app.
  • Cuando se crean nuevas instancias debido a que la carga de solicitudes supera la capacidad del conjunto actual de instancias en ejecución.
  • Cuando se realizan reparaciones y mantenimiento de la infraestructura subyacente o del hardware físico.

Cuando cargas el código de tu app en una instancia nueva, pueden generarse solicitudes de carga. Las solicitudes de carga pueden provocar una mayor latencia de solicitudes para tus usuarios. Puedes evitar esta latencia si usas solicitudes de preparación. Estas cargan el código de tu app en una instancia nueva antes de que le lleguen solicitudes reales.

Si habilitaste las solicitudes de preparación en tu aplicación, App Engine intenta detectar cuándo esta necesita una instancia nueva y envía una solicitud de preparación para inicializarla. Sin embargo, estos intentos de detección no funcionan en todos los casos. Por eso, es posible que encuentres solicitudes de carga incluso si habilitaste las solicitudes de preparación en tu app. Por ejemplo, si tu app no entrega tráfico, la primera solicitud que reciba siempre será una solicitud de carga, no una solicitud de preparación.

Las solicitudes de preparación usan horas de instancia como cualquier otra solicitud para tu aplicación de App Engine. En la mayoría de los casos en los que se habilitan las solicitudes de preparación, no se observa un aumento en las horas de instancia porque la aplicación simplemente se está inicializando con una solicitud de preparación y no de carga. Tu uso de horas de instancia puede aumentar si decides hacer más trabajo, como almacenar datos en caché previamente durante una solicitud de preparación. Si estableces un número mínimo de instancias inactivas, es posible que encuentres solicitudes de preparación cuando esas instancias se inicien por primera vez, pero permanecerán disponibles a partir de ese momento.

Habilita las solicitudes de preparación

El programador de App Engine, que controla el ajuste de escala automático de las instancias según la configuración que proporciona el usuario, usa las solicitudes de preparación. Cuando están habilitadas, App Engine envía las solicitudes GET a /_ah/warmup. Puedes implementar controladores para esta solicitud a fin de que realicen tareas específicas de una aplicación, como almacenar sus datos en caché previamente.

Cuando se determina que hacen falta más instancias, el programador las inicia. Las solicitudes de preparación pueden aparecer en los registros incluso si están inhabilitadas porque el programador las utiliza para iniciar instancias.

Ten en cuenta que no hay garantía de que se llame a las solicitudes de preparación. En algunas situaciones, se envían solicitudes de carga en su lugar (por ejemplo, si la instancia es la primera que se inicia o si el tráfico aumenta de manera repentina). Sin embargo, si las solicitudes de preparación están habilitadas, el sistema hará todo lo posible para enviar las solicitudes a instancias que ya estén preparadas.

Para habilitar las solicitudes de preparación, agrega el elemento warmup bajo la directiva inbound_services en tu archivo app.yaml, por ejemplo:

inbound_services:
- warmup

Registra tu controlador

Puedes registrar la secuencia de comandos que controla las solicitudes de preparación en el archivo app.yaml tu proyecto. Por ejemplo:

inbound_services:
- warmup

handlers:
- url: /_ah/warmup
  script: _go_app
  login: admin

En este ejemplo, se registra un controlador que detectará las solicitudes de preparación a la ruta de solicitud /_ah/warmup con el controlador de secuencia de comandos en el archivo app.go.

Crea tu controlador

Crea un controlador que procese las solicitudes que se envían a /_ah/warmup. Tu controlador debe realizar cualquier lógica de preparación que necesite tu app. El siguiente ejemplo se basa en el ejemplo anterior:


// Sample warmup demonstrates usage of the /_ah/warmup handler.
package main

import (
	"context"
	"fmt"
	"log"
	"net/http"
	"os"
	"time"

	"cloud.google.com/go/storage"
)

var startupTime time.Time
var client *storage.Client

func main() {
	// Perform required setup steps for the application to function.
	// This assumes any returned error requires a new instance to be created.
	if err := setup(context.Background()); err != nil {
		log.Fatalf("setup: %v", err)
	}

	// Log when an appengine warmup request is used to create the new instance.
	// Warmup steps are taken in setup for consistency with "cold start" instances.
	http.HandleFunc("/_ah/warmup", func(w http.ResponseWriter, r *http.Request) {
		log.Println("warmup done")
	})
	http.HandleFunc("/", indexHandler)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
		log.Printf("Defaulting to port %s", port)
	}

	log.Printf("Listening on port %s", port)
	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), nil))
}

// setup executes per-instance one-time warmup and initialization actions.
func setup(ctx context.Context) error {
	// Store the startup time of the server.
	startupTime = time.Now()

	// Initialize a Google Cloud Storage client.
	var err error
	if client, err = storage.NewClient(ctx); err != nil {
		return err
	}

	return nil
}

// indexHandler responds to requests with our greeting.
func indexHandler(w http.ResponseWriter, r *http.Request) {
	if r.URL.Path != "/" {
		http.NotFound(w, r)
		return
	}
	uptime := time.Since(startupTime).Seconds()
	fmt.Fprintf(w, "Hello, World! Uptime: %.2fs\n", uptime)
}

Pasos siguientes

Podría ser conveniente que guardes algunos valores en un almacén de datos en memoria como Memcache, lo cual le brinda a tu app un acceso rápido a los datos sin necesidad de realizar consulta.

Por ejemplo, si generas y almacenas una lista de los artículos que están marcando tendencia actualmente en tu sitio, puedes generar esa lista durante la preparación y almacenarla en Memcache. Cuando llega una solicitud de usuario, App Engine no necesita realizar ninguna consulta al almacén de datos, y la aplicación puede entregar la solicitud del usuario más rápido.

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Entorno estándar de App Engine para Go