Checkpoints
Create a Pub/Sub topic
/ 10
Deploy the Lab Report Service: Build
/ 15
Create a Revision for Cloud Run
/ 15
Deploy the Email Service: Build
/ 15
Create a new Revision
/ 15
Create a service account
/ 10
Create a Pub/Sub subscription
/ 10
Deploy the SMS Service
/ 10
Crie um sistema resiliente e assíncrono com o Cloud Run e o Pub/Sub
GSP650
Visão geral
Nos laboratórios do curso Serverless Cloud Run Development, 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 escolheram usar a tecnologia sem servidor.
Objetivos
Neste laboratório, você vai aprender a:
- Criar um tópico e uma assinatura do Pub/Sub
- Criar um serviço do Cloud Run que recebe solicitações HTTP e publica mensagens no Pub/Sub
- Criar um serviço do Cloud Run que recebe mensagens do Pub/Sub
- Criar uma assinatura do Pub/Sub que aciona um serviço do Cloud Run
- Testar a resiliência de um sistema
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:
- Como importar dados para um banco de dados do Firestore
- Criar um app da Web sem servidor com o Firebase
- Crie um app sem servidor que gera arquivos PDF com o Cloud Run
Configuração e requisitos
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).
- Tempo para concluir o laboratório---não se esqueça: depois de começar, não será possível pausar o laboratório.
Como iniciar seu laboratório e fazer login no console do Google Cloud
-
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ê vai encontrar o seguinte:
- O botão Abrir console do Google Cloud
- O tempo restante
- As credenciais temporárias que você vai usar neste laboratório
- Outras informações, se forem necessárias
-
Se você estiver usando o navegador Chrome, clique em Abrir console do Google Cloud ou clique com o botão direito do mouse e selecione Abrir link em uma janela anônima.
O laboratório ativa os recursos e depois abre a página Fazer login em outra guia.
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. -
Se necessário, copie o Nome de usuário abaixo e cole na caixa de diálogo Fazer login.
{{{user_0.username | "Nome de usuário"}}} Você também encontra o Nome de usuário no painel Detalhes do laboratório.
-
Clique em Seguinte.
-
Copie a Senha abaixo e cole na caixa de diálogo de boas-vindas.
{{{user_0.password | "Senha"}}} Você também encontra a Senha no painel Detalhes do laboratório.
-
Clique em Seguinte.
Importante: você precisa usar as credenciais fornecidas no laboratório, e não as da sua conta do Google Cloud. Observação: se você usar sua própria conta do Google Cloud neste laboratório, é possível que receba cobranças adicionais. -
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 Google Cloud será aberto nesta guia.
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.
- Clique em 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:
gcloud
é a ferramenta de linha de comando do Google Cloud. Ela vem pré-instalada no Cloud Shell e aceita preenchimento com tabulação.
- (Opcional) É possível listar o nome da conta ativa usando este comando:
-
Clique em Autorizar.
-
A saída será parecida com esta:
Saída:
- (Opcional) É possível listar o ID do projeto usando este comando:
Saída:
Exemplo de saí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:
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, 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, 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.
Depois de analisar o processo geral, Ruby acha que é possível projetar um sistema em que a Pet Theory consiga:
- receber a solicitação do POST de HTTP e enviar ao laboratório uma confirmação de recebimento;
- enviar um e-mail ao cliente com o resultado;
- 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, 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 Ruby |
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
.
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.
- Execute o seguinte comando para criar um tópico do Pub/Sub:
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.
- Depois ative o Cloud Run, que vai executar seu código na nuvem:
Selecione Verificar meu progresso para conferir o objetivo.
Não se esqueça de informar Ruby que o tópico do Pub/Sub está pronto para ser usado.
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, 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.
Este serviço será usado para prototipagem e, por isso, ele só vai fazer duas coisas:
- Receber o POST de HTTPS do serviço contendo os dados do resultado.
- Publicar uma mensagem no Pub/Sub.
Adicione o código do serviço de resultados do laboratório
- No Cloud Shell, clone o repositório necessário para este laboratório:
- Migre para o diretório
lab-service
:
- Instale os pacotes abaixo, que serão necessários para receber as solicitações HTTPS de entrada e publicar no Pub/Sub:
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.
-
Abra o arquivo
package.json
. -
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:
"start": "node index.js",
Caso contrário, a implantação terá erros.
- Crie um arquivo com o nome
index.js
e adicione este código a ele:
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.
- Agora crie um arquivo com o nome
Dockerfile
e adicione a ele o seguinte código:
Esse arquivo define como criar um pacote do serviço Cloud Run em um contêiner.
Implante o lab-report-service
- Crie um arquivo com o nome
deploy.sh
e cole estes comandos nele:
- No Cloud Shell, execute o código abaixo para tornar o arquivo executável:
- Chegou a hora de implantar o serviço de resultados do laboratório. Execute o script de implantação:
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:
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.
Selecione Verificar meu progresso para conferir o objetivo.
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.
- Primeiramente, para facilitar o trabalho, coloque o URL do resultado em uma variável de ambiente.
- Confirme que LAB_REPORT_SERVICE_URL foi capturada:
- Crie um novo arquivo com o nome
post-reports.sh
e adicione este código a ele:
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.
- Torne o script
post-reports.sh
executável:
- Para testar o endpoint do serviço de resultados do laboratório, poste três resultados nele usando o script descrito acima:
Esse script postou três resultados no serviço. Verifique os registros para conferir os resultados.
-
No console do Cloud, clique em Menu de navegação () > Cloud Run.
-
O recém-implantado lab-report-service vai aparecer na lista de Serviços. Clique nele.
-
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.
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.
Adicione código ao serviço de e-mail
- Migre para o diretório do serviço de e-mail:
- Instale os pacotes abaixo para que o código processe as solicitações HTTPS de entrada:
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.
-
Abra o arquivo
package.json
. -
Na seção "scripts", adicione a linha
"start": "node index.js",
conforme mostrada abaixo, e salve o arquivo:
"start": "node index.js",
Caso contrário, a implantação terá erros.
- Crie um arquivo chamado
index.js
e adicione a ele o seguinte:
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.
- Agora crie um arquivo com o nome
Dockerfile
e adicione a ele o seguinte código:
Esse arquivo define como criar um pacote do serviço Cloud Run em um contêiner.
Implante o serviço de e-mail
- Crie um arquivo chamado
deploy.sh
e adicione a ele o seguinte código:
- Torne
deploy.sh
executável:
- Implante o serviço de e-mail:
Quando a implantação estiver concluída, será mostrada uma mensagem parecida com esta:
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.
Selecione Verificar meu progresso para conferir o objetivo.
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.
- Crie uma nova conta de serviço que será usada para acionar os serviços que respondem mensagens do Pub/Sub:
Selecione Verificar meu progresso para conferir o objetivo.
- Conceda permissão à nova conta de serviço para invocar o serviço de e-mail:
Em seguida, faça o Pub/Sub invocar o serviço de SMS quando uma mensagem do "new-lab-report" for publicada.
- Insira o número do projeto em uma variável de ambiente para facilitar o acesso:
Em seguida, ative o projeto para criar tokens de autenticação do Pub/Sub.
- Execute o código abaixo:
- Insira o URL do serviço de e-mail em outra variável de ambiente:
- Confirme a captura do EMAIL_SERVICE_URL:
- Crie uma inscrição do Pub/Sub para o serviço de e-mail.
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.
Teste o serviço de resultados do laboratório e o serviço de e-mail juntos
- Usando o script que você já criou, poste nos relatórios do laboratório outra vez:
-
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.
-
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.
Adicione o código do serviço de SMS
- Crie um diretório para o serviço de SMS:
- Instale os pacotes necessários para receber as solicitações HTTPS de entrada:
-
Abra o arquivo
package.json
. -
Na seção "scripts", adicione a linha
"start": "node index.js",
conforme mostrada abaixo, e salve o arquivo:
"start": "node index.js",
Caso contrário, a implantação terá erros.
- Crie um arquivo chamado
index.js
e adicione a ele o seguinte:
- Agora crie um arquivo com o nome
Dockerfile
e adicione a ele o seguinte código:
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
- Crie um arquivo com o nome
deploy.sh
e adicione este código a ele:
- Torne
deploy.sh
executável:
- Implante o serviço de SMS:
Quando a implantação terminar, uma mensagem semelhante a esta será exibida:
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.
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.
- Configure as permissões para fazer com que o Pub/Sub acione o serviço de SMS:
Em seguida, faça com que o Pub/Sub invoque o serviço de SMS quando uma mensagem “new-lab-report” for publicada.
- A primeira etapa é inserir o endereço do URL do serviço de SMS em uma variável de ambiente:
-
Confirme a captura de SMS_SERVICE_URL:
echo $SMS_SERVICE_URL -
Em seguida, crie a inscrição do Pub/Sub:
- Execute o script de teste de novo para postar três resultados no serviço de resultados do laboratório:
-
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.
-
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.
- Volte para o diretório
email-service
:
Adicione um texto inválido ao aplicativo de serviço de e-mail para causar um erro.
- Edite
index.js
e adicione a linhathrow
à funçãosendEmail()
, como mostrado abaixo. Isso vai gerar uma exceção, como se o servidor de e-mail estivesse inativo:
Adicionar esse código vai causar um erro no serviço quando ele for invocado.
- Implante esta versão incorreta do serviço de e-mail:
- 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:
-
Abra os registros do serviço de e-mail para conferir o serviço incorreto: Menu de navegação > Cloud Run.
-
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.
- 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:
- Implante a versão corrigida do serviço de e-mail:
- 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
- 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.
- 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.
- 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.
- 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, 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 |
Melody, 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. |
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 1º de fevereiro de 2024
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.