arrow_back

Crie um sistema resiliente e assíncrono com o Cloud Run e o Pub/Sub

Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Crie um sistema resiliente e assíncrono com o Cloud Run e o Pub/Sub

Lab 1 hora universal_currency_alt 5 créditos show_chart Intermediário
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP650

Laboratórios autoguiados do Google Cloud

Logotipo da Pet Theory

Informações gerais

Nos laboratórios da Quest Google Cloud Serverless Workshop: Pet Theory, você terá acesso a um cenário de negócios fictício e vai ajudar os personagens com o plano deles de migração sem servidor.

Há 12 anos, Lilian fundou a rede de clínicas veterinárias Pet Theory. Ao longo dos anos, o número de clínicas cresceu, levando a um aumento nas necessidades de automação. A maneira como a Pet Theory lida com os resultados dos exames médicos quando eles voltam do laboratório é lenta demais e propensa a erros, e Lilian quer melhorar esse processo.

Atualmente, Pedro, administrador de TI da Pet Theory, processa os resultados dos exames manualmente. Sempre que recebe um resultado de exame, ele escreve e envia um e-mail ao cliente cujo animal de estimação fez o exame, em seguida, digita uma mensagem de texto no celular e manda os resultados para o cliente em formato de texto.

Pedro está trabalhando com Ruby, consultora de software, para elaborar um sistema com maior escalonabilidade. Eles querem criar uma solução que não exija muita manutenção contínua. Pedro e Ruby optaram pela tecnologia sem servidor.

Pré-requisitos

Para fazer este laboratório, é preciso saber usar o console do Cloud e ambientes shell. Este laboratório faz parte de uma série. Concluir os laboratórios anteriores será útil, mas não é obrigatório:

Você também precisa saber editar arquivos. Use seu editor de texto favorito (como o nano, o vi etc.) ou inicie o editor de código do Cloud Shell, disponível na barra superior:

Ícone do editor de código do Cloud Shell

Configuração e requisitos

Observação: para este laboratório, faça login no console do Google Cloud como Username 1. Caso contrário, você vai se deparar com erros durante o laboratório.

Antes de clicar no botão Start Lab

Leia estas instruções. Os laboratórios são cronometrados e não podem ser pausados. O timer é iniciado quando você clica em Começar o laboratório e mostra por quanto tempo os recursos do Google Cloud vão ficar disponíveis.

Este laboratório prático permite que você realize as atividades em um ambiente real de nuvem, não em uma simulação ou demonstração. Você vai receber novas credenciais temporárias para fazer login e acessar o Google Cloud durante o laboratório.

Confira os requisitos para concluir o laboratório:

  • Acesso a um navegador de Internet padrão (recomendamos o Chrome).
Observação: para executar este laboratório, use o modo de navegação anônima ou uma janela anônima do navegador. Isso evita conflitos entre sua conta pessoal e a conta de estudante, o que poderia causar cobranças extras na sua conta pessoal.
  • Tempo para concluir o laboratório---não se esqueça: depois de começar, não será possível pausar o laboratório.
Observação: não use seu projeto ou conta do Google Cloud neste laboratório para evitar cobranças extras na sua conta.

Como iniciar seu laboratório e fazer login no console do Google Cloud

  1. Clique no botão Começar o laboratório. Se for preciso pagar, você verá um pop-up para selecionar a forma de pagamento. No painel Detalhes do laboratório à esquerda, você verá o seguinte:

    • O botão Abrir Console do Cloud
    • Tempo restante
    • As credenciais temporárias que você vai usar neste laboratório
    • Outras informações se forem necessárias
  2. Clique em Abrir Console do Google. O laboratório ativa recursos e depois abre outra guia com a página Fazer login.

    Dica: coloque as guias em janelas separadas lado a lado.

    Observação: se aparecer a caixa de diálogo Escolher uma conta, clique em Usar outra conta.
  3. Caso seja preciso, copie o Nome de usuário no painel Detalhes do laboratório e cole esse nome na caixa de diálogo Fazer login. Clique em Avançar.

  4. Copie a Senha no painel Detalhes do laboratório e a cole na caixa de diálogo Olá. Clique em Avançar.

    Importante: você precisa usar as credenciais do painel à esquerda. Não use suas credenciais do Google Cloud Ensina. Observação: se você usar sua própria conta do Google Cloud neste laboratório, é possível que receba cobranças adicionais.
  5. Acesse as próximas páginas:

    • Aceite os Termos e Condições.
    • Não adicione opções de recuperação nem autenticação de dois fatores (porque essa é uma conta temporária).
    • Não se inscreva em testes gratuitos.

Depois de alguns instantes, o console do GCP vai ser aberto nesta guia.

Observação: para ver uma lista dos produtos e serviços do Google Cloud, clique no Menu de navegação no canto superior esquerdo. Ícone do menu de navegação

Ativar o Cloud Shell

O Cloud Shell é uma máquina virtual com várias ferramentas de desenvolvimento. Ele tem um diretório principal permanente de 5 GB e é executado no Google Cloud. O Cloud Shell oferece acesso de linha de comando aos recursos do Google Cloud.

  1. Clique em Ativar o Cloud Shell Ícone "Ativar o Cloud Shell" na parte de cima do console do Google Cloud.

Depois de se conectar, vai notar que sua conta já está autenticada, e que o projeto está configurado com seu PROJECT_ID. A saída contém uma linha que declara o projeto PROJECT_ID para esta sessão:

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud é a ferramenta de linha de comando do Google Cloud. Ela vem pré-instalada no Cloud Shell e aceita preenchimento com tabulação.

  1. (Opcional) É possível listar o nome da conta ativa usando este comando:
gcloud auth list
  1. Clique em Autorizar.

  2. A saída será parecida com esta:

Saída:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (Opcional) É possível listar o ID do projeto usando este comando:
gcloud config list project

Saída:

[core] project = <project_ID>

Exemplo de saída:

[core] project = qwiklabs-gcp-44776a13dea667a6 Observação: para conferir a documentação completa da gcloud, acesse o guia com informações gerais sobre a gcloud CLI no Google Cloud.

Configure sua região e zona

Alguns recursos do Compute Engine estão em regiões e zonas. As regiões são localizações geográficas específicas onde você executa seus recursos. Todas elas têm uma ou mais zonas.

Execute os comandos gcloud a seguir no console do Cloud para definir a região e a zona padrão do laboratório:

gcloud config set compute/zone "{{{project_0.default_zone|ZONE}}}" export ZONE=$(gcloud config get compute/zone) gcloud config set compute/region "{{{project_0.default_region|REGION}}}" export REGION=$(gcloud config get compute/region)

Cenário

Os responsáveis pela Pet Theory querem automatizar o envio dos resultados de exames para os clientes. Eles passaram por maus bocados para acompanhar o aumento no volume de consultas, o que levou Lilian a pedir ajuda à Ruby…

Lilian

Lilian, fundadora da Pet Theory

Oi, Ruby

Obrigada por organizar o portal de seguros.

Será que podemos fazer algo em relação aos resultados dos exames? Precisamos de uma maneira mais eficiente de enviar os resultados para os clientes.

Lilian

Ruby

Ruby, consultora de software

Olá, Lilian.

Claro, verei o que é possível fazer. Tenho algumas ideias para melhorar a situação.

Ruby

Tarefa 1: arquitetura

Na Pet Theory, os exames médicos são realizados por um laboratório externo. Depois de concluir o exame, o laboratório envia os resultados de volta para a Pet Theory.

Para enviar os resultados, o laboratório usa um POST de HTTP(s) para o endpoint da Web da Pet Theory. A ilustração abaixo descreve a arquitetura geral.

Diagrama de arquitetura do sistema da Pet Theory

Depois de analisar o processo geral, Ruby acha que é possível projetar um sistema em que a Pet Theory consiga:

  1. receber a solicitação do POST de HTTP e enviar ao laboratório uma confirmação de recebimento;
  2. enviar um e-mail ao cliente com o resultado;
  3. enviar uma mensagem de texto (SMS) e um e-mail ao cliente com o resultado.

O projeto de Ruby isola cada uma das atividades acima e exige:

  • um serviço para enviar as solicitações e as respostas relacionadas aos resultados;
  • um serviço para enviar por e-mail os resultados dos exames para o cliente;
  • um serviço para enviar uma mensagem de texto (SMS) ao cliente;
  • o uso do Pub/Sub na comunicação entre serviços;
  • o uso de uma infraestrutura sem servidor na arquitetura do aplicativo.

Para desenvolver um código mais fácil de escrever e com menos bugs, Ruby utiliza funções de uso único.

Ruby

Ruby, consultora de software

Oi, Pedro.

Lilian quer que eu crie um protótipo para ajudar no processamento dos prontuários.

Para começar, será que você pode configurar um tópico do Pub/Sub chamado new-lab-report?

Ruby

Pedro

Pedro, administrador de TI

Olá, Ruby.

Esse projeto parece ser muito interessante. Consigo fazer isso para você ainda esta manhã. A configuração das duas atividades no Google Cloud é muito rápida.

Pedro

Crie um tópico do Pub/Sub

Ajude Pedro a criar um tópico do Pub/Sub chamado new-lab-report.

Cloud Pub/Sub destacado no diagrama de arquitetura

Quando um serviço publica uma mensagem do Pub/Sub, ela precisa ser marcada com um tópico. O serviço que será criado publica uma mensagem para cada resultado de exame encontrado.

Primeiramente, você precisa criar um tópico para essa tarefa.

  1. Execute o seguinte comando para criar um tópico do Pub/Sub:
gcloud pubsub topics create new-lab-report

Qualquer serviço inscrito no tópico "new-lab-report" será capaz de processar a mensagem publicada pelo serviço de resultados do laboratório. No diagrama acima, você verá dois desses processadores, o serviço de e-mail e o serviço de SMS.

  1. Depois ative o Cloud Run, que vai executar seu código na nuvem:
gcloud services enable run.googleapis.com

Selecione Verificar meu progresso para conferir o objetivo.

Crie um tópico do Pub/Sub

Não se esqueça de informar Ruby que o tópico do Pub/Sub está pronto para ser usado.

Pedro

Pedro, administrador de TI

Olá, Ruby.

Tudo pronto.

Se você tiver tempo, eu gostaria de ver como este protótipo é preparado. Podemos trabalhar nisso juntos?

Pedro

Ruby

Ruby, consultora de software

Oi, Pedro.

Ótimo. Obrigada por fazer isso tão rápido. Vou marcar um horário e começaremos a trabalhar nisso.

Ruby

Tarefa 2: criar o serviço de resultados do laboratório

Ajude Ruby a configurar um novo serviço de resultados do laboratório.

O serviço de resultados do laboratório em destaque no diagrama de arquitetura

Este serviço será usado para prototipagem e, por isso, ele só vai fazer duas coisas:

  1. Receber o POST de HTTPS do serviço contendo os dados do resultado.
  2. Publicar uma mensagem no Pub/Sub.

Adicione o código do serviço de resultados do laboratório

  1. No Cloud Shell, clone o repositório necessário para este laboratório:
git clone https://github.com/rosera/pet-theory.git
  1. Migre para o diretório lab-service:
cd pet-theory/lab05/lab-service
  1. Instale os pacotes abaixo, que serão necessários para receber as solicitações HTTPS de entrada e publicar no Pub/Sub:
npm install express npm install body-parser npm install @google-cloud/pubsub

Esses comandos atualizam o arquivo package.json para indicar as dependências necessárias para este serviço.

Agora você vai editar o arquivo package.json para que o Cloud Run saiba como iniciar seu código.

  1. Abra o arquivo package.json.

  2. Na seção "scripts" do arquivo package.json, adicione a linha de código "start": "node index.js", na linha 7 (como mostrado abaixo) e depois salve o arquivo:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, Observação: adicione o código exatamente como indicado, incluindo a vírgula final:

"start": "node index.js",

Caso contrário, a implantação terá erros.
  1. Crie um arquivo com o nome index.js e adicione este código a ele:
const {PubSub} = require('@google-cloud/pubsub'); const pubsub = new PubSub(); const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { try { const labReport = req.body; await publishPubSubMessage(labReport); res.status(204).send(); } catch (ex) { console.log(ex); res.status(500).send(ex); } }) async function publishPubSubMessage(labReport) { const buffer = Buffer.from(JSON.stringify(labReport)); await pubsub.topic('new-lab-report').publish(buffer); } As duas linhas abaixo fazem o trabalho principal do serviço:

const labReport = req.body;

await publishPubSubMessage(labReport);

Especificamente, essas linhas:

  • Extraem o resultado do laboratório da solicitação POST.
  • Publicam uma mensagem do Pub/Sub contendo o resultado recém-publicado.
  1. Agora crie um arquivo com o nome Dockerfile e adicione a ele o seguinte código:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Esse arquivo define como criar um pacote do serviço Cloud Run em um contêiner.

Implante o lab-report-service

  1. Crie um arquivo com o nome deploy.sh e cole estes comandos nele:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service gcloud run deploy lab-report-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/lab-report-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --allow-unauthenticated \ --max-instances=1
  1. No Cloud Shell, execute o código abaixo para tornar o arquivo executável:
chmod u+x deploy.sh
  1. Chegou a hora de implantar o serviço de resultados do laboratório. Execute o script de implantação:
./deploy.sh

Devido a problemas de sincronização, pode ser que uma mensagem de erro seja exibida quando você executar este comando pela primeira vez. Se acontecer isso, basta executar novamente deploy.sh.

Depois que a implantação for concluída, uma mensagem semelhante a esta será exibida:

Service [lab-report-service] revision [lab-report-service-00001] has been deployed and is serving traffic at https://lab-report-service-[hash].a.run.app

Bom trabalho. O serviço de resultados do laboratório foi implantado e vai processá-los por HTTP. Agora você pode testar se o novo serviço está instalado e funcionando.

Selecione Verificar meu progresso para conferir o objetivo.

Implante o serviço de resultados do laboratório: criar

Selecione Verificar meu progresso para conferir o objetivo.

Implante o serviço de resultados do laboratório: criar revisão

Teste o serviço de resultados do laboratório

Para validar o serviço de resultados, simule três POSTs de HTTPS criados pelo laboratório, cada um contendo um resultado. Para fins de teste, os resultados criados conterão somente um ID.

  1. Primeiramente, para facilitar o trabalho, coloque o URL do resultado em uma variável de ambiente.
export LAB_REPORT_SERVICE_URL=$(gcloud run services describe lab-report-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Confirme que LAB_REPORT_SERVICE_URL foi capturada:
echo $LAB_REPORT_SERVICE_URL
  1. Crie um novo arquivo com o nome post-reports.sh e adicione este código a ele:
curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 12}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 34}" \ $LAB_REPORT_SERVICE_URL & curl -X POST \ -H "Content-Type: application/json" \ -d "{\"id\": 56}" \ $LAB_REPORT_SERVICE_URL &

O script acima usará o comando curl para postar três IDs distintos no URL do serviço do laboratório. Cada comando será executado individualmente em segundo plano.

  1. Torne o script post-reports.sh executável:
chmod u+x post-reports.sh
  1. Para testar o endpoint do serviço de resultados do laboratório, poste três resultados nele usando o script descrito acima:
./post-reports.sh

Esse script postou três resultados no serviço. Verifique os registros para conferir os resultados.

  1. No console do Cloud, clique em Menu de navegação (Ícone do menu de navegação) > Cloud Run.

  2. O recém-implantado lab-report-service vai aparecer na lista de Serviços. Clique nele.

  3. A próxima página mostra os detalhes do lab-report-service. Clique na guia Registros.

Na página Registros, estão os resultados dos três resultados de teste que você acabou de postar com o script. Esperamos que os códigos de retorno HTTP sejam 204, o que significa OK - sem conteúdo, conforme mostrado abaixo. Se você não vir nenhuma entrada, tente rolar para cima e para baixo usando a barra de rolagem à direita. Essa ação recarrega o registro.

Resultados dos registros

A próxima tarefa é criar os serviços de SMS e de e-mail que serão acionados quando o serviço de resultados publicar uma mensagem do Pub/Sub no tópico "new-lab-report".

Tarefa 3: o serviço de e-mail

Ajude Ruby a configurar o novo serviço de e-mail.

O serviço de e-mail destacado no diagrama de arquitetura

Adicione código ao serviço de e-mail

  1. Migre para o diretório do serviço de e-mail:
cd ~/pet-theory/lab05/email-service
  1. Instale os pacotes abaixo para que o código processe as solicitações HTTPS de entrada:
npm install express npm install body-parser

O comando acima vai atualizar o arquivo package.json, que descreve o app e as dependências dele. Adicione a instrução start para que o Cloud Run saiba como executar o código.

  1. Abra o arquivo package.json.

  2. Na seção "scripts", adicione a linha "start": "node index.js", conforme mostrada abaixo, e salve o arquivo:

"scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, Observação: adicione o código exatamente como indicado, incluindo a vírgula final:

"start": "node index.js",

Caso contrário, a implantação terá erros.
  1. Crie um arquivo chamado index.js e adicione a ele o seguinte:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`Email Service: Report ${labReport.id} trying...`); sendEmail(); console.log(`Email Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`Email Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendEmail() { console.log('Sending email'); }

Esse código será executado quando o Pub/Sub postar uma mensagem no serviço. Veja o que ele faz:

  • Ele decodifica a mensagem do Pub/Sub e tenta chamar a função sendEmail().
  • Se isso funcionar e nenhuma exceção for gerada, ele retornará o código de status 204 para que o Pub/Sub saiba que a mensagem foi processada.
  • Se houver uma exceção, o serviço retornará o código de status 500 para que o Pub/Sub saiba que a mensagem não foi processada e que, posteriormente, ela será postada novamente para o serviço.

Quando a comunicação entre os serviços estiver funcionando, Ruby adicionará o código à função sendEmail() para enviar o e-mail.

  1. Agora crie um arquivo com o nome Dockerfile e adicione a ele o seguinte código:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Esse arquivo define como criar um pacote do serviço Cloud Run em um contêiner.

Implante o serviço de e-mail

  1. Crie um arquivo chamado deploy.sh e adicione a ele o seguinte código:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/email-service gcloud run deploy email-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/email-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. Torne deploy.sh executável:
chmod u+x deploy.sh
  1. Implante o serviço de e-mail:
./deploy.sh

Quando a implantação estiver concluída, será mostrada uma mensagem parecida com esta:

Service [email-service] revision [email-service-00001] has been deployed and is serving traffic at https://email-service-[hash].a.run.app

O serviço foi implantado com sucesso. Agora você precisa garantir que o serviço de e-mail seja acionado quando houver uma mensagem do Pub/Sub disponível.

Selecione Verificar meu progresso para conferir o objetivo.

Implante o serviço de e-mail: criar

Selecione Verificar meu progresso para conferir o objetivo.

Implante o serviço de e-mail: criar revisão

Configure o Pub/Sub para acionar o serviço de e-mail

Sempre que uma nova mensagem do Pub/Sub for publicada com o tópico "new-lab-report", ela deve acionar o serviço de e-mail. Para realizar essa tarefa, configure uma conta de serviço para tratar automaticamente as solicitações associadas ao serviço.

Diagrama da arquitetura com destaques do fluxo do Cloud Pub/Sub para o serviço de e-mail

  1. Crie uma nova conta de serviço que será usada para acionar os serviços que respondem mensagens do Pub/Sub:
gcloud iam service-accounts create pubsub-cloud-run-invoker --display-name "PubSub Cloud Run Invoker"

Selecione Verificar meu progresso para conferir o objetivo.

Criar uma conta de serviço
  1. Conceda permissão à nova conta de serviço para invocar o serviço de e-mail:
gcloud run services add-iam-policy-binding email-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

Em seguida, faça o Pub/Sub invocar o serviço de SMS quando uma mensagem do "new-lab-report" for publicada.

  1. Insira o número do projeto em uma variável de ambiente para facilitar o acesso:
PROJECT_NUMBER=$(gcloud projects list --filter="qwiklabs-gcp" --format='value(PROJECT_NUMBER)')

Em seguida, ative o projeto para criar tokens de autenticação do Pub/Sub.

  1. Execute o código abaixo:
gcloud projects add-iam-policy-binding $GOOGLE_CLOUD_PROJECT --member=serviceAccount:service-$PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com --role=roles/iam.serviceAccountTokenCreator
  1. Insira o URL do serviço de e-mail em outra variável de ambiente:
EMAIL_SERVICE_URL=$(gcloud run services describe email-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Confirme a captura do EMAIL_SERVICE_URL:
echo $EMAIL_SERVICE_URL
  1. Crie uma inscrição do Pub/Sub para o serviço de e-mail.
gcloud pubsub subscriptions create email-service-sub --topic new-lab-report --push-endpoint=$EMAIL_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com

Bom trabalho. O serviço já está configurado para responder as mensagens do Cloud Pub/Sub. A próxima etapa é validar o código para confirmar que ele cumpre os requisitos.

Selecione Verificar meu progresso para conferir o objetivo.

Crie a inscrição do Pub/Sub

Teste o serviço de resultados do laboratório e o serviço de e-mail juntos

  1. Usando o script que você já criou, poste nos relatórios do laboratório outra vez:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Em seguida, abra o registro (Menu de navegação > Cloud Run). Os dois serviços do Cloud Run, email-service e lab-report-service, vão aparecer na sua conta.

  2. Clique em email-service e depois em Registros.
    O resultado do serviço acionado pelo Pub/Sub será exibido. Se você não encontrar as mensagens que esperava, role para cima e para baixo com a barra de rolagem para atualizar o registro.

Bom trabalho! Agora o serviço de e-mail é capaz de gravar as informações no registro sempre que uma mensagem é processada na fila do tópico do Cloud Pub/Sub. A última tarefa é criar o serviço de SMS.

Tarefa 4: o serviço de SMS

Ajude Ruby a configurar o novo serviço de SMS.

Serviço de SMS em destaque no diagrama da arquitetura

Adicione o código do serviço de SMS

  1. Crie um diretório para o serviço de SMS:
cd ~/pet-theory/lab05/sms-service
  1. Instale os pacotes necessários para receber as solicitações HTTPS de entrada:
npm install express npm install body-parser
  1. Abra o arquivo package.json.

  2. Na seção "scripts", adicione a linha "start": "node index.js", conforme mostrada abaixo, e salve o arquivo:

... "scripts": { "start": "node index.js", "test": "echo \"Error: no test specified\" && exit 1" }, ... Observação: adicione o código exatamente como indicado, incluindo a vírgula final:

"start": "node index.js",

Caso contrário, a implantação terá erros.
  1. Crie um arquivo chamado index.js e adicione a ele o seguinte:
const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.json()); const port = process.env.PORT || 8080; app.listen(port, () => { console.log('Listening on port', port); }); app.post('/', async (req, res) => { const labReport = decodeBase64Json(req.body.message.data); try { console.log(`SMS Service: Report ${labReport.id} trying...`); sendSms(); console.log(`SMS Service: Report ${labReport.id} success :-)`); res.status(204).send(); } catch (ex) { console.log(`SMS Service: Report ${labReport.id} failure: ${ex}`); res.status(500).send(); } }) function decodeBase64Json(data) { return JSON.parse(Buffer.from(data, 'base64').toString()); } function sendSms() { console.log('Sending SMS'); }
  1. Agora crie um arquivo com o nome Dockerfile e adicione a ele o seguinte código:
FROM node:18 WORKDIR /usr/src/app COPY package.json package*.json ./ RUN npm install --only=production COPY . . CMD [ "npm", "start" ]

Esse arquivo define como criar um pacote do serviço Cloud Run em um contêiner. Agora que o código foi criado, o próximo passo é implantar o serviço.

Implante o serviço de SMS

  1. Crie um arquivo com o nome deploy.sh e adicione este código a ele:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service gcloud run deploy sms-service \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/sms-service \ --platform managed \ --region {{{project_0.default_region | "REGION"}}} \ --no-allow-unauthenticated \ --max-instances=1
  1. Torne deploy.sh executável:
chmod u+x deploy.sh
  1. Implante o serviço de SMS:
./deploy.sh

Quando a implantação terminar, uma mensagem semelhante a esta será exibida:

Service [sms-service] revision [sms-service-00001] has been deployed and is serving traffic at https://sms-service-[hash].a.run.app

O serviço SMS foi implantado, mas não está vinculado ao serviço do Cloud Pub/Sub. Corrija isso na seção seguinte.

Selecione Verificar meu progresso para conferir o objetivo.

Implante o serviço de SMS

Configure o Cloud Pub/Sub para acionar o serviço de SMS

Assim como ocorre no serviço de e-mail, é necessário configurar o link entre o Cloud Pub/Sub e o serviço de SMS para processar as mensagens.

O diagrama da arquitetura com destaques do fluxo do Cloud Pub/Sub para o serviço de SMS

  1. Configure as permissões para fazer com que o Pub/Sub acione o serviço de SMS:
gcloud run services add-iam-policy-binding sms-service --member=serviceAccount:pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com --role=roles/run.invoker --region {{{project_0.default_region | "REGION"}}} --platform managed

Em seguida, faça com que o Pub/Sub invoque o serviço de SMS quando uma mensagem “new-lab-report” for publicada.

  1. A primeira etapa é inserir o endereço do URL do serviço de SMS em uma variável de ambiente:
SMS_SERVICE_URL=$(gcloud run services describe sms-service --platform managed --region {{{project_0.default_region | "REGION"}}} --format="value(status.address.url)")
  1. Confirme a captura de SMS_SERVICE_URL:

    echo $SMS_SERVICE_URL
  2. Em seguida, crie a inscrição do Pub/Sub:

gcloud pubsub subscriptions create sms-service-sub --topic new-lab-report --push-endpoint=$SMS_SERVICE_URL --push-auth-service-account=pubsub-cloud-run-invoker@$GOOGLE_CLOUD_PROJECT.iam.gserviceaccount.com
  1. Execute o script de teste de novo para postar três resultados no serviço de resultados do laboratório:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Em seguida, abra o registro (Menu de navegação > Cloud Run). Os três serviços do Cloud Run, email-service, lab-report-service e sms-service, vão aparecer na sua conta.

  2. Clique em sms-service e depois em Registros. Você verá o resultado do serviço ser acionado pelo Pub/Sub.

O sistema de protótipo foi criado e testado com sucesso. Mas Pedro está receoso, porque não houve um teste de resiliência no processo de validação inicial.

Tarefa 5: testar a resiliência do sistema

O que acontecerá se um dos serviços cair? Pedro já se deparou com isso antes, já que é uma situação comum.

Ajude Ruby a preparar o sistema para lidar com essa situação. Ela quer testar o que acontece quando ocorre um erro em um serviço devido à implantação de uma versão incorreta do serviço de e-mail.

  1. Volte para o diretório email-service:
cd ~/pet-theory/lab05/email-service

Adicione um texto inválido ao aplicativo de serviço de e-mail para causar um erro.

  1. Edite index.js e adicione a linha throw à função sendEmail(), como mostrado abaixo. Isso vai gerar uma exceção, como se o servidor de e-mail estivesse inativo:
... function sendEmail() { throw 'Email server is down'; console.log('Sending email'); } ...

Adicionar esse código vai causar um erro no serviço quando ele for invocado.

  1. Implante esta versão incorreta do serviço de e-mail:
./deploy.sh
  1. Quando a implantação do serviço de e-mail for concluída, poste os dados dos resultados do laboratório outra vez e verifique atentamente o status do registro de email-service:
~/pet-theory/lab05/lab-service/post-reports.sh
  1. Abra os registros do serviço de e-mail para conferir o serviço incorreto: Menu de navegação > Cloud Run.

  2. Quando os três serviços do Cloud Run aparecerem na sua conta, clique em email-service.

O serviço de e-mail está sendo invocado, mas continuará dando erro. Se você rolar de volta nos registros, vai encontrar a causa-raiz: “Email server is down”. Você também vai perceber que o serviço retorna o código de status 500 e que o Pub/Sub continua tentando chamar o serviço.

Se você verificar os registros do serviço de SMS, vai notar que ele está funcionando bem.

Agora corrija o erro no serviço de e-mail e restaure o aplicativo.

  1. Abra o arquivo index.js, remova a linha throw inserida anteriormente e salve o arquivo.

A função sendEmail de index.js agora se parece com o seguinte:

function sendEmail() { console.log('Sending email'); }
  1. Implante a versão corrigida do serviço de e-mail:
./deploy.sh
  1. Depois que a implantação terminar, clique no ícone atualizar no canto superior direito.

Você verá que, quando os e-mails dos resultados 12, 34 e 56 foram finalmente enviados, o serviço de e-mail retornou o código de status 204, e o Pub/Sub parou de invocar o serviço. Não houve perda de dados; o Pub/Sub continuou tentando até que finalmente conseguiu. Essas são as bases de um sistema robusto.

Pontos principais

  1. Se os serviços se comunicarem de maneira assíncrona pelo Pub/Sub em vez de chamarem uns aos outros diretamente, o sistema será mais resiliente.
  2. Graças ao uso do Pub/Sub, o acionamento do serviço de resultados do laboratório não depende de outros serviços. Por exemplo, se os clientes também quiserem receber os resultados do laboratório por algum outro serviço de mensagens, ele poderá ser adicionado sem precisar atualizar o serviço de resultados do laboratório.
  3. O Cloud Pub/Sub lidou com as tentativas sucessivas. Os serviços não precisaram fazer isso. Os serviços precisam apenas retornar o código de status: sucesso ou erro.
  4. Graças às tentativas sucessivas do Pub/Sub, em casos de queda de serviço, o sistema consegue "se corrigir" sozinho quando o serviço volta a ficar on-line.

Parabéns!

Com sua ajuda, Ruby criou um sistema de protótipo resiliente. O serviço é capaz de enviar automaticamente a todos os clientes um e-mail e uma mensagem de SMS. No caso da inatividade temporária de algum serviço, o sistema implementará um mecanismo de tentativas sucessivas de modo a não haver perda de dados. Ruby recebe elogios bem-merecidos.

Lilian

Lilian, fundadora da Pet Theory

Olá, Ruby.

Muito obrigada por todo seu trabalho árduo e liderança.

Em um curto espaço de tempo, nossos principais sistemas foram totalmente reformulados.

Na sexta-feira, faremos uma pequena reunião para celebrar, e seria ótimo se você pudesse participar como nossa convidada de honra.

Lilian

MelodyMelody, diretora administrativa

Ruby,

Recebi da Pet Theory elogios pelo seu trabalho. Você é muito importante para nossa equipe.

Agora que você terminou essa tarefa, eu gostaria de conversar com você sobre uma função mais sênior em um novo projeto.

Melody

Diretora administrativa

Computer Consulting Inc.

Termine a Quest

Este laboratório autoguiado é parte da Quest Google Cloud Run Serverless Workshop. Uma Quest é uma série de laboratórios relacionados que formam um programa de aprendizado. Ao concluir esta Quest, você vai receber o selo acima como reconhecimento pela sua conquista. É possível publicar os selos e incluir um link para eles no seu currículo on-line ou nas mídias sociais. Caso você já tenha realizado este laboratório, inscreva-se nesta Quest para ganhar os créditos de conclusão imediatamente. Confira outras Quests disponíveis.

Comece o próximo laboratório

Continue sua Quest com o próximo laboratório da série, Como desenvolver uma API REST com o Go e o Cloud Run.

Próximas etapas / saiba mais

Artigo do Medium: Cloud Run as an internal async worker

Treinamento e certificação do Google Cloud

Esses treinamentos ajudam você a aproveitar as tecnologias do Google Cloud ao máximo. Nossas aulas incluem habilidades técnicas e práticas recomendadas para ajudar você a alcançar rapidamente o nível esperado e continuar sua jornada de aprendizado. Oferecemos treinamentos que vão do nível básico ao avançado, com opções de aulas virtuais, sob demanda e por meio de transmissões ao vivo para que você possa encaixá-las na correria do seu dia a dia. As certificações validam sua experiência e comprovam suas habilidades com as tecnologias do Google Cloud.

Manual atualizado em 20 de setembro de 2023

Laboratório testado em 20 de setembro de 2023

Copyright 2024 Google LLC. Todos os direitos reservados. Google e o logotipo do Google são marcas registradas da Google LLC. Todos os outros nomes de produtos e empresas podem ser marcas registradas das respectivas empresas a que estão associados.