As falhas de publicação geralmente são causadas por gargalos do lado do cliente, como CPUs de serviço insuficientes, integridade da linha de execução ruim ou congestionamento da rede. A política de nova tentativa do editor define o número de vezes que o Pub/Sub tenta entregar uma mensagem e o tempo entre cada tentativa.
Este documento fornece informações sobre como usar solicitações de nova tentativa com mensagens publicadas em um tópico.
Antes de começar
Antes de configurar o fluxo de trabalho de publicação, verifique se você concluiu as seguintes tarefas:
- Saiba mais sobre temas e o fluxo de trabalho de publicação.
- Crie um tópico.
Funções exigidas
Para receber as permissões necessárias para repetir as solicitações de mensagem em um tópico,
peça ao administrador que conceda a você o
Público do Pub/Sub (roles/pubsub.publisher
) do IAM no tópico.
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.
Você precisa de permissões adicionais para criar ou atualizar tópicos e assinaturas.
Sobre as solicitações de nova tentativa
As configurações de nova tentativa controlam como as bibliotecas de cliente do Pub/Sub tentam publicar solicitações novamente. As bibliotecas de cliente têm alguma das seguintes configurações de repetição:
- Tempo limite da solicitação inicial: o tempo antes de uma biblioteca de cliente parar de esperar a conclusão da solicitação de publicação inicial.
- Atraso de nova tentativa: quanto tempo após uma solicitação atingir o tempo limite em que uma biblioteca de cliente aguarda a nova tentativa de solicitação.
- Tempo limite total: quanto tempo depois de uma biblioteca de cliente parar de tentar publicar as solicitações novamente.
Para tentar publicar as solicitações novamente, o tempo limite da solicitação inicial precisa ser menor que o tempo limite total. Por exemplo, se você estiver usando espera exponencial, as bibliotecas de cliente calculam o tempo limite da solicitação e o atraso de nova tentativa da seguinte maneira:
- Após cada solicitação de publicação, o tempo limite da solicitação aumenta de acordo com o multiplicador de tempo limite da solicitação, até atingir o tempo limite máximo.
- Após cada nova tentativa, o tempo de atraso para a nova tentativa aumenta de acordo com o multiplicador de atraso máximo, até o atraso máximo de nova tentativa.
Tentar novamente uma solicitação de mensagem
Durante o processo de publicação, podem ocorrer falhas temporárias ou permanentes. Para erros temporários, geralmente não é necessário realizar nenhuma ação especial, já que o Pub/Sub tenta enviar as mensagens novamente automaticamente.
Um erro também pode ocorrer quando uma operação de publicação é bem-sucedida, mas a resposta de publicação não é recebida a tempo pelo cliente do editor. Nesse caso, a operação de publicação é repetida. Como resultado, é possível ter duas mensagens idênticas com IDs diferentes.
Em caso de erros persistentes, implemente ações adequadas fora do processo de publicação para evitar o excesso de Pub/Sub.
As falhas de publicação são automaticamente reenviadas, exceto para erros que não justifiquem novas tentativas. Este exemplo de código demonstra a criação de um editor com configurações de reenvio personalizadas. Nem todas as bibliotecas de cliente são compatíveis com essas configurações. Consulte a documentação de referência da API para a linguagem escolhida.
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.
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.
Tentar novamente solicitações com chaves de ordenação
Suponha que você tenha um único cliente de editor. Você está usando as bibliotecas de cliente do Pub/Sub para publicar as mensagens 1, 2 e 3 para a mesma chave de ordenação A. Agora, suponha que a resposta publicada para a mensagem 1 não seja recebida pelo cliente do editor antes que o prazo do RPC expire. A mensagem 1 precisa ser republicada. A sequência de mensagens recebidas pelo cliente do assinante passa a ser 1, 1, 2 e 3, se você presumir que a mensagem 2 é publicada somente depois que a mensagem 1 for concluída. Cada mensagem publicada tem seu próprio ID. Do ponto de vista do cliente do assinante, quatro mensagens foram publicadas, sendo que as duas primeiras têm conteúdo idêntico.
A repetição de solicitações de publicação com chaves de ordem também pode ser complicada pelas configurações em lote. A biblioteca de cliente agrupa mensagens para uma publicação mais eficiente. Continue com o exemplo anterior e suponha que as mensagens 1 e 2 sejam agrupadas. Esse lote é enviado ao servidor como uma única solicitação. Se o servidor não conseguir retornar uma resposta a tempo, o cliente do editor vai tentar novamente esse lote de duas mensagens. Portanto, é possível que o cliente assinante receba as mensagens 1, 2, 1, 2 e 3. Se você usar uma biblioteca de cliente do Pub/Sub para publicar mensagens em ordem e uma operação de publicação falhar, o serviço vai falhar nas operações de publicação de todas as mensagens restantes na mesma chave de ordenação. Um cliente do editor pode decidir seguir uma das seguintes operações:
Retornar todas as mensagens com falhas na ordem
Republique um subconjunto das mensagens com falhas na ordem
Publicar um novo conjunto de mensagens
Se ocorrer um erro não passível de repetição, a biblioteca de cliente não publicará a mensagem e interromperá a publicação de outras mensagens com a mesma chave de ordem. Por exemplo, quando um editor envia uma mensagem para um tópico que não existe, ocorre um erro que não pode ser repetido. Para continuar publicando mensagens com a mesma chave de ordem, chame um método para retomar a publicação e comece a publicar novamente.
O exemplo a seguir mostra como retomar a publicação de mensagens com a mesma chave de ordem.
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.
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.
A seguir
Para saber como configurar opções avançadas de publicação, consulte: