Os assinantes podem não conseguir processar mensagens por vários motivos. Para 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.
Esta página explica como lidar com essas falhas de processamento usando uma política de nova tentativa de assinatura ou encaminhando mensagens não entregues a um tópico de mensagens inativas (também conhecida 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 confirmar o recebimento dela, o Pub/Sub tentará reenviar a mensagem automaticamente. Essa tentativa de reenvio é conhecida como política de nova tentativa de assinatura. Não está um recurso que pode ser ativado ou desativado. No entanto, é possível escolher o tipo de nova tentativa a política que você 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 reconhecidas.
Para resolver problemas imediatos de reenvio, o Pub/Sub permite configurar uma política de espera exponencial.
Espera exponencial
A espera exponencial permite adicionar atrasos mais longos entre as novas tentativas. Após a primeira falha na entrega, o Pub/Sub aguarda um tempo mínimo de espera antes de tentar novamente. Para cada falha consecutiva de mensagem, mais tempo será adicionado ao atraso até um 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 na 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 a entrega de mensagens. Se você reconhecer negativamente (nack) um grande número de mensagens em uma assinatura configurada com uma política de repetição, é possível que algumas delas serão entregues com pouca ou nenhuma espera. O Pub/Sub também pode retardar a entrega de todas as mensagens se você receber um grande número de mensagens.
Se você precisar agendar entregas, considere usar Cloud Tasks:
Configurar 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, digite um nome.
Para saber mais sobre como nomear uma assinatura, consulte 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 Tentar novamente após a 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 Pub/Sub tentar entregar uma mensagem, mas o assinante não reconhecê-lo, o Pub/Sub pode encaminhar não entregue a um tópico de mensagens inativas.
Como os tópicos de mensagens inativas funcionam com o Pub/Sub
Um tópico de mensagens inativas é uma propriedade de assinatura, não é uma propriedade de 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 o número de tentativas de entrega que o Pub/Sub para uma mensagem específica. Se o cliente assinante não puder confirmar a dentro do número configurado de tentativas de entrega, ela será encaminhados 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 para um tópico diferente do tópico para a que 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 mensagem inativa 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 como zero, especialmente para assinaturas 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 mensagens inativas 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 os papéis de editor e assinante ao Pub/Sub conta de serviço. 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 a 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 solicitará criar um.
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 atual
É possível atualizar uma assinatura e definir um tópico de mensagens inativas usando o console do Google Cloud, a CLI do Google Cloud, 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 ações necessárias. Se algum dos os itens mostram um ícone de erro
, clique o 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 API Ruby do Pub/Sub documentação de referência.
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 carta morta.
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 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, todas as mensagens dessa assinatura tem um campo que especifica o número de tentativas de entrega:
As mensagens recebidas de uma assinatura de pull incluem o
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 este exemplo, siga as instruções de configuração do C# na Guia de início rápido do Pub/Sub usando 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 este exemplo, siga as instruções de configuração do Go na Guia de início rápido do Pub/Sub usando 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 este exemplo, siga as instruções de configuração do Java na Guia de início rápido do Pub/Sub usando bibliotecas de cliente. Para mais informações, consulte a API Java do Pub/Sub documentação de referência.
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 este exemplo, siga as instruções de configuração do Node.js na Guia de início rápido do Pub/Sub usando bibliotecas de cliente. Para mais informações, consulte a API Node.js do Pub/Sub documentação de referência.
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 este exemplo, siga as instruções de configuração do Python na Guia de início rápido do Pub/Sub usando 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 este exemplo, siga as instruções de configuração do Ruby na Guia de início rápido do Pub/Sub usando 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 entrega à assinatura de origem.CloudPubSubDeadLetterSourceSubscription
: o nome da origem assinatura.CloudPubSubDeadLetterSourceSubscriptionProject
: o nome do projeto que contém a assinatura de origem.CloudPubSubDeadLetterSourceTopicPublishTime
: o carimbo de data/hora em que a mensagem foi originalmente publicada.CloudPubSubDeadLetterSourceDeliveryErrorMessage
: o motivo pelo qual a mensagem não foi entregue ao destino original. O atributo só existe para exportar assinaturas.
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.
É possível remover um tópico de mensagens inativas de uma assinatura usando o 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.
- Taxas de assinatura para mensagens enviadas faturadas na conta de faturamento associadas ao projeto que contém a assinatura com o 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.