Como colocar tarefas pull em lease

Quando as tarefas estão em uma fila pull, o worker pode alocá-las. Após o processamento das tarefas, ele precisa excluí-las.

Antes de começar

Contexto importante

  • Esse método é aplicável apenas a workers que estejam sendo executados em um serviço no ambiente padrão.
  • Ao usar filas pull, você é responsável pelo escalonamento dos workers com base no volume de processamento.

Como alocar tarefas

Depois que as tarefas estiverem na fila, um worker poderá colocar uma ou mais delas em lease usando o método leaseTasks(). Pode demorar um pouco até que as tarefas recém-adicionadas usando add() sejam disponibilizadas por meio do leaseTasks().

Ao solicitar um lease, é preciso especificar o número de tarefas que serão colocadas em lease (no máximo 1.000) e a duração do lease em segundos (no máximo uma semana). A duração da alocação deve ser longa o suficiente para garantir que a tarefa mais lenta tenha tempo de ser concluída antes do fim do período de alocação. Para modificar um lease de tarefas, use modifyTaskLease().

Colocar uma tarefa em lease faz com que ela fique indisponível para processamento por outro worker até que ela expire.

O exemplo de código a seguir aloca tarefas da fila pull-queue por uma hora:

Java 8

List<TaskHandle> tasks = q.leaseTasks(3600, TimeUnit.SECONDS, numberOfTasksToLease);

Java 7

List<TaskHandle> tasks = q.leaseTasks(3600, TimeUnit.SECONDS, numberOfTasksToLease);

Processamento em lote com tags de tarefa

Nem todas as tarefas são iguais. Seu código pode incluir tags nas tarefas e depois escolher as que serão alocadas por tag. A tag funciona como um filtro.

Java 8

q.add(
    TaskOptions.Builder.withMethod(TaskOptions.Method.PULL)
        .payload(content.toString())
        .tag("process".getBytes()));

Java 7

q.add(TaskOptions.Builder.withMethod(TaskOptions.Method.PULL)
    .payload(content.toString())
    .tag("process".getBytes()));

Agora aloque as tarefas filtradas:

Java 8

// Lease only tasks tagged with "process"
List<TaskHandle> tasks =
    q.leaseTasksByTag(3600, TimeUnit.SECONDS, numberOfTasksToLease, "process");
// You can also specify a tag to lease via LeaseOptions passed to leaseTasks.

Java 7

// Lease only tasks tagged with "process"
List<TaskHandle> tasks = q
    .leaseTasksByTag(3600, TimeUnit.SECONDS, numberOfTasksToLease, "process");
// You can also specify a tag to lease via LeaseOptions passed to leaseTasks.

Como regular taxas de pesquisa

Os workers que pesquisam a fila em busca de tarefas para alocar detectam se estão tentando alocar tarefas mais rapidamente do que a fila pode fornecer. Se essa falha ocorrer, poderão ser geradas as seguintes exceções em leaseTasks():


Seu código precisa capturar essas exceções, desistir de chamar leaseTasks() e tentar novamente mais tarde. Para evitar esse problema, defina um prazo de RPC maior ao chamar leaseTasks() e não insista quando uma solicitação de alocação retornar uma lista vazia de tarefas.

Se você gerar mais de 10 solicitações de LeaseTasks por fila por segundo, apenas as 10 primeiras solicitações retornarão resultados. Se as solicitações ultrapassarem esse limite, OK será retornado sem nenhum resultado.

Como monitorar tarefas no Console do GCP

Para ver informações sobre todas as tarefas e filas no aplicativo:

  1. Abra a página Filas de tarefas no Console do GCP e selecione a guia Filas pull na barra de menus, localizada na parte superior da página.

    Acessar a guia Filas pull

  2. Clique no nome da fila em que você está interessado e abra a página de detalhes dela. Serão exibidas todas as tarefas na fila selecionada.

Como excluir tarefas

Depois que o worker conclui uma tarefa, ele precisa excluí-la da fila. Se continuarem sendo exibidas tarefas restantes em uma fila depois que o worker terminar de processá-las, é provável que tenha ocorrido falha no worker. Nesse caso, as tarefas serão processadas por outro worker.

É possível excluir uma tarefa específica ou uma lista de tarefas usando deleteTask(). Você precisa saber o nome da tarefa para excluí-la. Também é possível encontrar nomes de tarefa no Task object retornado por leaseTasks().

O exemplo de código a seguir mostra como excluir uma tarefa de uma fila:

Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Java 8