Uma função definida pelo usuário (UDF) do JavaScript é um tipo de transformação de mensagem única (SMT, na sigla em inglês). As UDFs oferecem uma maneira flexível de implementar a lógica de transformação personalizada no Pub/Sub, semelhante às UDFs do BigQuery em JavaScript.
As UDFs aceitam uma única mensagem como entrada, executam as ações definidas na entrada e retornam o resultado do processo.
As UDFs têm as seguintes propriedades principais:
Nome da função:o nome da função JavaScript no código fornecido que o Pub/Sub aplica às mensagens.
Código:o código JavaScript que define a lógica de transformação. Esse código precisa conter uma função com a seguinte assinatura:
/** * Transforms a Pub/Sub message. * @return {(Object<string, (string | Object<string, string>)>|* null)} - To * filter a message, return `null`. To transform a message, return a map with * the following keys: * - (required) 'data' : {string} * - (optional) 'attributes' : {Object<string, string>} * Returning empty `attributes` will remove all attributes from the message. * * @param {(Object<string, (string | Object<string, string>)>} - Pub/Sub * message. Keys: * - (required) 'data' : {string} * - (required) 'attributes' : {Object<string, string>} * * @param {Object<string, any>} metadata - Pub/Sub message metadata. * Keys: * - (optional) 'message_id' : {string} * - (optional) 'publish_time': {string} YYYY-MM-DDTHH:MM:SSZ format * - (optional) 'ordering_key': {string} */ function <function_name>(message, metadata) { // Perform custom transformation logic return message; // to filter a message instead, return `null` }
Entradas
Argumento
message
:um objeto JavaScript que representa a mensagem do Pub/Sub. Ele contém as seguintes propriedades:data
: (String
, obrigatório) o payload da mensagem.attributes
: (Object<String, String>
, opcional) um mapa de pares de chave-valor que representam atributos de mensagem.
Argumento
metadata
:um objeto JavaScript que contém metadados imutáveis sobre a mensagem do Pub/Sub:message_id
: (String
, opcional) o ID exclusivo da mensagem.publish_time
: (String
, opcional) o horário de publicação da mensagem no formato RFC 3339 (AAAA-MM-DDTHH:mm:ssZ).ordering_key
: (String
, opcional) a chave de ordenação da mensagem, se aplicável.
Saídas
Para transformar uma mensagem, edite o conteúdo de
message.data
emessage.attributes
e retorne o objetomessage
alterado.Para filtrar uma mensagem, retorne
null
.
Como as UDFs transformam uma mensagem
O resultado da execução de uma UDF em uma mensagem pode ser um dos seguintes:
A UDF transforma uma mensagem.
A UDF retorna
null
.SMTs de tópicos: o Pub/Sub retorna sucesso ao editor e inclui um ID de mensagem na resposta para as mensagens filtradas. O Pub/Sub não armazena nem envia a mensagem para nenhum assinante.
SMTs de assinatura: o Pub/Sub confirma a entrega da mensagem sem enviar a mensagem a um assinante.
A UDF gera um erro.
SMTs de tópico: o Pub/Sub retorna o erro ao editor e não publica nenhuma das mensagens.
SMTs de assinatura: o Pub/Sub confirma a mensagem de forma negativa.
Limites de recursos
O Pub/Sub aplica limites de recursos a UDFs para garantir operações de transformação eficientes. As limitações incluem:
- Máximo de 20 KB de código por UDF
- Execução máxima de 500 ms por mensagem
- Nenhuma chamada para APIs externas
- Nenhuma importação de bibliotecas externas
Exemplos de UDFs
Confira alguns exemplos de UDFs para publicação e inscrição.
Função: converta um número inteiro do dia da semana na string correspondente
Quando você adiciona o UDF a seguir a um tópico ou uma assinatura, as seguintes mudanças ocorrem durante a publicação ou entrega de mensagens:
O Pub/Sub aplica a função à mensagem. Se a mensagem não tiver um payload JSON, a UDF vai gerar um erro.
O UDF procura um campo chamado
dayOfWeek
e, se o valor desse campo for um número entre 0 e 6, ele será convertido em um dia da semana correspondente, comoMonday
. Se o campo não existir ou o número não estiver no intervalo de 0 a 6, o código vai definir o campodayOfWeek
comoUnknown
.A UDF serializa o payload modificado de volta à mensagem.
O Pub/Sub transmite a mensagem atualizada para a próxima etapa do pipeline.
function intToString(message, metadata) {
const data = JSON.parse(message.data);
switch(`data["dayOfWeek"]`) {
case 0:
data["dayOfWeek"] = "Sunday";
break;
case 1:
data["dayOfWeek"] = "Monday";
break;
case 2:
data["dayOfWeek"] = "Tuesday";
break;
case 3:
data["dayOfWeek"] = "Wednesday";
break;
case 4:
data["dayOfWeek"] = "Thursday";
break;
case 5:
data["dayOfWeek"] = "Friday";
break;
case 6:
data["dayOfWeek"] = "Saturday";
break;
default:
data["dayOfWeek"] = "Unknown";
}
message.data = JSON.stringify(data);
return message;
}
Função: omitir um CPF ou CNPJ
Quando você adiciona o UDF a seguir a um tópico ou uma assinatura, as seguintes mudanças ocorrem durante a publicação ou entrega de mensagens:
O Pub/Sub aplica a função à mensagem. Se a mensagem não tiver um payload JSON, o UDF vai gerar um erro.
O UDF remove o campo
ssn
do payload da mensagem (se ele existir).A UDF serializa o payload modificado de volta à mensagem.
O Pub/Sub transmite a mensagem atualizada para a próxima etapa do pipeline.
function redactSSN(message, metadata) {
const data = JSON.parse(message.data);
delete data['ssn'];
message.data = JSON.stringify(data);
return message;
}
Função: filtrar e confirmar automaticamente mensagens específicas
Quando você adiciona o UDF a seguir a um tópico ou uma assinatura, as seguintes mudanças ocorrem durante a publicação ou entrega de mensagens:
O Pub/Sub aplica a função à mensagem. Se a mensagem não tiver um payload JSON, a UDF vai gerar um erro.
O UDF verifica se o payload contém um campo chamado
region
.Se o valor do campo
region
não forUS
, a função retornará nulo, fazendo com que o Pub/Sub filtre a mensagem.Se o valor do campo
region
forUS
, o Pub/Sub vai transmitir a mensagem original para a próxima etapa do pipeline.
function filterForUSRegion(message, metadata) {
const data = JSON.parse(message.data);
if (data["region"] !== "US") {
return null;
}
return message;
}
Função: validar o conteúdo da mensagem para garantir que o valor não seja maior que 100
Quando você adiciona o UDF a seguir a um tópico ou uma assinatura, as seguintes mudanças ocorrem durante a publicação ou entrega de mensagens:
O Pub/Sub aplica a função à mensagem. Se a mensagem não tiver um payload JSON, a UDF vai gerar um erro.
A UDF verifica se a mensagem contém um campo chamado
amount
.Se o valor do campo
amount
for maior que100
, a função gerará um erro.Se o valor do campo
amount
não for maior que100
, a função vai retornar a mensagem original.O Pub/Sub marca a mensagem como com falha ou encaminha a mensagem original para a próxima etapa do pipeline.
function validateAmount(message, metadata) {
const data = JSON.parse(message.data);
if (data["amount"] > 100) {
throw new Error("Amount is invalid");
}
return message;
}