[PITCH] - Desenvolvendo um Microserviço para Verificar Disponibilidade de Conteúdo em uma plataforma(Spotify, Deezer, Netflix)
Introdução e Recap
Olá Pessoal, anteriormente eu escrevi um artigo no tabnews falando sobre o RecomendeMe: O Recomendeme é uma plataforma desenvolvida que permite aos usuários submeter recomendações culturais para uma comunidade. Essas recomendações podem incluir filmes, músicas, livros, séries de TV, eventos locais e muito mais. O objetivo é criar uma plataforma onde os usuários possam compartilhar suas descobertas culturais favoritas com outras pessoas sem a necessidade de recomendações por algoritmos de inteligência artificial.
Uma das funcionalidades da aplicação era a possibilidade de saber em quais das principais plataformas um determinado conteúdo estaria disponível assim que o usuário submetesse a recomendação. Para isso, desenvolvi um microserviço em Flask que recebe uma requisição POST e, a partir do nome do artista e do álbum, salva o link em um banco de dados.
Arquitetura e questão de performance
Como já havia desenvolvido uma API em JavaScript com o objetivo de salvar a recomendação em formato JSON, com as seguintes propriedades:
{
"titulo": "Breaking - Phobia",
"usuario": "nome_do_usuario",
"descricao": "Descrição da recomendação.",
"img": "https://url-da-imagem.com/imagem.jpg",
"created_at": "2024-02-12T12:00:00Z",
"updated_at": "2024-02-12T12:00:00Z",
"reclink": "https://link-da-recomendacao.com"
}
Pensei que a API já estivesse assumindo muitas responsabilidades ao incluir a tarefa de buscar esses links diretamente no controller ou em um serviço interno da própria API. Isso poderia sobrecarregar a API com muitas atribuições. Por isso, surgiu a ideia de criar um microserviço em Flask dedicado a essa função. Ao adicionar o microserviço à arquitetura da aplicação, deparei-me com duas possibilidades de comunicação entre a API e o microserviço (embora o rascunho possa parecer confuso, na minha mente faz sentido hahaha)
(1) A primeira possibilidade envolveu a comunicação entre o microserviço e a API através do método POST, seguindo esta lógica
-
O usuário submete uma recomendação de conteúdo:
(POST -> API -> Microserviço e Banco de Dados)
-
A API redireciona um método POST para o Microserviço, que recebe a requisição, busca os links e, em seguida, envia um PUT de volta para a API para atualizar os links:
(Microserviço -> Buscadores -> PUT -> API -> Banco de Dados)
Embora essa abordagem oferecesse uma comunicação mais direta entre a API e o Microserviço, do ponto de vista de desempenho, havia o risco de sobrecarregar a API. Além disso, devido às requisições em rede, poderiam ocorrer falhas de comunicação.
(2) A segunda possibilidade consistia em uma abordagem mais simplificada, porém menos comunicativa em relação à API, ou seja, a API não seria notificada pelo método PUT sobre as atualizações no banco de dados feitas pelo Microserviço.
-
Em termos mais simples, sempre que uma recomendação fosse feita, um método POST seria enviado da API para o Microserviço, e o Microserviço atualizaria o banco de dados com um método UPDATE, utilizando apenas os parâmetros de título e usuário
API -> POST -> Microserviço -> Buscadores -> Banco de Dados.
Uma vantagem de desenvolver esse microserviço em Python foi a capacidade de incluir várias automações. Por exemplo, em vez de exigir que o usuário fornecesse a URL da imagem, agora isso não é mais necessário, pois o módulo Flask inclui um módulo Bing que busca a imagem e retorna uma URL correspondente à imagem disponível na internet.
@app.route('/update_image', methods=['POST'])
def update_image():
try:
# Obtém os dados do POST
data = request.json
nome = data.get('nome')
id_recomendacao = data.get('id')
# Faz uma busca por uma imagem com base no nome do álbum e do artista
image_urls = bing_image_urls(nome, limit=1)
# Verifica se foram encontradas URLs de imagens
if image_urls:
image_url = image_urls[0]
# Conecta ao banco de dados MySQL
connection = mysql.connector.connect(**db_config)
cursor = connection.cursor()
# Atualiza o registro no banco de dados com o link da imagem encontrada
update_query = "UPDATE recomendacoes SET img = %s WHERE id = %s"
cursor.execute(update_query, (image_url, id_recomendacao))
connection.commit()
Mudança na estrutura do banco de dados
Como o objetivo era salvar vários links, considerei algumas possibilidades em relação ao parâmetro RecLink. Pensei em fazer com que a API retornasse um array contendo os links, mas isso exigiria uma atualização completa da lógica do front-end da aplicação para lidar com esses novos tipos de dados. Outra opção seria criar uma tabela específica para os links, resultando em algo como:
CREATE TABLE rec_links (
id INT AUTO_INCREMENT PRIMARY KEY,
recommendation_id INT,
platform VARCHAR(50),
link VARCHAR(255),
FOREIGN KEY (recommendation_id) REFERENCES recomendacoes(id)
);
Por questões de praticidade (apenas queria ver funcionar), achei mais fácil criar mais três colunas no banco de dados representando as principais plataformas:
ALTER TABLE recomendacoes
ADD COLUMN rec_link_deezer VARCHAR(255),
ADD COLUMN rec_link_spotify VARCHAR(255),
ADD COLUMN rec_link_ytmusic VARCHAR(255);
Apesar de não ser uma boa prática e algo que, certamente, resultaria na expansão de colunas no banco de dados, achei mais fácil e prático já que eu tinha conhecimento prévio de quantas e quais plataformas estariam presentes. Dessa forma, criei as colunas rec_link_deezer, rec_link_spotify e rec_link_ytmusic para armazenar os links de cada plataforma diretamente na tabela de recomendações.
Resultados
Separação de preocupações: o microserviço pode lidar com lógica específica de atualização separadamente da API principal.
Escalabilidade: se a lógica de atualização se tornar complexa ou pesada, a separação em um microserviço pode ajudar a escalonar essa parte do sistema de forma independente.
Controle granular: você tem mais controle sobre a lógica de atualização e pode ajustar facilmente o comportamento do microserviço conforme necessário.
Antes, no formulário, era necessário incluir em qual plataforma aquele conteúdo foi consumido e uma alguma imagem de referência, agora, com a atualização só é necessário um Username, recomendação e um comentário sobre.
Contatos
Para quem se interessou pelo projeto ou deseja contribuir de alguma forma, disponibilizo meus contatos e os repositórios relacionados. Vale ressaltar que ainda estou organizando alguns detalhes; por exemplo, o repositório do microserviço ainda contém scripts de testes das bibliotecas
- Email: [email protected]
- LinkedIn: Lucas Matheus