Os assinantes podem não conseguir processar mensagens por vários motivos. Por exemplo, pode haver problemas temporários ao recuperar dados necessários para processar uma mensagem. Ou a mensagem pode estar em um formato que o assinante não espera.
Nesta página, explicamos como lidar com essas falhas de processamento usando uma política de novas tentativas de assinatura ou encaminhando mensagens não entregues para um tópico de mensagens inativas (também conhecido como fila de mensagens inativas).
Esses recursos não são compatíveis com o Dataflow. Consulte a seção Recursos sem suporte do Pub/Sub na documentação do Dataflow para ver mais informações.
Política de repetição de assinatura
Se o Pub/Sub tentar entregar uma mensagem, mas o assinante não conseguir confirmá-la, a ferramenta vai tentar reenviar a mensagem automaticamente. Essa tentativa de reenvio é conhecida como política de nova tentativa de assinatura. Não é possível ativar ou desativar esse recurso. No entanto, você pode escolher o tipo de política de repetição que quer usar.
Ao criar e configurar sua assinatura pela primeira vez, você pode usar uma das seguintes políticas de repetição: reenvio imediato ou espera exponencial. Por padrão, as assinaturas usam a reentrega imediata.
Reenvio imediato
Por padrão, o Pub/Sub tenta reenviar a mensagem imediatamente (e possivelmente para o mesmo cliente de assinante). No entanto, se as condições que impediram a confirmação da mensagem não tiverem mudado, o reenvio imediato poderá causar problemas. Nesse caso, é possível que o Pub/Sub reenvie várias mensagens que não podem ser confirmadas.
Para resolver problemas de reenvio imediato, o Pub/Sub permite configurar uma política de espera exponencial.
Espera exponencial
A espera exponencial permite adicionar atrasos mais longos entre as tentativas de repetição. Após a primeira falha na entrega, o Pub/Sub aguarda um tempo mínimo antes de tentar novamente. Para cada falha consecutiva de mensagem, mais tempo é adicionado ao atraso, até atingir um valor máximo (0 e 600 segundos).
Os intervalos de atraso máximo e mínimo não são fixos e precisam ser configurados com base em fatores locais do aplicativo.
Observe as seguintes considerações sobre a espera exponencial:
- A espera exponencial é acionada nas seguintes ações:
- Quando uma confirmação negativa é recebida.
- Quando o prazo de confirmação de uma mensagem expira.
- O backoff exponencial é aplicado apenas por mensagem, em vez de todas as mensagens em uma assinatura (global).
- Ao usar a espera exponencial, o Pub/Sub continua a entregar outras mensagens, mesmo que as anteriores tenham recebido confirmações negativas, a menos que você esteja usando a entrega de mensagens ordenadas.
Use a política de nova tentativa para atrasar a entrega e o processamento de um subconjunto de mensagens para acomodar uma incapacidade transitória de processar algumas mensagens após a entrega. O recurso é aplicado com base no melhor esforço, e cada mensagem é avaliada separadamente para a política de nova tentativa.
Não recomendamos o uso desse recurso para introduzir atrasos intencionais na entrega de mensagens. Se você confirmar negativamente (NACK) um grande número de mensagens em uma assinatura configurada com uma política de nova tentativa, é possível que algumas dessas mensagens sejam enviadas com menos ou sem espera. O Pub/Sub também pode desacelerar a entrega de todas as mensagens se você enviar um grande número de mensagens.
Se você precisar agendar entregas, use o Cloud Tasks.
Configurar a espera exponencial
Console
Ao criar uma nova assinatura, siga as etapas a seguir para configurar uma política de repetição com espera exponencial:
No console do Google Cloud, acesse a página Assinaturas do Pub/Sub.
Clique em Criar assinatura.
No campo ID da assinatura, insira um nome.
Para saber como nomear uma assinatura, consulte as Diretrizes para nomear um tópico ou uma assinatura.
Escolha ou crie um tópico no menu suspenso.
A assinatura recebe mensagens do tópico.
Selecione um Tipo de envio.
Em Política de repetição, selecione Repetir após espera exponencial.
Insira uma Espera mínima e uma Espera máxima entre 0 e 600 segundos.
Os valores padrão são 10 segundos na espera mínima e 600 na máxima.
Clique em Criar.
gcloud
Para criar uma nova assinatura com uma política de repetição com espera exponencial, execute o comando gcloud pubsub create
com as sinalizações mostradas abaixo:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --min-retry-delay=MIN_RETRY_DELAY \ --max-retry-delay=MAX_RETRY_DELAY
Tópico de mensagens inativas
Se o serviço do Pub/Sub tentar entregar uma mensagem, mas o assinante não conseguir confirmá-la, a ferramenta vai encaminhar a mensagem não entregue a um tópico de mensagens inativas.
Como os tópicos de letra inativa funcionam com o Pub/Sub
Um tópico de mensagens inativas é uma propriedade de assinatura, e não do tópico. Isso significa que você define um tópico de mensagens inativas ao criar uma assinatura, não ao criar um tópico.
Se você criar um tópico de mensagens inativas, poderá definir as seguintes propriedades de assinatura:
Número máximo de tentativas de entrega: um valor numérico que indica o número de tentativas de entrega que o Pub/Sub faz para uma mensagem específica. Se o cliente do assinante não conseguir confirmar a mensagem no número configurado de tentativas de entrega, ela será encaminhada para um tópico de mensagens inativas.
- Valor padrão = 5
- Valor máximo = 100
- Valor mínimo = 5
Projeto com tópico de mensagens inativas: se o tópico de mensagens inativas estiver em um projeto diferente da assinatura, será preciso especificar esse projeto. Defina o tópico de mensagens inativas em um tópico diferente do tópico ao qual a assinatura está anexada.
Como o máximo de tentativas de entrega é calculado
O Pub/Sub só contabiliza as tentativas de entrega quando um tópico de mensagens inativas está configurado corretamente e inclui as permissões do IAM corretas.
O número máximo de tentativas de entrega é aproximado, porque o Pub/Sub encaminha mensagens não entregues com base no melhor esforço.
O número rastreado de tentativas de entrega de uma mensagem também pode ser redefinido para zero, principalmente para uma assinatura de pull com assinantes inativos. Como resultado, as mensagens podem ser entregues ao cliente assinante mais vezes do que o número máximo de tentativas de entrega configurado.
Configurar um tópico de mensagens inativas
Para configurar um tópico de mensagens inativas, o tópico de origem precisa ter uma assinatura. É possível especificar um tópico de mensagens inativas ao criar a assinatura ou atualizar uma assinatura existente para ter um tópico de mensagens inativas.
Confira a seguir o fluxo de trabalho para ativar a mensagem inativa em uma assinatura.
Crie o tópico de mensagens inativas. Esse tópico é separado do tópico de origem.
Defina o tópico de mensagens inativas na assinatura para o tópico de origem.
Para evitar a perda de mensagens do tópico de mensagens inativas, anexe pelo menos outra assinatura ao tópico. A assinatura secundária recebe mensagens do tópico de mensagens inativas.
Conceda as funções de editor e assinante à conta de serviço do Pub/Sub. Para mais informações, consulte Conceder permissões de encaminhamento.
Definir um tópico de mensagens inativas em uma nova assinatura
É possível criar uma assinatura e definir um tópico de mensagens inativas usando o console do Google Cloud, a Google Cloud CLI, as bibliotecas de cliente ou a API Pub/Sub.
Console
Para criar uma assinatura e definir um tópico de mensagens inativas, siga as etapas a seguir:
No console do Google Cloud, acesse a página Assinaturas.
Clique em Criar assinatura.
Insira o ID da assinatura.
Escolha ou crie um tópico no menu suspenso.
A assinatura recebe mensagens do tópico.
Na seção Mensagens mortas, selecione Ativar mensagens mortas.
Escolha ou crie um tópico de mensagens inativas no menu suspenso.
Se o tópico de mensagens inativas escolhido não tiver uma assinatura, o sistema vai solicitar que você crie uma.
No campo Máximo de tentativas de entrega, especifique um número inteiro entre 5 e 100.
Clique em Criar.
O painel de detalhes mostra uma lista de possíveis itens de ação. Se algum dos itens mostrar um ícone de erro
, clique no item de ação para resolver o problema.
gcloud
Para criar uma assinatura e definir um tópico de mensagens inativas, use o comando gcloud pubsub subscriptions create
:
gcloud pubsub subscriptions create subscription-id \ --topic=topic-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
Antes de tentar esse exemplo, siga as instruções de configuração do C++ em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C++.
C#
Antes de tentar esse exemplo, siga as instruções de configuração do C# em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C#.
Go
Antes de tentar esse exemplo, siga as instruções de configuração do Go em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Go.
Java
Antes de tentar essa amostra, siga as instruções de configuração do Java em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Java.
Node.js
Antes de tentar essa amostra, siga as instruções de configuração do Node.js em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Node.js.
Node.js
Antes de tentar essa amostra, siga as instruções de configuração do Node.js em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Node.js.
PHP
Antes de tentar esse exemplo, siga as instruções de configuração do PHP em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub PHP.
Python
Antes de tentar esse exemplo, siga as instruções de configuração do Python em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Python.
Ruby
Antes de tentar esse exemplo, siga as instruções de configuração do Ruby em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Ruby
Antes de testar esta amostra, siga as instruções de configuração do Ruby no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Definir um tópico de mensagens inativas para uma assinatura
É possível atualizar uma assinatura e definir um tópico de mensagens inativas usando o console do Google Cloud, a Google Cloud CLI, as bibliotecas de cliente ou a API Pub/Sub.
Console
Para atualizar uma assinatura e definir um tópico de mensagens inativas, siga as etapas a seguir.
No console do Google Cloud, acesse a página Assinaturas.
Ao lado da assinatura a ser atualizada, clique em Mais açõesmore_vert.
No menu de contexto, selecione Editar.
Na seção Mensagens mortas, selecione Ativar mensagens mortas.
Escolha ou crie um tópico no menu suspenso.
Se o tópico escolhido não tiver uma assinatura, o sistema vai pedir que você crie uma.
No campo Máximo de tentativas de entrega, especifique um número inteiro entre 5 e 100.
Clique em Atualizar.
O painel de detalhes mostra uma lista de possíveis itens de ação. Se algum dos itens mostrar um ícone de erro
, clique no item de ação para resolver o problema.
gcloud
Para atualizar uma assinatura e definir um tópico de mensagens inativas, use o comando gcloud pubsub subscriptions update
:
gcloud pubsub subscriptions update subscription-id \ --dead-letter-topic=dead-letter-topic-name \ [--max-delivery-attempts=max-delivery-attempts] \ [--dead-letter-topic-project=dead-letter-topic-project]
C++
Antes de tentar esse exemplo, siga as instruções de configuração do C++ em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C++.
C#
Antes de tentar esse exemplo, siga as instruções de configuração do C# em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C#.
Go
Antes de tentar esse exemplo, siga as instruções de configuração do Go em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Go.
Java
Antes de tentar essa amostra, siga as instruções de configuração do Java em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Java.
Node.js
Antes de tentar essa amostra, siga as instruções de configuração do Node.js em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Node.js.
PHP
Antes de tentar esse exemplo, siga as instruções de configuração do PHP em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub PHP.
Python
Antes de tentar esse exemplo, siga as instruções de configuração do Python em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Python.
Ruby
Antes de tentar esse exemplo, siga as instruções de configuração do Ruby em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Ruby
Antes de testar esta amostra, siga as instruções de configuração do Ruby no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Conceder papéis do IAM para usar tópicos de caixa de destino
Para encaminhar mensagens não entregues a um tópico de mensagens inativas, o Pub/Sub precisa de permissão para fazer o seguinte:
- Publicar mensagens no tópico.
- Confirmar as mensagens, o que as remove da assinatura.
O Pub/Sub cria e mantém uma conta de serviço para cada
projeto:
service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com
.
Você pode conceder permissões de encaminhamento atribuindo
papéis de editor e
assinante a essa conta de serviço.
Console
Para conceder permissão ao Pub/Sub para publicar mensagens em um tópico de mensagens inativas, siga estas etapas:
No console do Google Cloud, acesse a página Assinaturas.
Clique no nome da assinatura que tem o tópico de mensagens inativas.
Clique na guia Dead lettering.
Para atribuir uma função de editor, clique em Conceder função de editor. Se a função de editor for atribuída, você verá uma marca de seleção azul
.Para atribuir uma função de assinante, clique em Conceder função de assinante. Se a função de editor for atribuída, você verá uma marca de seleção azul
.
gcloud
Para conceder permissão para que o Pub/Sub publique mensagens no tópico de mensagens inativas, execute o comando a seguir:
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub topics add-iam-policy-binding dead-letter-topic-name \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.publisher"
Para conceder ao Pub/Sub permissão para confirmar as mensagens não entregues encaminhadas, execute o comando a seguir:
PUBSUB_SERVICE_ACCOUNT="service-project-number@gcp-sa-pubsub.iam.gserviceaccount.com" gcloud pubsub subscriptions add-iam-policy-binding subscription-id \ --member="serviceAccount:$PUBSUB_SERVICE_ACCOUNT"\ --role="roles/pubsub.subscriber"
Rastrear tentativas de entrega
Depois de ativar um tópico de mensagens inativas para uma assinatura, cada mensagem dessa assinatura terá um campo que especifica o número de tentativas de entrega:
As mensagens recebidas de uma assinatura de pull incluem o campo
delivery_attempt
.As mensagens recebidas de uma assinatura de push incluem o campo
deliveryAttempt
.
Os exemplos a seguir mostram como ver o número de tentativas de entrega:
C++
Antes de tentar esse exemplo, siga as instruções de configuração do C++ em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C++.
C#
Antes de testar esta amostra, siga as instruções de configuração do C# no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C#.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Go
Antes de testar esta amostra, siga as instruções de configuração do Go no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Go.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Java
Antes de testar esta amostra, siga as instruções de configuração do Java no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Java.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Node.js
Antes de testar esta amostra, siga as instruções de configuração do Node.js no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Node.js.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
PHP
Antes de testar esta amostra, siga as instruções de configuração do PHP no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub PHP.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Antes de testar esta amostra, siga as instruções de configuração do Python no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Python.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Ruby
Antes de testar esta amostra, siga as instruções de configuração do Ruby no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Quando o Pub/Sub encaminha uma mensagem não entregue para um tópico de mensagens inativas, ele adiciona os seguintes atributos à mensagem:
CloudPubSubDeadLetterSourceDeliveryCount
: o número de tentativas de envio para a assinatura de origem.CloudPubSubDeadLetterSourceSubscription
: o nome da assinatura de origem.CloudPubSubDeadLetterSourceSubscriptionProject
: o nome do projeto que contém a assinatura de origem.CloudPubSubDeadLetterSourceTopicPublishTime
: o carimbo de data/hora em que a mensagem foi publicada originalmente.CloudPubSubDeadLetterSourceDeliveryErrorMessage
: o motivo pelo qual a mensagem não foi entregue ao destino original. O atributo só existe para as assinaturas de exportação.
Monitorar mensagens encaminhadas
Depois de encaminhar uma mensagem não entregue, o serviço do Pub/Sub a remove da assinatura. É possível monitorar mensagens encaminhadas com o Cloud Monitoring.
Se você anexar uma assinatura ao tópico de mensagens inativas, as mensagens usarão a política de expiração da assinatura anexada, em vez do período de validade da assinatura com a propriedade de tópico de mensagens inativas.
A métrica subscription/dead_letter_message_count
registra o número de mensagens não entregues que o Pub/Sub encaminha de uma assinatura.
Para ver mais informações, consulte Como monitorar mensagens não entregues encaminhadas.
Remover um tópico de mensagens inativas
Para interromper o encaminhamento de mensagens não entregues, remova o tópico de mensagens inativas da assinatura.
Para fazer tópico de mensagens inativas, use o console do Google Cloud, a Google Cloud CLI ou a API Pub/Sub.
Console
Para remover um tópico de mensagens inativas de uma assinatura, siga as etapas a seguir:
No console do Google Cloud, acesse a página Assinaturas.
Na lista de assinaturas, clique em more_vert ao lado da assinatura para atualizar.
No menu de contexto, selecione Editar.
Na seção Mensagens mortas, desmarque Ativar mensagens mortas.
Clique em Update.
gcloud
Para remover um tópico de mensagens inativas de uma assinatura, use o comando gcloud pubsub subscriptions update
e a sinalização --clear-dead-letter-policy
:
gcloud pubsub subscriptions update subscription-id \ --clear-dead-letter-policy
C++
Antes de tentar esse exemplo, siga as instruções de configuração do C++ em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C++.
C#
Antes de tentar esse exemplo, siga as instruções de configuração do C# em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub C#.
Go
Antes de tentar esse exemplo, siga as instruções de configuração do Go em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Go.
Java
Antes de tentar essa amostra, siga as instruções de configuração do Java em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Java.
Node.js
Antes de tentar essa amostra, siga as instruções de configuração do Node.js em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Node.js.
PHP
Antes de tentar esse exemplo, siga as instruções de configuração do PHP em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub PHP.
Python
Antes de tentar esse exemplo, siga as instruções de configuração do Python em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Python.
Ruby
Antes de tentar esse exemplo, siga as instruções de configuração do Ruby em Guia de início rápido: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Ruby
Antes de testar esta amostra, siga as instruções de configuração do Ruby no Guia de início rápido do Pub/Sub: como usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Pub/Sub Ruby.
Para autenticar no Pub/Sub, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Preços
Quando o serviço do Pub/Sub encaminha mensagens não entregues, são aplicadas as taxas a seguir:
- Taxas de publicação cobradas à conta de faturamento associada ao projeto que contém o tópico de mensagens inativas.
- As taxas de assinatura de mensagens de saída são cobradas na conta de faturamento associada ao projeto que contém a assinatura com a propriedade do tópico de mensagens inativas.
Se você definir a propriedade do tópico de mensagens inativas em uma assinatura, mas a política de local de armazenamento de mensagens do tópico de mensagens inativas não permitir a região que contém a assinatura, também serão aplicadas taxas de publicação para mensagens de saída.
As taxas de publicação para mensagens de saída são cobradas no projeto que contém o tópico de mensagens inativas. Para mais informações, consulte Preços.
A seguir
- Receba as mensagens não entregues encaminhadas.
- Monitore os aplicativos Pub/Sub.
- Conheça os conceitos de entrega de mensagens.