Executando verificação de segurança...
4

[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)

Whats-App-Image-2024-02-15-at-14-55-08

(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

  1. O usuário submete uma recomendação de conteúdo:

    (POST -> API -> Microserviço e Banco de Dados)

  2. 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.

  1. 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.

Whats-App-Image-2024-02-15-at-16-19-17
Whats-App-Image-2024-02-15-at-16-17-35-1

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

Carregando publicação patrocinada...