Exemplo de como funcionar os serviços no instagram, para criar uma publicação
MIT License
Esse projeto simula 4 serviços do funcionamento do backend do Instagram, usando a arquitetura microservices.
Vai desde a parte da criação do usuário(authentication), até a parte de notificação push(mobile) para todos os seguidores do usuário.
O projeto consiste em utilizar boas práticas da arquitetura microservices, com: deploy independente, auto scaling independente e ponto de falha único.
O projeto, utiliza 3 serviços de terceiros, sendo o uso do RabbitMQ, AWS e Firebase.
Estou utilizando o serviço da Nuvem: Cloud AMQP, no qual possui os seguintes benefícios:
Também estou utilizando, a AWS para fazer deploy na nuvem, usando os serviços: AWS ECS, AWS ELB, AWS S3, AWS EFS e AWS Fargate.
Estou utilizando o Firebase, especificamente para pegar o Token do celular do usuário, e mandar notificação para os celulares.
Para mais informações sobre criação de um sistema de arquivos na nuvem(AWS EFS), e sobre o RabbitMQ, consulte o meu artigo: Criação e uso do AWS EFS e O que é o RabbitMQ, e para que serve?
O primeiro serviço, é o serviço responsável por fazer a autenticação do usuário, como criar o usuário no banco de dados.
Temos um banco de dados próprio para esse serviço. Isso é uma boa prática da arquitetura microservices, pois damos a responsabilidade dos dados apenas para um serviço.
Esse serviço também apresenta endpoints, para acesso das publicações que serão consumidas no aplicativo mobile.
Endpoints:
No banco de dados MongoDB, são gravados os dados do usuário, como:
O único serviço que tem a permissão, e as credenciais para se comunicar com esse banco de dados, é o serviço authentication. Qualquer serviço que deseje utilizar os dados desse serviço(dados do usuário), terá que fazer uma chamada via RabbitMQ(AMQP) para o serviço Authentication, aí o serviço Authentication irá pegar os dados do usuário, e mandar para o tópico onde ele foi requisitado.
No arquivo docker-compose.yaml, no serviço authentication, estão definidos 2 serviços, sendo eles:
O segundo serviço, será responsável por fazer o upload das imagens, na nuvem AWS S3.
Esse serviço irá receber os dados via chamada HTTP direta do aplicativo.
Esse serviço irá receber os dados da chamada HTTP POST do usuário, para criação de conteúdo, e então, irá salvar as imagens no conteiner, até fazer o resize das imagens, e upload das imagens no AWS S3. Após fazer upload da imagem no AWS S3, será retornado a URL do arquivo no S3, então, ele irá mesclar com o serviço AWS CloudFront, para pegar a imagem mais rapidamente(em cache).
Após pegar a imagem, ele irá pegar os dados JSON recebidos pela requisição HTTP, e com as strings das imagens feitas upload, irá enviar uma mensagem para o tópico 'publication', no RabbitMQ.
No arquivo docker-compose.yaml, no serviço Resize-Image, esta definido 1 serviço, sendo ele:
O terceiro serviço, é responsável por adicionar os dados da publicação, no banco de dados.
Esse serviço irá ouvir(consumer) as mensagens recebidas do serviço 'resize-image', para criar a publicação no banco de dados. Após criar a publicação no banco de dados, será enviado uma mensagem para o tópico 'notification'.
Esse serviço também apresenta endpoints, para acesso das publicações que serão consumidas no aplicativo mobile.
Endpoints:
Temos um banco de dados próprio para esse serviço. Isso é uma boa prática da arquitetura microservices, pois damos a responsabilidade dos dados apenas para um serviço.
No banco de dados MongoDB, são gravados os dados da publication, como:
O único serviço que tem a permissão, e as credenciais para se comunicar com esse banco de dados, é o serviço publication. Qualquer serviço que deseje utilizar os dados desse serviço(dados da publicação), terá que fazer uma chamada via RabbitMQ(AMQP) para o serviço Publication, aí o serviço Publication irá pegar os dados da publicação, e mandar para o tópico onde ele foi requisitado.
No arquivo docker-compose.yaml, no serviço publication, estão definidos 2 serviços, sendo eles:
O quarto serviço, é responsável por fazer a notificação mobile(push) dos usuários que estão seguindo o usuário que fez a publicação.
Esse serviço, feito em Python, irá consumir as mensagens recebidas do serviço 'publication', vai receber os dados da publicação, e então, irá enviar uma mensagem para o serviço 'authentication', requerindo os dados(token-notifications), de todos os usuários que estão seguindo o usuário que criou a publicação. Após receber a mensagem com os tokens dos usuários, ele irá enviar as notificações, usando o Firebase FMC.
Por problemas técnicos, esse serviço não consegue rodar em um conteiner docker. Quando você o roda em um conteiner, a aplicação simplesmente trava.
Para execução desse serviço, execute os comandos:
# Entrando na pasta do serviço
$ cd services/notification
# Habilitando o venv
$ ./venv/Scripts/activate
# Instalando as dependências
$ pip install -r requirements.txt
# Rodando o código
$ python main.py
O projeto, conta um aplicativo Mobile, desenvolvido em Flutter, para utilização do backend.
O App pode ser encontrado aqui