Neste documento, descrevemos como gravar dados de texto do Dataflow para o
Pub/Sub usando o conector de E/S
do Apache Beam PubSubIO
.
Visão geral
Para gravar dados no Pub/Sub, use o conector PubSubIO
. Os elementos de entrada podem ser mensagens do Pub/Sub ou apenas os dados da mensagem.
Se os elementos de entrada forem mensagens do Pub/Sub, será possível definir atributos ou uma chave de ordem em cada mensagem.
É possível usar a versão em Java, Python ou Go do conector PubSubIO
da seguinte maneira:
Java
Para gravar em um único tópico, chame o
método PubsubIO.writeMessages
. Esse método usa uma coleção de entrada de objetos PubsubMessage
. O conector também define métodos de conveniência para gravar strings, mensagens Avro codificadas em binário ou mensagens protobuf codificadas em binários. Esses métodos convertem a coleção de entrada
em mensagens do Pub/Sub.
Para gravar em um conjunto dinâmico de temas com base nos dados de entrada, chame
writeMessagesDynamic
. Para especificar o tópico de destino de cada mensagem, chame PubsubMessage.withTopic
nela. Por exemplo, você pode encaminhar mensagens para tópicos diferentes com base no valor de um determinado campo nos seus dados de entrada.
Para mais informações, consulte a documentação de referência PubsubIO
.
Python
Chame o método pubsub.WriteToPubSub
.
Por padrão, esse método usa uma coleção de entrada do tipo bytes
, que representa o payload da mensagem. Se o parâmetro with_attributes
for
True
, o método usará uma coleção de objetos PubsubMessage
.
Para saber mais, consulte a
documentação de referência do
módulo pubsub
.
Go
Para gravar dados no Pub/Sub, chame o
método pubsubio.Write
. Esse método usa uma coleção de entrada de objetos PubSubMessage
ou frações de bytes que contêm os payloads da mensagem.
Para mais informações, consulte a
documentação de referência do
pacote pubsubio
.
Para mais informações sobre mensagens do Pub/Sub, consulte Formato da mensagem na documentação do Pub/Sub.
Carimbos de data/hora
O Pub/Sub define um carimbo de data/hora em cada mensagem. Esse carimbo de data/hora
representa a hora em que a mensagem é publicada no Pub/Sub. Em um cenário de streaming, o carimbo de data/hora do evento também pode ser relevante, ou seja, a hora em que os dados da mensagem foram gerados. É possível usar o carimbo de data/hora do elemento do Apache Beam para representar o horário do evento. As origens que criam uma PCollection
ilimitada geralmente
atribuem a cada novo elemento um carimbo de data/hora que corresponde ao horário do evento.
Em Java e Python, o conector de E/S do Pub/Sub pode gravar o carimbo de data/hora de cada elemento como um atributo de mensagem do Pub/Sub. Os consumidores de mensagens podem usar esse atributo para receber o carimbo de data/hora do evento.
Java
Chame PubsubIO.Write<T>.withTimestampAttribute
e especifique o nome do
atributo.
Python
Especifique o parâmetro timestamp_attribute
ao chamar WriteToPubSub
.
Entrega de mensagem
O Dataflow é compatível com processamento único de mensagens em um pipeline. No entanto, o conector de E/S do Pub/Sub não garante a entrega única de mensagens pelo Pub/Sub.
Em Java e Python, é possível configurar o conector de E/S do Pub/Sub para gravar o ID exclusivo de cada elemento como um atributo de mensagem. Os consumidores de mensagens podem usar esse atributo para eliminar a duplicação de mensagens.
Java
Chame PubsubIO.Write<T>.withIdAttribute
e especifique o nome do
atributo.
Python
Especifique o parâmetro id_label
ao chamar WriteToPubSub
.
Exemplos
O exemplo a seguir cria um PCollection
de mensagens do Pub/Sub e as grava em um tópico do Pub/Sub. O tópico é especificado como
uma opção de pipeline. Cada mensagem contém dados de payload e um conjunto de atributos.
Java
Para autenticar no Dataflow, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.
Python
Para autenticar no Dataflow, configure o Application Default Credentials. Para mais informações, consulte Configurar a autenticação para um ambiente de desenvolvimento local.