Compactar mensagens

Se você estiver usando o Pub/Sub para publicar mensagens que tenham muitos dados, poderá usar o gRPC para compactar os dados e economizar custos de rede antes que o cliente editor envie a solicitação de publicação. A compactação do Pub/Sub para gRPC usa o algoritmo Gzip.

Neste documento, você encontra informações sobre a compactação de mensagens publicadas em um tópico.

Sobre a compactação de mensagens

A taxa de compactação para uso do recurso de compactação do lado do cliente gRPC é diferente para diferentes clientes do editor e depende dos seguintes fatores:

  • Quantidade de dados. A taxa de compactação melhora quando o tamanho do payload aumenta de algumas centenas de bytes para muitos kilobytes de dados. As configurações em lote de uma solicitação de publicação decidem a quantidade de dados que será incluída em cada solicitação de publicação. Recomendamos ativar as configurações de lote em conjunto com a compactação do gRPC para conseguir os melhores resultados.

  • Tipo de dados. Dados baseados em texto, como JSON ou XML, são mais compactáveis em comparação com dados binários, como imagens.

Se o cliente do editor estiver no Google Cloud, use a métrica Bytes enviados (instance/network/sent_bytes_count) para medir a capacidade de publicação em bytes. Se o cliente editor estiver em um aplicativo diferente, será necessário usar as ferramentas específicas do cliente para fazer a medição.

O exemplo de código nesta seção apresenta um exemplo de snippet de código da biblioteca de cliente Java que também inclui compactação gRPC.

Antes de começar

Antes de configurar o fluxo de trabalho de publicação, conclua as seguintes tarefas:

Funções exigidas

Para receber as permissões necessárias para compactar mensagens, peça ao administrador que conceda a você o papel do IAM de Editor do Pub/Sub (roles/pubsub.publisher) no tópico. Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

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.

Compactar uma mensagem

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++.

namespace g = ::google::cloud;
namespace pubsub = ::google::cloud::pubsub;
[](std::string project_id, std::string topic_id) {
  auto topic = pubsub::Topic(std::move(project_id), std::move(topic_id));
  auto publisher = pubsub::Publisher(pubsub::MakePublisherConnection(
      std::move(topic),
      g::Options{}
          // Compress any batch of messages over 10 bytes. By default, no
          // messages are compressed, set this to 0 to compress all batches,
          // regardless of their size.
          .set<pubsub::CompressionThresholdOption>(10)
          // Compress using the GZIP algorithm. By default, the library uses
          // GRPC_COMPRESS_DEFLATE.
          .set<pubsub::CompressionAlgorithmOption>(GRPC_COMPRESS_GZIP)));
  auto message_id = publisher.Publish(
      pubsub::MessageBuilder{}.SetData("Hello World!").Build());
  auto done = message_id.then([](g::future<g::StatusOr<std::string>> f) {
    auto id = f.get();
    if (!id) throw std::move(id).status();
    std::cout << "Hello World! published with id=" << *id << "\n";
  });
  // Block until the message is published
  done.get();
}

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.

import com.google.api.core.ApiFuture;
import com.google.cloud.pubsub.v1.Publisher;
import com.google.protobuf.ByteString;
import com.google.pubsub.v1.PubsubMessage;
import com.google.pubsub.v1.TopicName;
import java.io.IOException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;

public class PublishWithGrpcCompressionExample {
  public static void main(String... args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    // Choose an existing topic.
    String topicId = "your-topic-id";

    publishWithGrpcCompressionExample(projectId, topicId);
  }

  public static void publishWithGrpcCompressionExample(String projectId, String topicId)
      throws IOException, ExecutionException, InterruptedException {
    TopicName topicName = TopicName.of(projectId, topicId);

    // Create a publisher and set enable compression to true.
    Publisher publisher = null;
    try {
      // Enable compression and configure the compression threshold to 10 bytes (default to 240 B).
      // Publish requests of sizes > 10 B (excluding the request headers) will get compressed.
      // The number of messages in a publish request is determined by publisher batch settings.
      // Batching is turned off by default, i.e. each publish request contains only one message.
      publisher =
          Publisher.newBuilder(topicName)
              .setEnableCompression(true)
              .setCompressionBytesThreshold(10L)
              .build();

      byte[] bytes = new byte[1024];
      ByteString data = ByteString.copyFrom(bytes);
      PubsubMessage pubsubMessage = PubsubMessage.newBuilder().setData(data).build();

      // Once published, returns a server-assigned message id (unique within the topic).
      // You can look up the actual size of the outbound data using the Java Logging API.
      // Configure logging properties as shown in
      // https://github.com/googleapis/java-pubsub/tree/main/samples/snippets/src/main/resources/logging.properties
      // and look for "OUTBOUND DATA" with "length=" in the output log.
      ApiFuture<String> messageIdFuture = publisher.publish(pubsubMessage);
      String messageId = messageIdFuture.get();
      System.out.println("Published a compressed message of message ID: " + messageId);
    } finally {
      if (publisher != null) {
        // When finished with the publisher, shutdown to free up resources.
        publisher.shutdown();
        publisher.awaitTermination(1, TimeUnit.MINUTES);
      }
    }
  }
}

A seguir

Para saber como configurar opções avançadas de publicação, consulte: