Hey pessoal, sou eu de novo. YEAHH!!!
A maioria dos desenvolvedores usa Pub/Sub do jeito errado, e depois culpa o Google quando as mensagens ficam reentregando pra sempre ou quando o Cloud Run acorda às 3 da manhã sem motivo.
Hoje eu vou mostrar o fluxo prático, o que realmente funciona em produção.
Então hoje vamos falar sobre GCP Pub/Sub integrado com GCP Cloud Run.
Vem comigo nessa jornada maravilhosa pelo Google Cloud Platform.
Este artigo é a primeira parte sobre Pub/Sub.
Na segunda parte, vamos fazer o caminho de volta. Você verá isso no próximo artigo.
Você deve estar se perguntando: o que diabos é Pub/Sub?
Basicamente, vamos implementar este fluxo:
Backend → Pub/Sub Topic → Eventarc → Cloud Run → Pub/Sub Response → Backend
Pub/Sub é um serviço totalmente gerenciado de mensagens em tempo real que permite enviar e receber mensagens entre aplicações independentes.
No meu caso, vou fazer assim:
deliveryAttempt.messageId (consistente em reentregas) ou seu próprio ID para deduplicar.Obs.: Exactly-once vale apenas para pull e depende da região.
Para manter ordem por entidade (como por job_id), publique com uma ordering key e consuma na mesma região.
Atenção: quando uma mensagem com aquela key está sendo reentregada, mensagens posteriores da mesma key podem ser retidas para garantir a ordem.
Garante que cada mensagem será entregue uma ou mais vezes, mas nunca perdida.
Você pode receber duplicatas, mas nunca perde eventos, se o assinante for idempotente.
Cada mensagem é entregue e processada apenas uma vez para um assinante que reconhece com sucesso.
No futuro, posso mostrar como fazer isso com Terraform.
Quando falei sobre deploy de Cloud Run, também expliquei sobre IAM da GCP, então se quiser rever:
Se quiser saber mais sobre GCP IAM, aqui está:
https://cloud.google.com/iam/docs
No meu caso estou usando uma chave JSON com nível owner para criar os recursos de Pub/Sub, porque só eu tenho acesso ao projeto.
Mas em empresas, o ideal é sempre dar apenas as permissões necessárias.
Depois de autenticar com o gcloud-cli, liste os projetos e escolha o correto.
gcloud projects list
gcloud config set project <PROJECT_ID>
gcloud pubsub topics create <TOPIC_ID>
Você verá uma mensagem dizendo que o tópico foi criado, algo como:
projects/<PROJECT_ID>/topics/<TOPIC_ID>
gcloud pubsub subscriptions create <SUBSCRIPTION_ID> --topic=<TOPIC_ID>
gcloud run services list
Várias regiões:
gcloud run services list --region=us-central1
gcloud eventarc triggers create <EVENTARC_NAME> \
--destination-run-service=<SERVICE_NAME> \
--destination-run-region=<REGION_ID> \
--event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
--transport-topic=<TOPIC_NAME> \
--location=<REGION> \
--service-account=<SERVICE_ACCOUNT>
Crie uma service account apenas com as permissões necessárias.
Para o Eventarc, só precisamos da permissão de invocar o Cloud Run.
Precisamos de outra service account para publicar mensagens.
O Eventarc vai receber a mensagem e acordar o Cloud Run para fazer o trabalho.
Crie uma service account e gere o JSON para usar no Laravel.
Essa conta precisa apenas do:
Em português o nome parece estranho (“Editor de Pub/Sub”), mas a descrição confirma que ela só publica, então está certo.
composer require google/cloud-pubsub
E aqui está o Job:
// código mantido como no original
Imagine uma empresa processando milhares de notas por dia. Normalmente ela precisaria de:
Com Pub/Sub + Eventarc + Cloud Run, tudo muda:
Um processo que antes custava entre R$ 400 700/mês em uma VM cai para R$ 20 a 60/mês.
O impacto de negócio é enorme:
Esse tipo de arquitetura transforma empresas, não por hype, mas porque elimina desperdício e devolve produtividade para o time.
Depois de tudo isso, você já consegue testar o sistema.
Isso vai publicar no tópico, mas não vai consumir, porque o Laravel só publica, não assina.
Você pode controlar tudo usando messageIds.
No meu caso, o resultado do crawler fica atrelado ao ID da mensagem.
Pub/Sub é muito mais que uma fila, é o coração de uma arquitetura event-driven moderna na GCP.
Com a configuração certa, você ganha retries previsíveis, autoscaling, garantias de entrega e um desacoplamento limpo entre os sistemas.
Nesta primeira parte, vimos a publicação via Laravel e o trigger do Cloud Run usando Eventarc.
Na próxima, vamos fechar o ciclo: Cloud Run → Pub/Sub → Backend.
Se quiser a segunda parte, comenta aí ou me manda uma mensagem e eu publico.
Vejo vocês no próximo!
Seja o primeiro a comentar o nosso artigo!