Normalmente, as falhas de publicação são causadas por gargalos do lado do cliente, como CPUs de serviço insuficientes, estado de funcionamento dos threads deficiente ou congestionamento da rede. A política de novas tentativas do publicador define o número de vezes que o Pub/Sub tenta entregar uma mensagem e o período entre cada tentativa.
Este documento fornece informações sobre a utilização de pedidos de repetição com mensagens publicadas num tópico.
Antes de começar
Antes de configurar o fluxo de trabalho de publicação, certifique-se de que concluiu as seguintes tarefas:
- Saiba mais sobre os tópicos e o fluxo de trabalho de publicação.
- Crie um tópico.
Funções necessárias
Para receber as autorizações de que
precisa para repetir os pedidos de mensagens para um tópico,
peça ao seu administrador para lhe conceder a
função do IAM de publicador do Pub/Sub (roles/pubsub.publisher)
no tópico.
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.
Precisa de autorizações adicionais para criar ou atualizar tópicos e subscrições.
Acerca dos pedidos de repetição
As definições de repetição controlam a forma como as bibliotecas de cliente do Pub/Sub repetem os pedidos de publicação. As bibliotecas de cliente têm qualquer uma das seguintes definições de repetição:
- Limite de tempo do pedido inicial: o tempo antes de uma biblioteca de cliente deixar de aguardar a conclusão do pedido de publicação inicial.
- Atraso na nova tentativa: o tempo após o limite de tempo de um pedido que uma biblioteca do cliente aguarda para repetir o pedido.
- Tempo limite total: o tempo após o qual uma biblioteca cliente deixa de tentar novamente os pedidos de publicação.
Para repetir os pedidos de publicação, o limite de tempo inicial do pedido tem de ser inferior ao limite de tempo total. Por exemplo, se estiver a usar o recuo exponencial, as bibliotecas cliente calculam o limite de tempo da solicitação e o atraso na nova tentativa da seguinte forma:
- Após cada pedido de publicação, o limite de tempo do pedido aumenta pelo multiplicador do limite de tempo do pedido, até ao limite de tempo do pedido máximo.
- Após cada nova tentativa, o atraso da nova tentativa aumenta pelo multiplicador do atraso da nova tentativa, até ao atraso máximo da nova tentativa.
Tente novamente um pedido de mensagem
Durante o processo de publicação, pode ver falhas de publicação transitórias ou permanentes. Normalmente, não tem de tomar nenhuma ação especial para erros transitórios, uma vez que o Pub/Sub tenta novamente as mensagens automaticamente.
Também pode ocorrer um erro quando uma operação de publicação é bem-sucedida, mas o cliente do publicador não recebe a resposta de publicação a tempo. Também neste caso, a operação de publicação é repetida. Como resultado, pode ter duas mensagens idênticas com IDs de mensagens diferentes.
Em caso de erros persistentes, considere implementar ações adequadas fora do processo de publicação para evitar sobrecarregar o Pub/Sub.
As falhas de publicação são repetidas automaticamente, exceto no caso de erros que não justificam repetições. Este exemplo de código demonstra a criação de um publicador com definições de repetição personalizadas (tenha em atenção que nem todas as bibliotecas cliente suportam definições de repetição personalizadas; consulte a documentação de referência da API para o idioma escolhido):
C++
Antes de experimentar este exemplo, siga as instruções de configuração do C++ no artigo Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API C++ do Pub/Sub.
C#
Antes de experimentar este exemplo, siga as instruções de configuração do C# em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API C# do Pub/Sub.
Ir
O exemplo seguinte usa a versão principal da biblioteca de cliente Go Pub/Sub (v2). Se ainda estiver a usar a biblioteca v1, consulte o guia de migração para a v2. Para ver uma lista de exemplos de código da v1, consulte os exemplos de código descontinuados.
Antes de experimentar este exemplo, siga as instruções de configuração do Go em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Go do Pub/Sub.
Java
Antes de experimentar este exemplo, siga as instruções de configuração do Java no artigo Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Java do Pub/Sub.
Node.js
Antes de experimentar este exemplo, siga as instruções de configuração do Node.js em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js do Pub/Sub.
Node.js
Antes de experimentar este exemplo, siga as instruções de configuração do Node.js em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js do Pub/Sub.
Python
Antes de experimentar este exemplo, siga as instruções de configuração do Python em Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Python Pub/Sub.
Volte a tentar os pedidos com chaves de ordenação
Suponhamos que tem um único cliente publicador. Está a usar as bibliotecas cliente do Pub/Sub para publicar as mensagens 1, 2 e 3 para a mesma chave de ordenação A. Agora, suponha que o cliente publicador não recebe a resposta publicada para a mensagem 1 antes de o prazo do RPC expirar. A mensagem 1 tem de ser republicada. A sequência de mensagens recebidas pelo cliente subscritor torna-se 1, 1, 2 e 3, se assumir que a mensagem 2 é publicada apenas depois de a mensagem 1 ser concluída com êxito. Cada mensagem publicada tem o seu próprio ID de mensagem. Do ponto de vista do cliente subscritor, foram publicadas quatro mensagens, sendo que as duas primeiras tinham conteúdo idêntico.
As novas tentativas de pedidos de publicação com chaves de ordenação também podem ser complicadas pelas definições de lote. A biblioteca de cliente agrupa as mensagens para uma publicação mais eficiente. Continuando com o exemplo anterior, vamos assumir que as mensagens 1 e 2 são processadas em conjunto. Este lote é enviado para o servidor como um único pedido. Se o servidor não devolver uma resposta a tempo, o cliente do publicador tenta novamente este lote de duas mensagens. Por conseguinte, é possível que o cliente subscritor receba as mensagens 1, 2, 1, 2 e 3. Se usar uma biblioteca de cliente do Pub/Sub para publicar mensagens por ordem e uma operação de publicação falhar, o serviço falha as operações de publicação de todas as mensagens restantes na mesma chave de ordenação. Em seguida, um cliente editor pode decidir seguir qualquer uma das seguintes operações:
Volte a publicar todas as mensagens com falhas pela ordem
Volte a publicar um subconjunto das mensagens com falhas por ordem
Publicar um novo conjunto de mensagens
Se ocorrer um erro não repetível, a biblioteca de cliente não publica a mensagem e para de publicar outras mensagens com a mesma chave de ordenação. Por exemplo, quando um publicador envia uma mensagem para um tópico que não existe, ocorre um erro não repetível. Para continuar a publicar mensagens com a mesma chave de ordenação, chame um método para retomar a publicação e, em seguida, comece a publicar novamente.
O exemplo seguinte mostra como retomar a publicação de mensagens com a mesma chave de ordenação.
C++
Antes de experimentar este exemplo, siga as instruções de configuração do C++ no artigo Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API C++ do Pub/Sub.
C#
Antes de experimentar este exemplo, siga as instruções de configuração do C# em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API C# do Pub/Sub.
Ir
O exemplo seguinte usa a versão principal da biblioteca de cliente Go Pub/Sub (v2). Se ainda estiver a usar a biblioteca v1, consulte o guia de migração para a v2. Para ver uma lista de exemplos de código da v1, consulte os exemplos de código descontinuados.
Antes de experimentar este exemplo, siga as instruções de configuração do Go em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Go do Pub/Sub.
Java
Antes de experimentar este exemplo, siga as instruções de configuração do Java no artigo Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Java do Pub/Sub.
Node.js
Antes de experimentar este exemplo, siga as instruções de configuração do Node.js em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Node.js do Pub/Sub.
Python
Antes de experimentar este exemplo, siga as instruções de configuração do Python em Início rápido: usar bibliotecas cliente. Para mais informações, consulte a documentação de referência da API Python Pub/Sub.
Ruby
O exemplo seguinte usa a biblioteca cliente Ruby Pub/Sub v3. Se ainda estiver a usar a biblioteca v2, consulte o guia de migração para a v3. Para ver uma lista de exemplos de código do Ruby v2, consulte os exemplos de código descontinuados.
Antes de experimentar este exemplo, siga as instruções de configuração do Ruby em Início rápido: usar bibliotecas de cliente. Para mais informações, consulte a documentação de referência da API Ruby Pub/Sub.
O que se segue?
Para saber como configurar opções de publicação avançadas, consulte o seguinte: