Isadora Moresco
Evelyn de Gois Meneses
José Bulgarelli Neto
Bianca Fernanda Leite
Guilherme Vinicius Pignatari
A criação de um sistema de gestão de estoque eficaz é crucial para o sucesso da operação de uma cadeia de supermercados. Este projeto foi criado para atender a essa necessidade, usando uma abordagem que alia a robustez do MongoDB à flexibilidade da linguagem Python. O MongoDB foi escolhido devido sua utilização em sala de aula e sua capacidade de lidar com grandes volumes de dados, proporcionar alta disponibilidade e escalabilidade, características fundamentais para um sistema de gerenciamento de estoque. O banco de dados foi configurado com três shards, distribuídos de forma a equilibrar a carga e otimizar o tempo de resposta.
Baseado na avaliação, o MongoDB foi dividido em três shards. A opção por sharding teve como objetivo assegurar que o sistema pudesse se expandir horizontalmente, atendendo a um aumento na demanda sem prejudicar o desempenho. Cada shard foi configurado para armazenar um subconjunto dos dados, distribuídos de acordo com a chave de sharding definida para melhorar a distribuição e a eficiência das operações de leitura e escrita. Para criar e administrar os shards, foi criado um script em Python. O programa automatizou o processo de configuração, incluindo a criação dos shards, a definição das réplicas e a configuração da chave de sharding.
Para popular os dados no MongoDB, foi desenvolvido um script utilizando bibliotecas como random para a criação de dados aleatórios. Esse script gera um conjunto de dados combinando nomes de produtos com descrições de produtos, bem como nomes de filiais com suas respectivas localizações. Dessa forma, ele cria um "cross join" aleatório entre essas listas para a inserção dos dados no banco.
A biblioteca random
foi fundamental para essa tarefa, pois permite a geração de dados aleatórios, garantindo diversidade e imprevisibilidade nos registros criados. A função random.choice foi usada para selecionar aleatoriamente elementos das listas de nomes de produtos, descrições, nomes de filiais e localizações. Além disso, a função random.randint
foi utilizada para gerar valores numéricos aleatórios, como IDs de produtos e filiais.
O script segue o seguinte fluxo:
- Criação de listas de dados base:
Lista de nomes de produtos, lista de descrições de produtos, lista de nomes de filiais, lista de localizações de filiais.
- Geração de combinações aleatórias:
Utilizando a função random.choice
, o script seleciona aleatoriamente um nome de produto e uma descrição para formar um registro de produto. De forma similar, seleciona aleatoriamente um nome de filial e uma localização para formar um registro de filial.
- Inserção no MongoDB:
Os registros gerados aleatoriamente são então inseridos no MongoDB, utilizando a biblioteca pymongo
para a comunicação com o banco de dados.
Com esse método, é possível gerar um volume significativo de dados variáveis para fins de teste ou preenchimento inicial de um banco de dados, facilitando o desenvolvimento e a validação de funcionalidades dependentes desses dados. O Python foi escolhido devido à sua simplicidade e poderosas bibliotecas de automação, o que facilita a interação com o MongoDB e inserção dos dados.
Inclusão de 10.000 registros com script em Python
Inserção de milhões de linhas com o mesmo script em Python
Inserção 02 de milhões de linhas com o mesmo script em Python
Tempo de execução de 0.06 ms para consulta de 638.954 documentos
Atualização de produtos com preço de 16.31 para 32.57 (5 linhas afetadas)
Atualização com milhões de linhas
Após a implantação, o sistema foi submetido a uma série de testes de desempenho para testar sua eficiência em condições operacionais ideais. Os resultados mais relevantes incluem:
Tempo de Resposta: As operações de leitura e escrita tiveram um tempo médio de 0.09ms (máximo)
, mesmo sob uma grande quantidade de consultas simultâneas.
A configuração com réplicas garantiu uma alta disponibilidade do sistema, com um tempo de inatividade próximo a zero nos testes de failover.
Utilizamos o framework Docketeer para auxiliar na observabilidade dos contêineres Docker.
O Docketeer oferece uma interface gráfica intuitiva que facilita a visualização e o controle de contêineres, imagens e volumes Docker. Estamos utilizando o Docketeer especificamente para capturar e monitorar informações relacionadas ao desempenho, disponibilidade e outras métricas importantes dos contêineres em teste. Esta ferramenta permite uma melhor análise e gestão desses processos, garantindo uma operação mais eficiente e confiável.
Para mais informações sobre o Docketeer, acesse o repositório oficial ou a documentação.
Apesar de os testes de desempenho terem mostrado resultados satisfatórios, algumas áreas para melhorar foram identificadas:
- Otimização de Consultas: Revisar e otimizar as consultas MongoDB para diminuir ainda mais o tempo de resposta, sobretudo em operações complexas de agregação;
- Adotar um sistema de monitoramento mais eficiente para identificar e responder prontamente a problemas de desempenho ou falhas;
- Escalabilidade: Implementar escalabilidade automática para processar grandes volumes de dados; Essa abordagem, que combina uma infraestrutura robusta com técnicas de otimização constante, garante que o sistema de gerenciamento de estoque possa evoluir para atender às crescentes demandas da cadeia de supermercados, proporcionando um serviço eficiente e confiável.