Filtre mensagens de uma subscrição

Esta página explica como criar subscrições do Pub/Sub com filtros.

Quando recebe mensagens de uma subscrição com um filtro, só recebe as mensagens que correspondem ao filtro. O serviço Pub/Sub acusa automaticamente a receção das mensagens que não correspondem ao filtro. Pode filtrar mensagens pelos respetivos atributos, mas não pelos dados na mensagem.

Pode ter várias subscrições associadas a um tópico, e cada subscrição pode ter um filtro diferente.

Por exemplo, se tiver um tópico que recebe notícias de diferentes partes do mundo, pode configurar uma subscrição para filtrar notícias publicadas apenas numa região específica. Para esta configuração, tem de garantir que um dos atributos da mensagem do tópico transmite a região da publicação de notícias.

Quando recebe mensagens de uma subscrição com um filtro, não incorre em taxas de mensagens de saída para as mensagens que o Pub/Sub reconhece automaticamente. Incorre em taxas de entrega de mensagens e taxas de armazenamento relacionadas com a procura para estas mensagens.

Crie uma subscrição com um filtro

As subscrições de obtenção e emissão podem ter filtros. Todos os subscritores podem receber mensagens de subscrições com filtros, incluindo subscritores que usam a API StreamingPull.

Pode criar uma subscrição com um filtro através da Google Cloud consola, da CLI Google Cloud, das bibliotecas de cliente ou da API Pub/Sub.

Consola

Para criar uma subscrição de obtenção com um filtro, siga estes passos:

  1. Na Google Cloud consola, aceda à página Subscrições.

    Aceda à página Subscrições

  2. Clique em Criar subscrição.

  3. Introduza o ID da subscrição.

  4. Escolha ou crie um tópico no menu pendente. A subscrição recebe mensagens do tópico.

  5. Na secção Filtro de subscrição, introduza a expressão de filtro.

  6. Clique em Criar.

Para criar uma subscrição push com um filtro, siga estes passos:

  1. Na Google Cloud consola, aceda à página Subscrições.

    Aceda à página Subscrições

  2. Clique em Criar subscrição.

  3. Introduza o ID da subscrição.

  4. Escolha ou crie um tópico no menu pendente. A subscrição recebe mensagens do tópico.

  5. Na secção Tipo de fornecimento, clique em Push.

  6. No campo URL do ponto final, introduza o URL do ponto final de envio.

  7. Na secção Filtro de subscrição, introduza a expressão de filtro.

  8. Clique em Criar.

gcloud

Para criar uma subscrição de obtenção com um filtro, use o comando gcloud pubsub subscriptions create com a flag --message-filter:

gcloud pubsub subscriptions create SUBSCRIPTION_ID \
  --topic=TOPIC_ID \
  --message-filter='FILTER'

Substitua o seguinte:

  • SUBSCRIPTION_ID: o ID da subscrição a criar
  • TOPIC_ID: o ID do tópico a anexar à subscrição
  • FILTER: uma expressão na sintaxe de filtragem

Para criar uma subscrição push com um filtro, use o comando gcloud pubsub subscriptions create com as flags --push-endpoint e --message-filter:

gcloud pubsub subscriptions create SUBSCRIPTION_ID \
  --topic=TOPIC_ID \
  --push-endpoint=PUSH_ENDPOINT \
  --message-filter='FILTER'

Substitua o seguinte:

  • SUBSCRIPTION_ID: o ID da subscrição a criar
  • TOPIC_ID: o ID do tópico a anexar à subscrição
  • PUSH_ENDPOINT: o URL do servidor no qual o subscritor de envio por push é executado
  • FILTER: uma expressão na sintaxe de filtragem

REST

Para criar uma subscrição com um filtro, 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 o seguinte:

  • PROJECT_ID: o ID do projeto no qual criar a subscrição
  • SUBSCRIPTION_ID: o ID da subscrição a criar

Para criar uma subscrição de obtenção com um filtro, especifique o filtro no corpo do pedido:

{
  "topic": "projects/PROJECT_ID/topics/TOPIC_ID",
  "filter": "FILTER"
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto com o tópico
  • TOPIC_ID: o ID do tópico a anexar à subscrição
  • FILTER: uma expressão na sintaxe de filtragem

Para criar uma subscrição push com um filtro, especifique o ponto final push e o filtro no corpo do pedido:

{
  "topic": "projects/PROJECT_ID/topics/TOPIC_ID",
  "pushConfig": {
    "pushEndpoint": "PUSH_ENDPOINT"
  },
  "filter": "FILTER"
}

Substitua o seguinte:

  • PROJECT_ID: o ID do projeto com o tópico
  • TOPIC_ID: o ID do tópico a anexar à subscrição
  • PUSH_ENDPOINT: o URL do servidor no qual o subscritor de envio por push é executado
  • FILTER: uma expressão na sintaxe de filtragem

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.

namespace pubsub = ::google::cloud::pubsub;
namespace pubsub_admin = ::google::cloud::pubsub_admin;
[](pubsub_admin::SubscriptionAdminClient client,
   std::string const& project_id, std::string topic_id,
   std::string subscription_id) {
  google::pubsub::v1::Subscription request;
  request.set_name(
      pubsub::Subscription(project_id, std::move(subscription_id))
          .FullName());
  request.set_topic(
      pubsub::Topic(project_id, std::move(topic_id)).FullName());
  request.set_filter(R"""(attributes.is-even = "false")""");
  auto sub = client.CreateSubscription(request);
  if (sub.status().code() == google::cloud::StatusCode::kAlreadyExists) {
    std::cout << "The subscription already exists\n";
    return;
  }
  if (!sub) throw std::move(sub).status();

  std::cout << "The subscription was successfully created: "
            << sub->DebugString() << "\n";
}

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.


using Google.Cloud.PubSub.V1;
using Grpc.Core;

public class CreateSubscriptionWithFilteringSample
{
    public Subscription CreateSubscriptionWithFiltering(string projectId, string topicId, string subscriptionId, string filter)
    {
        SubscriberServiceApiClient subscriber = SubscriberServiceApiClient.Create();
        TopicName topicName = TopicName.FromProjectTopic(projectId, topicId);
        SubscriptionName subscriptionName = SubscriptionName.FromProjectSubscription(projectId, subscriptionId);
        Subscription subscription = null;

        var subscriptionRequest = new Subscription
        {
            SubscriptionName = subscriptionName,
            TopicAsTopicName = topicName,
            Filter = filter
        };

        try
        {
            subscription = subscriber.CreateSubscription(subscriptionRequest);
        }
        catch (RpcException e) when (e.Status.StatusCode == StatusCode.AlreadyExists)
        {
            // Already exists.  That's fine.
        }
        return subscription;
    }
}

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 Pub/Sub.

import (
	"context"