Nesta página, explicamos como receber e confirmar mensagens usando o tipo "exatamente uma vez" semântica. Só o tipo de assinatura pull aceita a entrega exatamente uma vez, incluindo assinantes que usam API StreamingPull.
Enviar e exportar inscrições não são compatíveis com a entrega exatamente uma vez.
Versões recomendadas da biblioteca de cliente
- Para ter o melhor desempenho, use a versão mais recente da biblioteca de cliente, Python v2.13.6 ou mais recente, Java versão 1.120.11 ou mais recente, PHP v1.39.0 ou mais recente, C# versão 3.2.0 ou mais recente, C++ v2.1.0, Ir v1.25.1 ou mais recente, Nó v3.2.0 ou mais recente e Ruby v2.12.1 ou mais recente.
Entrega "exatamente uma vez"
O Pub/Sub dá suporte à entrega exatamente uma vez, em uma região da nuvem, com base em um serviço exclusivo definido pelo Pub/Sub ID da mensagem.
Quando o recurso está ativado, o Pub/Sub fornece o seguinte:
Nenhum reenvio ocorre após a confirmação da mensagem.
Nenhum reenvio ocorre enquanto uma mensagem está pendente. Uma mensagem é considerada pendente até que o prazo de confirmação expire ou a mensagem seja confirmado.
No caso de várias entregas válidas, devido ao prazo de confirmação ou confirmação negativa iniciada pelo cliente, somente o o ID de confirmação pode ser usado para confirmar a mensagem. Todas as solicitações com um ID de confirmação anterior.
Reenvio versus cópia
É importante entender a diferença entre esperado e inesperado novos envios.
Um reenvio pode ocorrer devido a ações negativas iniciadas pelo cliente. confirmação de uma mensagem ou quando o cliente não estende a confirmação prazo final da mensagem antes que o prazo de confirmação expire. Reenvios são considerados válidos e o sistema funciona como pretendido.
Para resolver problemas com resgates, consulte Como lidar com cópias.
Uma cópia é quando uma mensagem é reenviada após uma confirmação bem-sucedida. ou antes do vencimento do prazo de confirmação.
Uma mensagem reenviada mantém o mesmo ID entre as tentativas de reenvio.
As assinaturas com a opção "Exatamente uma vez" ativada não recebem cópias entregas.
Suporte de entrega única em bibliotecas de cliente
As bibliotecas de cliente compatíveis têm uma interface de confirmação com resposta Por exemplo: Go. Use essa interface para verificar se a solicitação de confirmação foi bem-sucedida. Se a solicitação de confirmação for bem-sucedida, os clientes têm a garantia de não receberão uma nova entrega. Se a solicitação de confirmação falhar, o os clientes podem esperar uma re-entrega.
Os clientes também podem usar as bibliotecas de cliente compatíveis sem as de confirmação de identidade virtual. No entanto, nesses casos, as falhas de confirmação podem levar a novas entregas silenciosas.
As bibliotecas de cliente suportadas têm interfaces para configurar o mínimo tempo de extensão do lease (exemplo: Go). Defina o valor da extensão de locação mínima como um número alto para evitar expirações de confirmação relacionadas à rede. O valor máximo é definido como 600 segundos.
Os valores e o intervalo padrão para as variáveis relacionadas à entrega "exatamente uma vez" e os nomes das variáveis podem diferir entre as bibliotecas de cliente. Para exemplo, na biblioteca de cliente Java, as seguintes variáveis controlam "exatamente uma vez".
Variável | Descrição | Valor |
---|---|---|
setEnableExactlyOnceDelivery |
Ativa ou desativa a entrega "exatamente uma vez". | verdadeiro ou falso Padrão=false |
minDurationPerAckExtension |
O tempo mínimo em segundos a ser usado para estender o prazo de confirmação de modificação. | Intervalo=0 a 600 Padrão=nenhum |
maxDurationPerAckExtension |
O tempo máximo em segundos a ser usado para estender o prazo de confirmação de modificação. | Intervalo=0 a 600 Padrão=nenhum |
No caso de uma única entrega, a modifyAckDeadline
ou a acknowledgment
solicitação ao Pub/Sub falha quando o ID de confirmação já expirou. Dessa forma,
casos, o serviço considera o ID de confirmação expirado como inválido, já que um
uma nova entrega pode já estar em andamento. Isso ocorre por padrão para o tipo "exatamente uma vez"
entrega. Você verá que as solicitações acknowledgment
e ModifyAckDeadline
retornam um
Resposta INVALID_ARGUMENT
. Quando a entrega exatamente uma vez está desativada, esses
As solicitações retornam OK
nos casos de IDs de confirmação expirados.
Para garantir que as solicitações acknowledgment
e ModifyAckDeadline
tenham
de confirmação de identidade, defina o valor para
minDurationPerAckExtension
como um número alto.
Criar assinaturas com entrega única
É possível criar uma assinatura com entrega única usando o console do Google Cloud, a Google Cloud CLI, a biblioteca de cliente ou a API Pub/Sub.
Assinatura de pull
Console
Para criar uma assinatura de pull com entrega única, siga estas etapas:
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 Entrega exatamente uma vez, selecione Ativar a entrega exatamente uma vez.
Clique em Criar.
gcloud
Para criar uma assinatura de pull com entrega única, use o
gcloud pubsub subscriptions create
com a sinalização --enable-exactly-once-delivery
:
gcloud pubsub subscriptions create SUBSCRIPTION_ID \ --topic=TOPIC_ID \ --enable-exactly-once-delivery
Substitua:
- SUBSCRIPTION_ID: o ID da assinatura a ser criada
- TOPIC_ID: o ID do tópico a ser anexado à assinatura
REST
Para criar uma assinatura com entrega única, use o método
projects.subscriptions.create
.
PUT https://pubsub.googleapis.com/v1/projects/PROJECT_ID/subscriptions/SUBSCRIPTION_ID Authorization: Bearer $(gcloud auth print-access-token)
Substitua:
- PROJECT_ID: o ID do projeto para criar a assinatura
- SUBSCRIPTION_ID: o ID da assinatura a ser criada
Para criar uma assinatura de pull com entrega única, especifique este no corpo da solicitação:
{ "topic": "projects/PROJECT_ID/topics/TOPIC_ID", "enableExactlyOnceDelivery": true, }
Substitua:
- PROJECT_ID: o ID do projeto com o tópico
- TOPIC_ID: o ID do tópico a ser anexado à assinatura
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.
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.
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.
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.
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.
Assine com entrega de mensagens exatamente uma vez
Veja a seguir alguns exemplos de código para assinatura com entrega única usando a biblioteca de cliente.
Assinatura de pull
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 API Go 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.
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 este exemplo, siga as instruções de configuração do PHP na Guia de início rápido do Pub/Sub usando bibliotecas de cliente. Para mais informações, consulte a API PHP 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.
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 API Python 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.
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 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.
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 API C++ 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.
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 API C# 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 (TypeScript)
Antes de testar esta amostra, 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 Pub/Sub Node.js 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.
Monitorar assinaturas de entrega única
O
subscription/exactly_once_warning_count
registra o número de eventos
pode resultar em novos resgates (válidos ou duplicados). Essa métrica contabiliza
vezes que o Pub/Sub não processa solicitações associadas
de confirmação (solicitação ModifyAckDeadline
ou acknowledgment
). Os motivos
a falha pode ser baseada no servidor ou no cliente. Por exemplo, se a persistência
usada para manter a informação de entrega "exatamente uma vez" indisponível, ela
é um evento baseado em servidor. Se o cliente tentar confirmar uma mensagem com
um ID de confirmação inválido, seria um evento baseado em cliente.
Entender a métrica
subscription/exactly_once_warning_count
captura eventos que podem ou não
levam a reenvios reais e podem gerar ruído com base no comportamento do cliente. Para
exemplo: solicitações acknowledgment
ou ModifyAckDeadline
repetidas com erros
de confirmação incrementam a métrica repetidamente.
As métricas a seguir também são úteis para entender o comportamento do cliente:
subscription/expired_ack_deadlines_count
mostra o número de expirações do ID de confirmação. Reconhecimento As expirações dos ID podem levar a falhas paraModifyAckDeadline
eacknowledgment
solicitações.service.serviceruntime.googleapis.com/api/request_count
pode ser usada para capturar falhas deModifyAckDeadline
ouacknowledgment
quando elas chegam ao Google Cloud, mas não alcançar o Pub/Sub. Há falhas nas quais esta métrica não capture, por exemplo, quando os clientes são desconectados do Google Cloud.
Na maioria dos casos de falha que podem ser repetidas, as bibliotecas de cliente com suporte repetir a solicitação automaticamente.
Cotas
As assinaturas de entrega única estão sujeitas a cota adicional e cumprimento de requisitos regulatórios. Essas cotas são aplicadas a:
- Número de mensagens consumidas de assinaturas com entrega exatamente uma vez ativados por região.
- Número de mensagens confirmadas ou que têm o prazo estendido ao usar o assinaturas com a entrega única ativada por região.
Para obter mais informações sobre essas cotas, consulte a tabela na Cotas.
Entrega exatamente uma vez e assinaturas solicitadas
O Pub/Sub aceita entregas únicas com entrega ordenada.
Ao usar pedidos com entrega única, o Pub/Sub espera que as confirmações estejam em ordem. Se as confirmações estiverem fora de ordem, falha nas solicitações com erros temporários. Se o prazo de confirmação expire antes de uma confirmação em ordem para a entrega, o cliente receber uma nova entrega da mensagem. Por isso, quando você usa pedidos com uma única entrega, a capacidade de processamento do cliente é limitada a um pedido de mil mensagens por segundo.
Assinaturas de entrega e push exatamente uma vez
O Pub/Sub aceita entrega única apenas com assinaturas de pull.
Os clientes que consomem mensagens de assinaturas de push confirmam as mensagens respondendo às solicitações de push com uma resposta bem-sucedida. No entanto, os clientes não saber se a assinatura do Pub/Sub recebeu a resposta o processou. Isso é diferente das assinaturas de pull, em que a confirmação as solicitações são iniciadas pelos clientes e pela assinatura do Pub/Sub responde se a solicitação foi processada com sucesso. Por isso, semântica de entrega "exatamente uma vez" não se alinha bem com assinaturas de push.
Informações úteis
Se o prazo de confirmação não for especificado no momento de CreateSubscription, as assinaturas com a entrega ativada exatamente uma vez terão uma confirmação padrão de 60 segundos.
Prazos de confirmação padrão mais longos são benéficos para evitar reenvio causado por eventos de rede. As bibliotecas de cliente compatíveis não usam e o prazo padrão de confirmação da assinatura.
As assinaturas de entrega única têm um aumento significativa latência de publicação para inscrição em comparação com as assinaturas regulares.
Se você precisar de alta capacidade, seus clientes de entrega única também precisarão usar o pull de streaming.
Uma assinatura pode receber várias cópias da mesma mensagem devido a cópias laterais de publicação, mesmo com a entrega "exatamente uma vez" ativada. As duplicatas da publicação podem ocorrer devido a várias tentativas únicas de publicação pelo cliente de publicação ou o serviço do Pub/Sub. Várias publicações únicas pelo cliente editor, em novas tentativas, levam a reenvios com IDs de mensagem diferentes. Várias publicações únicas feitas pelo serviço Pub/Sub para responder a uma solicitação de publicação do cliente leva a reenvios com os mesmos IDs de mensagem.
É possível repetir falhas em
subscription/exactly_once_warning_count
, e as bibliotecas de cliente compatíveis repetirão essas tentativas automaticamente. No entanto, as falhas relacionadas a IDs de confirmação inválidos não podem ser repetida.