Cómo empezar con las suscripciones

En entornos distribuidos, a menudo deseará que las aplicaciones o trabajos reaccionen a los mensajes (sucesos) que se generan en otros componentes, normalmente llamados generadores de sucesos. Con Code Engine, las aplicaciones o los trabajos pueden recibir sucesos de interés suscribiéndose a productores de sucesos. La información de sucesos se recibe como solicitudes POST HTTP para aplicaciones y como variables de entorno para trabajos.

Code Engine da soporte a los siguientes tipos de productores de sucesos.

Cron
El productor de sucesos cron se basa en cron y genera un suceso a intervalos regulares. Utilice un productor de sucesos cron cuando haya que realizar una acción a intervalos bien definidos o en momentos específicos.
IBM Cloud Object Storage
El productor de sucesos de Object Storage genera sucesos a medida que se realizan cambios en los objetos de los grupos de almacenamiento de objetos. Por ejemplo, a medida que se añaden objetos a un grupo, una aplicación puede recibir un suceso y emprender una acción basada en dicho cambio, quizás consumiendo ese nuevo objeto.
Kafka
El generador de sucesos de Kafka observa si aparecen mensajes nuevos en una instancia de Kafka. Cuando crea una suscripción de Code Engine Kafka para un conjunto de temas, la app o el trabajo recibe un suceso independiente para cada mensaje nuevo que aparece en uno de los temas.
Webhooks
Puede utilizar los webhooks de GitHub para enviar sucesos desde un repositorio GitHub a la carga de trabajo de Code Engine. El suceso se envía como una solicitud POST en uno de los tipos de contenido soportados. Debe utilizar una aplicación con un punto final público para recibir el suceso GitHub ; los trabajos no están soportados. Para obtener más información, consulte Envío de sucesos de GitHub a una aplicación.

Para obtener más información sobre las API de suscripción, consulte Métodos CRD de suscripción.

Suscripciones para apps y escalado de apps

Las aplicaciones pueden suscribirse a varios productores de eventos, pero sólo una aplicación puede recibir eventos de cada suscripción. Tenga en cuenta que las suscripciones pueden afectar a la forma de escalado de la aplicación. Por ejemplo, si esperas que tu aplicación reciba muchos eventos al mismo tiempo y procesar cada evento lleva varios minutos, entonces podrías necesitar un valor de escala máxima más alto que si cada evento se puede procesar rápidamente. Para obtener más información, consulte Configuración del escalado de una aplicación.

Todos los sucesos que se entregan a las aplicaciones se reciben como mensajes HTTP. Los sucesos contienen determinadas cabeceras HTTP que le ayudan a determinar rápidamente los bits clave de información sobre los sucesos sin mirar el cuerpo (lógica empresarial) del suceso. Para obtener más información, consulte Ejemplo HTTP cabeceras para un evento IBM Cloud Object Storage que se envía a una aplicación.

Suscripciones para trabajos y limitaciones de ejecución de trabajos

Las suscripciones pueden afectar al número de trabajos que se inician. Por ejemplo, si el trabajo se suscribe para suprimir cambios en un grupo Object Storage y dicho grupo se suprime, se ejecuta un trabajo para cada objeto que estaba en dicho grupo y puede alcanzar rápidamente la limitación de 100 ejecuciones de trabajos. Además, debe tener en cuenta el tiempo de ejecución para cada ejecución de trabajo desencadenada por un suceso. Por ejemplo, si el generador de sucesos desencadena 10 o más sucesos por segundo y cada trabajo se ejecuta durante unos 20 segundos, el límite de ejecución del trabajo de 100 se alcanza en unos 10 segundos y las ejecuciones de trabajos posteriores se pierden hasta que se completan las ejecuciones de trabajos iniciadas anteriormente. Elija un trabajo como destino del suscriptor de eventos sólo si el número de eventos entrantes es generalmente bajo y el pico de eventos esperados en un periodo de tiempo específico es lo suficientemente bajo como para mantener el número de trabajos en ejecución por debajo del límite de cuota. Para obtener más información, consulte Límites y cuotas de Code Engine.

Después de 10 minutos, las ejecuciones de trabajo creadas por suscripciones se suprimen. Para obtener más información, consulte ¿Dónde se ejecuta mi trabajo?.

Todos los eventos que se entregan a los trabajos se reciben como variables de entorno. Para obtener más información, consulte Variables de entorno de ejemplo para un suceso IBM Cloud Object Storage que se envía a un trabajo.

Sucesos de Eventing

Los eventos gestionados por Code Engine al crear una suscripción se modifican para que se adhieran al Especificación de CloudEvents. Esta especificación define un conjunto de atributos comunes que se incluirán en cada suceso con el fin de proporcionar un conjunto común de metadatos. Al examinar los metadatos, puede detectar rápidamente las partes clave del mensaje sin analizar ni comprender la totalidad de la carga útil del suceso. Por ejemplo, cada evento que se entrega a una aplicación incluye una cabecera HTTP denominada ce-type, que indica el significado semántico (o "razón") del evento. Un suceso de una base de datos puede incluir un valor ce-type de com.example.row.deleted, que indica que el suceso se ha generado porque se ha suprimido una fila en la base de datos.

En la tabla siguiente, se muestran algunos atributos comunes clave. Cada atributo indica si es un atributo obligatorio en el suceso de entrada o si es opcional.

Atributos comunes CloudEvent
Cabecera Descripción
ID Este atributo obligatorio es un ID exclusivo para el suceso. Nunca dos sucesos del mismo generador de sucesos tienen asignado el mismo valor.
Origen Este atributo obligatorio especifica el contexto en el que se ha producido el suceso. Por ejemplo, para un sistema de almacenamiento de objetos, este valor puede ser el grupo en el que reside el objeto en cuestión.
Specversion Este atributo obligatorio indica la versión de la especificación de CloudEvents que utiliza el suceso.
Tipo Este atributo obligatorio describe el tipo del suceso. Por ejemplo, el tipo de suceso puede ser que se ha creado o suprimido un recurso.
Asunto Este atributo opcional indica el recurso sobre el que se relaciona el suceso. Por ejemplo, en un sistema de almacenamiento de objetos, este valor puede ser el objeto del grupo que se ha modificado.
Hora Este atributo opcional es la indicación de fecha y hora de cuando se produjo la aparición.

Para más información sobre la lista completa de atributos, consulte la especificación CloudEvents.

En Code Engine, cuando los sucesos se entregan a aplicaciones, los atributos CloudEvent aparecen como cabeceras HTTP, con el prefijo ce-. Cuando se entregan sucesos a trabajos por lotes, los atributos aparecen como variables de entorno, con el prefijo CE_ y todo el nombre de variable está en mayúsculas.

Cabeceras HTTP de ejemplo para un suceso de IBM Cloud Object Storage que se envía a una aplicación

ce-id: 3fb2c04e-a660-4640-8899-b82efb8169b6
ce-source: https://cloud.ibm.com/catalog/services/cloud-object-storage/mybucket
ce-specversion: 1.0
ce-subject: object-69-144
ce-time: 2021-08-17T20:22:02.917Z
ce-type: com.ibm.cloud.cos.document.delete

Variables de entorno de ejemplo para un suceso de IBM Cloud Object Storage que se envía a un trabajo

CE_DATA={"bucket":"mybucket","endpoint":"","key":"Notes.rtf","notification":{"bucket_name":"mybucket","content_type":"text/rtf","event_type":"Object:Delete","format":"2.0","object_length":"4642","object_name":"Notes.rtf","request_id":"b59727ee-9c4e-446a-9261-5616f6d1283b","request_time":"2021-04-13T20:10:37.631Z"},"operation":"Object:Delete"}  
CE_ID=b59727ee-9c4e-446a-9261-5616f6d1283b  
CE_SOURCE=https://cloud.ibm.com/catalog/services/cloud-object-storage/mybucket  
CE_SPECVERSION=1.0  
CE_TIME=2021-08-17T20:22:02.917Z  
CE_TYPE=com.ibm.cloud.cos.document.delete  

¿Qué ocurre cuando creo una suscripción?

De forma predeterminada, los mandatos subscription cron create, subscription cos create y subscription kafka create comprueban primero si existe la aplicación o el trabajo de destino. Si la comprobación de destino falla porque la aplicación o el trabajo no existe en el proyecto, los mandatos para crear la suscripción devuelven un error. Si desea crear una suscripción sin crear primero la aplicación, utilice la opción --force. Mediante la opción --force, el mandato ignora la comprobación de destino. Fíjese que en el campo Ready de la suscripción se muestra false hasta que se crea la aplicación de destino. A continuación, la suscripción pasa automáticamente al estado Ready: true.

Tras crear la suscripción, se sondea repetidamente el estado de la misma para verificar su grado de disponibilidad. Este sondeo dura 15 segundos, de forma predeterminada, antes de que se exceda el tiempo de espera. Puede cambiar la cantidad de tiempo antes de que el mandato exceda el tiempo de espera utilizando la opción --wait-timeout. También puede ignorar el sondeo del estado definiendo la opción --no-wait en false.

Puede visualizar el estado de la suscripción utilizando los mandatos de CLI subscription cron get, subscription cos get o subscription kafka get.