El servicio Cron de App Engine te permite configurar tareas programadas para que se ejecuten a horas concretas o en intervalos regulares. Estas tareas se conocen comúnmente como tareas cron. El servicio Cron de App Engine activa automáticamente estas tareas cron. Por ejemplo, puede usarlo para enviar un correo con un informe a diario, actualizar algunos datos almacenados en caché cada 10 minutos o actualizar información de resumen una vez por hora.
Un trabajo cron invocará una URL mediante una solicitud GET
HTTP que estará sujeta a los mismos límites que otras solicitudes HTTP
.
Las aplicaciones gratuitas pueden tener hasta 20 tareas programadas. Las aplicaciones de pago pueden tener hasta 250 tareas programadas.
Para implementar o actualizar programaciones, tu cuenta debe tener uno de los siguientes roles de Gestión de Identidades y Accesos:
- Propietario
- Editor
Puedes definir el permiso en la página Gestión de identidades y accesos de la Google Cloud consola.
Acerca del archivo de configuración cron
Un archivo cron.yaml
en el directorio raíz de tu aplicación (junto con app.yaml
) configura las tareas programadas de tu aplicación Go 1.11. A continuación, se muestra un ejemplo de archivo cron.yaml
:
cron:
- description: "daily summary job"
url: /tasks/summary
schedule: every 24 hours
- description: "monday morning mailout"
url: /mail/weekly
schedule: every monday 09:00
timezone: Australia/NSW
- description: "new daily summary job"
url: /tasks/summary
schedule: every 24 hours
target: beta
El archivo cron.yaml
usa la sintaxis YAML
y consta de definiciones para cada uno de tus trabajos cron. Una definición de trabajo debe tener un url
y un schedule
. También puedes especificar de forma opcional un description
, timezone
, target
y retry_parameters
:
url
- Obligatorio. La URL de tu aplicación a la que quieres que el servicio Cron envíe solicitudes de trabajo.
schedule
- Obligatorio. Define la programación de cuándo quieres que se ejecute el trabajo. Consulta la sintaxis más abajo.
description
- Opcional. Describe tu tarea cron, que se puede ver en la Google Cloud consola y en la interfaz de administración del servidor de desarrollo local.
timezone
-
Opcional. El nombre de la zona horaria,
o "zoneinfo", que quieras usar en la programación de tu trabajo. Si no especifica una zona horaria, la programación usará
UTC
, también conocido comoGMT
. -
target
-
Opcional. El nombre de un servicio específico de tu aplicación. Cuando se especifica
target
, el servicio Cron dirige la solicitud de tarea a ese servicio de tu aplicación. Las solicitudes de tarea se dirigen a las versiones del servicio especificado que estén configuradas para recibir tráfico. Consulta cómo se dirigen las solicitudes.Cuestiones importantes sobre
target
:-
Si tienes habilitada la
división del tráfico, tus solicitudes de trabajo no se dividirán
entre las versiones que hayas configurado:
- División de direcciones IP: las solicitudes de trabajo del servicio Cron siempre se envían desde la misma dirección IP y, por lo tanto, se dirigen a la misma versión cada vez.
- División de cookies: las solicitudes de trabajo no incluyen una cookie con la solicitud y, por lo tanto, no se dirigen a ninguna otra versión.
-
Si usas un
archivo de envío, tus trabajos se pueden redirigir si la misma URL también está
configurada en
dispatch.yaml
. Por ejemplo, si la URL/tasks/hello_service2
se define en los archivoscron.yaml
ydispatch.yaml
, las solicitudes de trabajo se envían aservice2
, aunque se haya especificadotarget: service1
:cron.yaml
:cron: - description: "test dispatch vs target" url: /tasks/hello_service2 schedule: every 1 mins target: service1
dispatch.yaml
:dispatch: - url: '*/tasks/hello_service2' service: service2
-
Si tienes habilitada la
división del tráfico, tus solicitudes de trabajo no se dividirán
entre las versiones que hayas configurado:
retry_parameters
- Opcional. Especifica que se vuelvan a ejecutar los trabajos fallidos. Consulta la sintaxis más abajo.
Definir la tarea cron schedule
Las tareas cron se programan en intervalos periódicos y se especifican con un formato sencillo similar al inglés. Puedes definir una programación para que las tareas se ejecuten varias veces al día, o en días y meses concretos.
- Intervalos inferiores a un día
Usa un intervalo inferior a un día para ejecutar un trabajo varias veces al día según una programación repetitiva. Puedes definir un intervalo de tiempo de finalización o un intervalo de tiempo de inicio:
Intervalo de tiempo de finalización: define el tiempo entre la "hora de finalización" de un trabajo y el momento en el que empieza el siguiente. La "hora de finalización" es el momento en el que se completa el trabajo o en el que se agota el tiempo de espera. El servicio Cron ejecuta tareas en este tipo de intervalo durante las 24 horas del día, empezando a las
00:00
, y espera el periodo de tiempo especificado entre cada tarea.Ejemplo: En la programación
every 5 minutes
, la tarea se ejecuta a diario con un intervalo de 5 minutos. Si una instancia de un trabajo que se está ejecutando según esta programación se completa a las 02:01, el siguiente trabajo espera 5 minutos y vuelve a iniciarse a las 02:06.Intervalo de tiempo de inicio: define un intervalo de tiempo regular para que el servicio Cron inicie cada tarea. A diferencia del intervalo de tiempo de finalización, el intervalo de tiempo de inicio ejecuta cada trabajo independientemente de cuándo finalice o se agote el tiempo del trabajo anterior. Puedes definir un intervalo de tiempo en el que quieras que se ejecute el trabajo o ejecutar trabajos las 24 horas del día, a partir de las
00:00
.Como la hora de inicio de una tarea es estricta, si una instancia de una tarea se ejecuta durante más tiempo del intervalo definido, el servicio Cron puede omitir una tarea. Se puede omitir una hora de inicio individual en el intervalo si la tarea anterior no se ha completado o se ha agotado el tiempo .
Ejemplo: En la
every 5 minutes from 10:00 to 14:00
programación, la primera tarea se empieza a ejecutar a las10:00
y, después, cada 5 minutos. Si la primera tarea se ejecuta durante 7 minutos, se omitirá la tarea10:05
y, por lo tanto, el servicio Cron no ejecutará otra instancia de esta tarea hasta10:10
.
- Intervalo personalizado
Puedes usar un intervalo personalizado para definir una programación en la que tu tarea se pueda ejecutar una vez al día en uno o varios días seleccionados, y en uno o varios meses seleccionados. Las tareas que se ejecutan según una programación personalizada se ejecutan durante todo el año, solo a la hora específica de los días y meses seleccionados.
Ejemplo: En la
1,2,3 of month 07:00
, el trabajo se ejecuta una vez a las07:00
los tres primeros días de cada mes.
Cuestiones importantes sobre schedule
:
- Debes decidir si quieres usar un intervalo inferior a un día o un intervalo personalizado. No puedes mezclar ni usar elementos de los distintos tipos de intervalo. A continuación, se muestra un ejemplo de una definición de programación no válida:
schedule: every 6 hours mon,wed,fri
. - Solo se debe ejecutar una instancia de un trabajo en cualquier momento. El servicio Cron se ha diseñado para ofrecer una entrega "al menos una vez"; es decir, si se programa una tarea, App Engine envía la solicitud de la tarea al menos una vez. En algunas circunstancias poco frecuentes, es posible que se soliciten varias instancias del mismo trabajo. Por lo tanto, tu controlador de solicitudes debe ser idempotente y tu código debe asegurarse de que no haya efectos secundarios perjudiciales si esto ocurre.
Formatear el schedule
Para especificar cuándo se ejecuta el trabajo, debes definir el elemento schedule
con la siguiente sintaxis:
schedule: [TYPE] [INTERVAL_VALUE] [INTERVAL_SCOPE]
Elige un tipo de intervalo para definir el elemento schedule
:
- [TYPE]: Los intervalos diarios deben incluir el prefijo
every
.Ejemplo:
schedule: every 12 hours
- [INTERVAL_VALUE]: un valor entero y la unidad de tiempo correspondiente. Valores válidos para la unidad de tiempo:
minutes
omins
hours
- [INTERVAL_SCOPE]: no aplicable. Para definir una hora de inicio específica o un intervalo en el que quieras que se ejecuten tus trabajos, consulta la sintaxis del intervalo de hora de inicio o del intervalo personalizado.
- Ejemplos de intervalos de tiempo de finalización
- Consulta los siguientes ejemplos para saber cómo definir programaciones de trabajos que usen un intervalo de hora de finalización:
- Empieza a ejecutarse todos los días a las 00:00 y espera 5 minutos entre
cada trabajo. Después de que finalice cada tarea, el servicio Cron espera 5 minutos
antes de ejecutar la siguiente:
schedule: every 5 minutes
- Empieza a ejecutarse todos los días a las 00:00 y espera 30 minutos entre
cada trabajo. Una vez que finaliza cada tarea, el servicio Cron espera 30 minutos
antes de ejecutar la siguiente:
schedule: every 30 mins
- Empieza a ejecutarse todos los días a las 00:00 y espera 5 minutos entre
cada trabajo. Después de que finalice cada tarea, el servicio Cron espera 5 minutos
antes de ejecutar la siguiente:
- [TYPE]: Los intervalos diarios deben incluir el prefijo
every
.Ejemplo:
schedule: every 12 hours
- [INTERVAL_VALUE]: un valor entero y la unidad de tiempo correspondiente. Valores válidos para la unidad de tiempo:
minutes
omins
hours
- [INTERVAL_SCOPE] Especifica una cláusula que corresponde a [INTERVAL_VALUE]. Puedes definir un periodo personalizado o usar la opción 24 horas
synchronized
.- Incluye la cláusula
from [HH:MM] to [HH:MM]
para definir una hora de inicio y un intervalo específicos en los que quieras ejecutar los trabajos.Debes especificar los valores de tiempo en el formato de 24 horas,
HH:MM
, donde:HH
son números enteros del00
al23
.MM
son números enteros del00
al59
.
- Use
synchronized
para especificar un intervalo de tiempo de 24 horas (from 00:00 to 23:59
) que se divida de forma uniforme por el valor [INTERVAL_VALUE].Importante: [INTERVAL_VALUE] debe dividir 24 en un número entero. De lo contrario, se producirá un error. Los valores válidos de [INTERVAL_VALUE] son
1
,2
,3
,4
,6
,8
,12
o24
.
- Incluye la cláusula
- Ejemplos de intervalos de hora de inicio
- Consulta los siguientes ejemplos para saber cómo definir programaciones de trabajos que usen un intervalo de hora de inicio:
- Se ejecuta cada 5 minutos de 10:00 a 14:00 todos los días:
schedule: every 5 minutes from 10:00 to 14:00
- Se ejecuta una vez cada hora de 08:00 a 16:00 todos los días:
schedule: every 1 hours from 08:00 to 16:00
- Se ejecuta una vez cada dos horas, todos los días a partir de las 00:00:
schedule: every 2 hours synchronized
- Se ejecuta cada 5 minutos de 10:00 a 14:00 todos los días:
- [TYPE]: Los intervalos personalizados pueden incluir el prefijo
every
para definir un intervalo repetitivo o puedes definir una lista específica de días de un mes:- Para definir un intervalo repetitivo, puedes usar el prefijo
every
.Ejemplos:
schedule: every day 00:00 schedule: every monday 09:00
- Para definir días concretos, debes usar números ordinales. Los valores válidos van desde el primer día del mes hasta el número máximo de días de ese mes. Por ejemplo:
1st
ofirst
2nd
osecond
3rd
othird
- Hasta:
31st
othirtyfirst
Ejemplo:
schedule: 1st,3rd tuesday schedule: 2nd,third wednesday of month 09:00
- Para definir un intervalo repetitivo, puedes usar el prefijo
- [INTERVAL_VALUE]: los intervalos personalizados incluyen una lista de los días específicos en los que quieres que se ejecute la tarea. La lista debe definirse como una lista separada por comas y puede incluir cualquiera de los siguientes valores:
- Valor entero del día del mes, con un máximo de 31 días. Por ejemplo:
1
2
3
- Y hasta:
31
- El nombre del día en una combinación de cualquiera de los siguientes valores largos o abreviados:
monday
omon
tuesday
otue
wednesday
owed
thursday
othu
friday
ofri
saturday
osat
sunday
osun
- Usa
day
para especificar todos los días de la semana.
Ejemplos:
schedule: 2nd monday,thu schedule: 1,8,15,22 of month 09:00 schedule: 1st mon,wednesday,thu of sep,oct,nov 17:00
- Valor entero del día del mes, con un máximo de 31 días. Por ejemplo:
- [INTERVAL_SCOPE]: especifica una cláusula que corresponde al [INTERVAL_VALUE] especificado. Los intervalos personalizados pueden incluir la cláusula
of [MONTH]
, que especifica un solo mes de un año, o una lista de varios meses separados por comas. También debes definir una hora específica para la ejecución de la tarea. Por ejemplo:of [MONTH] [HH:MM]
.De forma predeterminada, si se excluye la cláusula
of
, el intervalo personalizado se ejecuta cada mes.- [MONTH]: debes especificar los meses en una lista separada por comas y puedes incluir una combinación de los siguientes valores largos o abreviados:
january
ojan
february
ofeb
march
omar
april
oapr
may
june
ojun
july
ojul
august
oaug
september
osep
october
ooct
november
onov
december
odec
- Usa
month
para especificar todos los meses del año.
- [HH:MM]: debes especificar los valores de tiempo en formato de 24 horas,
HH:MM
, donde:HH
son números enteros del00
al23
.MM
son números enteros del00
al59
.
Ejemplo:
schedule: 1st monday of sep,oct,nov 09:00 schedule: 1 of jan,april,july,oct 00:00
- [MONTH]: debes especificar los meses en una lista separada por comas y puedes incluir una combinación de los siguientes valores largos o abreviados:
- Ejemplos de intervalos personalizados
- Consulta los siguientes ejemplos para saber cómo definir programaciones de trabajos que usen un intervalo personalizado:
- Se ejecuta todos los días a las 00:00:
schedule: every day 00:00
- Se ejecuta todos los lunes a las 09:00:
schedule: every monday 09:00
- Se ejecuta una vez el segundo miércoles de marzo a las 17:00:
schedule: 2nd wednesday of march 17:00
- Se ejecuta seis veces en mayo. Durante las dos primeras semanas, se ejecuta una vez los lunes, los miércoles y los viernes a las 10:00:
schedule: 1st,second mon,wed,fri of may 10:00
- Se ejecuta una vez a la semana. Cada siete días a partir del primer día de cada mes, se ejecuta una vez a las 09:00:
schedule: 1,8,15,22 of month 09:00
- Se ejecuta cada dos semanas. El primer y el tercer lunes de cada mes,
se ejecuta una vez a las 04:00:
schedule: 1st,third monday of month 04:00
- Se ejecuta tres veces al año. El primer lunes de septiembre, octubre y noviembre, se ejecuta una vez a las 09:00:
schedule: 1st monday of sep,oct,nov 09:00
- Se ejecuta una vez cada trimestre. El primer día de enero, abril, julio y octubre, se ejecuta una vez a las 00:00:
schedule: 1 of jan,april,july,oct 00:00
- Se ejecuta todos los días a las 00:00:
Especificar reintentos
Si el controlador de solicitudes de un trabajo cron devuelve un código de estado que no está en el intervalo 200-299 (inclusive), App Engine considera que el trabajo ha fallado. De forma predeterminada, los trabajos fallidos no se vuelven a intentar. Para que se vuelva a intentar ejecutar las tareas fallidas, puedes incluir un bloque retry_parameters
en el archivo de configuración.
Aquí tienes un archivo cron.yaml de ejemplo que contiene una única tarea cron configurada para reintentarse hasta cinco veces con un tiempo de espera inicial de 2,5 segundos que se duplica cada vez.
cron:
- description: "retry demo"
url: /retry
schedule: every 10 mins
retry_parameters:
job_retry_limit: 5
min_backoff_seconds: 2.5
max_doublings: 5
Sintaxis de reintentos de cron
Los parámetros de reintento se describen en la tabla de abajo.
Elemento | Descripción |
---|---|
job_retry_limit |
Número entero que representa el número máximo de reintentos de un trabajo cron fallido. El valor mínimo es 0 y el máximo es 5 . Si también especificas job_age_limit ,
App Engine vuelve a intentar ejecutar la tarea cron hasta que se alcancen ambos límites.
El valor predeterminado de job_retry_limit es 0 .
|
job_age_limit |
El límite de tiempo para volver a intentar una tarea cron fallida, medido desde la primera vez que se ejecuta la tarea cron. El valor es un número seguido de una unidad de tiempo, donde la unidad es s para segundos, m para minutos, h para horas o d para días. Por ejemplo, el valor 5d especifica un límite de cinco días después del primer intento de ejecución del trabajo cron. Si también especificas job_retry_limit , App Engine vuelve a intentar ejecutar la tarea cron hasta que se alcancen ambos límites.
|
min_backoff_seconds |
Número mínimo de segundos que se debe esperar antes de volver a intentar ejecutar una tarea cron después de que falle. |
max_backoff_seconds |
Número máximo de segundos que se debe esperar antes de volver a intentar ejecutar un trabajo cron después de que falle. |
max_doublings |
Número máximo de veces que se duplicará el intervalo entre reintentos de trabajos cron fallidos antes de que el aumento se convierta en constante. La constante es:
2**(max_doublings - 1) * min_backoff .
|
Validar solicitudes cron
Puede que quieras validar que las solicitudes a tus URLs de cron proceden de App Engine y no de otra fuente. Para ello, valida un encabezado HTTP y la dirección IP de origen de la solicitud:
Las solicitudes del servicio Cron contendrán el siguiente encabezado HTTP:
X-Appengine-Cron: true
App Engine define este y otros encabezados internamente. Si un cliente envía estos encabezados, se eliminan de la solicitud.
App Engine envía solicitudes Cron desde la dirección IP
0.1.0.2
. En el caso de las tareas cron creadas con versiones anteriores de gcloud (anteriores a la 326.0.0), las solicitudes cron procederán de0.1.0.1
.
Subir tareas cron
Para subir tus tareas cron, debes especificar cron.yaml
como parámetro del siguiente comando de gcloud:
gcloud app deploy cron.yaml
Eliminar tareas cron
Para eliminar todos los trabajos cron, cambia el archivo cron.yaml
para que solo contenga lo siguiente:
cron:
Compatibilidad con Cron en la consola Google Cloud
Puedes consultar las tareas cron programadas en la Google Cloud consola página Tareas cron.
También puedes visitar la página de registros para ver cuándo se añadieron o se quitaron los trabajos cron.