Crie e execute uma tarefa que envie notificações de estado do Pub/Sub

Este documento explica como criar uma tarefa em lote que envia notificações do Pub/Sub. Pode usar o Pub/Sub para receber notificações quando o estado de uma tarefa ou de um trabalho muda, ou quando uma tarefa ou um trabalho entra num estado específico. Para mais informações, consulte o artigo Monitorize tarefas através de notificações.

Antes de começar

  1. Se nunca usou o Batch, reveja o artigo Comece a usar o Batch e ative o Batch concluindo os pré-requisitos para projetos e utilizadores.
  2. Crie ou identifique um tópico do Pub/Sub para notificações em lote.
  3. Configure uma subscrição para receber e usar as notificações.

Funções necessárias

  • Para receber as autorizações de que precisa para criar e executar uma tarefa que envia notificações, peça ao seu administrador que lhe conceda as seguintes funções da IAM:

    Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.

    Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.

  • A menos que esteja a usar a configuração predefinida para a conta de serviço da tarefa, certifique-se de que tem as autorizações necessárias.

    Para garantir que a conta de serviço da tarefa tem as autorizações necessárias para publicar notificações do Pub/Sub, peça ao seu administrador para conceder à conta de serviço da tarefa a função do IAM Publicador do Pub/Sub (roles/pubsub.publisher) no seu tópico do Pub/Sub.

  • Se quiser que uma tarefa publique notificações num tópico do Pub/Sub que esteja num projeto diferente do da tarefa, tem de conceder autorização ao agente do serviço de processamento em lote do projeto da tarefa para publicar nesse tópico.

    Para garantir que o agente do serviço Batch para o projeto da tarefa tem as autorizações necessárias para publicar notificações do Pub/Sub num tópico do Pub/Sub noutro projeto, peça ao seu administrador para conceder ao agente do serviço Batch para o projeto da tarefa a função de IAM Publicador do Pub/Sub (roles/pubsub.publisher) no tópico do Pub/Sub.

Crie e execute uma tarefa que envia notificações

Pode criar uma tarefa em lote que envia notificações do Pub/Sub fazendo o seguinte:

gcloud

Use a CLI Google Cloud para criar uma tarefa que inclua o campo notifications e um ou mais jobNotification objetos no corpo principal do ficheiro JSON:

{
...
  "notifications": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/TOPIC_ID",
      "message": {
        ATTRIBUTES
      }
    }
  ]
...
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto que contém o tópico do Pub/Sub.
  • TOPIC_ID: o ID do tópico do Pub/Sub do tópico que criou quando ativou as notificações do Pub/Sub.
  • ATTRIBUTES: especifique um ou mais dos seguintes atributos, que lhe permitem receber notificações sobre o estado da tarefa ou de todas as respetivas tarefas.

    • Para receber notificações sobre todas as alterações ao estado da tarefa, especifique o seguinte:

      "type": "JOB_STATE_CHANGED"
      
    • Para receber notificações sobre uma alteração específica do estado de uma tarefa, especifique o seguinte:

      "type": "JOB_STATE_CHANGED",
      "newJobState": "JOB_STATE"
      

      Substitua JOB_STATE por um dos seguintes estados do trabalho:

      • QUEUED
      • SCHEDULED
      • RUNNING
      • SUCCEEDED
      • FAILED

      Para mais informações sobre os estados das tarefas, consulte o artigo Ciclo de vida das tarefas.

    • Para notificações sobre todas as alterações de estado das tarefas, especifique o seguinte:

      "type": "TASK_STATE_CHANGED"
      
    • Para receber notificações sobre alterações de estado de tarefas específicas, especifique o seguinte:

      "type": "TASK_STATE_CHANGED",
      "newTaskState": "TASK_STATE"
      

      Substitua TASK_STATE por um dos seguintes estados da tarefa:

      • PENDING
      • ASSIGNED
      • RUNNING
      • SUCCEEDED
      • FAILED

      Para mais informações sobre os estados das tarefas, consulte o artigo Ciclo de vida da tarefa.

Por exemplo, suponha que quer receber notificações sobre todas as alterações ao estado do trabalho e sempre que uma tarefa falha. Para tal, pode ter um ficheiro de configuração JSON semelhante ao seguinte:

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello World! This is task $BATCH_TASK_INDEX."
            }
          }
        ]
      },
      "taskCount": 3,
    }
  ],
  "logsPolicy": {
      "destination": "CLOUD_LOGGING"
  },
  "notifications": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/TOPIC_ID",
      "message": {
        "type": "JOB_STATE_CHANGED"
      }
    },
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/TOPIC_ID",
      "message": {
        "type": "TASK_STATE_CHANGED",
        "newTaskState": "FAILED"
      }
    }
  ]
}

API

Use a API REST para criar uma tarefa que inclua o campo notifications e um ou mais objetos jobNotification no corpo principal do ficheiro JSON:

{
...
  "notifications": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/TOPIC_ID",
      "message": {
        ATTRIBUTES
      }
    }
  ]
...
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto que contém o tópico do Pub/Sub.
  • TOPIC_ID: o ID do tópico do Pub/Sub do tópico que criou quando ativou as notificações do Pub/Sub.
  • ATTRIBUTES: especifique um ou mais dos seguintes atributos, que lhe permitem receber notificações sobre o estado da tarefa ou de todas as respetivas tarefas.

    • Para receber notificações sobre todas as alterações ao estado da tarefa, especifique o seguinte:

      "type": "JOB_STATE_CHANGED"
      
    • Para receber notificações sobre uma alteração específica do estado de uma tarefa, especifique o seguinte:

      "type": "JOB_STATE_CHANGED",
      "newJobState": "JOB_STATE"
      

      Substitua JOB_STATE por um dos seguintes estados do trabalho:

      • QUEUED
      • SCHEDULED
      • RUNNING
      • SUCCEEDED
      • FAILED

      Para mais informações sobre os estados das tarefas, consulte o artigo Ciclo de vida das tarefas.

    • Para notificações sobre todas as alterações de estado das tarefas, especifique o seguinte:

      "type": "TASK_STATE_CHANGED"
      
    • Para receber notificações sobre alterações de estado de tarefas específicas, especifique o seguinte:

      "type": "TASK_STATE_CHANGED",
      "newTaskState": "TASK_STATE"
      

      Substitua TASK_STATE por um dos seguintes estados da tarefa:

      • PENDING
      • ASSIGNED
      • RUNNING
      • SUCCEEDED
      • FAILED

      Para mais informações sobre os estados das tarefas, consulte o artigo Ciclo de vida da tarefa.

Por exemplo, suponha que quer receber notificações sobre todas as alterações ao estado do trabalho e sempre que uma tarefa falha. Para tal, pode ter um ficheiro de configuração JSON semelhante ao seguinte:

{
  "taskGroups": [
    {
      "taskSpec": {
        "runnables": [
          {
            "script": {
              "text": "echo Hello World! This is task $BATCH_TASK_INDEX."
            }
          }
        ]
      },
      "taskCount": 3,
    }
  ],
  "logsPolicy": {
      "destination": "CLOUD_LOGGING"
  },
  "notifications": [
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/TOPIC_ID",
      "message": {
        "type": "JOB_STATE_CHANGED"
      }
    },
    {
      "pubsubTopic": "projects/PROJECT_ID/topics/TOPIC_ID",
      "message": {
        "type": "TASK_STATE_CHANGED",
        "newTaskState": "FAILED"
      }
    }
  ]
}

Ir

import (
	"context"
	"fmt"
	"io"

	batch "cloud.google.com/go/batch/apiv1"
	"cloud.google.com/go/batch/apiv1/batchpb"
	durationpb "google.golang.org/protobuf/types/known/durationpb"
)

// Creates and runs a job with configured notifications
func createJobWithNotifications(w io.Writer, projectID, region, jobName, topicName string) (*batchpb.Job, error) {

	ctx := context.Background()
	batchClient, err := batch.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("batchClient error: %w", err)
	}
	defer batchClient.Close()

	script := &batchpb.Runnable_Script_{
		Script: &batchpb.Runnable_Script{
			Command: &batchpb.Runnable_Script_Text{
				Text: "echo Hello world! This is task ${BATCH_TASK_INDEX}. This job has a total of ${BATCH_TASK_COUNT} tasks.",
			},
		},
	}

	taskSpec := &batchpb.TaskSpec{
		ComputeResource: &batchpb.ComputeResource{
			// CpuMilli is milliseconds per cpu-second. This means the task requires 2 whole CPUs.
			CpuMilli:  2000,
			MemoryMib: 16,
		},
		MaxRunDuration: &durationpb.Duration{
			Seconds: 3600,
		},
		MaxRetryCount: 2,
		Runnables: []*batchpb.Runnable{{
			Executable: script,
		}},
	}

	taskGroups := []*batchpb.TaskGroup{
		{
			TaskCount: 4,
			TaskSpec:  taskSpec,
		},
	}

	labels := map[string]string{"env": "testing", "type": "container"}

	// Policies are used to define on what kind of virtual machines the tasks will run on.
	// In this case, we tell the system to use "e2-standard-4" machine type.
	// Read more about machine types here: https://cloud.google.com/compute/docs/machine-types
	allocationPolicy := &batchpb.AllocationPolicy{
		Instances