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

Como vocês projetariam um sistema de gerenciamento de inventário?

Esses dias eu fiquei me perguntando como normalmente um sistema de gerenciamento de inventários de um sistema de compras online seria projetado. Um sistema de compras possibilita a venda de diversas unidades de diversos produtos e precisa garantir que somente a quantidade disponível no estoque seja vendida.

No meio dessa reflexão a minha dúvida acabou sendo a seguinte: Como a concorrência do inventário poderia ser gerenciada de forma escalável e eficiente?

De início a solução que me veio a mente, de uma forma ultrasimplificada, seria uma tabela no banco de dados que armazena os dados dos produtos assim como a quantidade disponível para cada produto:

id_produtonome_produtoquantidade
9381202Playstation 5100

Eu imaginei que em algum dado momento, a coluna quantidade precisaria ser atualizada para refletir as reservas do produto e o sistema precisaria garantir que nenhuma inconsistência seria gerada durante essa atualização, como transações concorrentes tentando atualizar o mesmo registro ao mesmo tempo.

Diagrama 1

Para garantir que essa inconsistência não aconteça, eu imaginei que um lock pessimista poderia ser utilizado sempre que a coluna quantidade de uma linha for atualizada, garantindo que as atualizações aconteçam de forma ordenada, isto é, uma após a outra.

Porém, ao utilizar essa abordagem um novo problema surge, sempre que houver transações concorrentes acessando a mesma linha do banco, a segunda transação terá que esperar a primeira transação liberar o lock para seguir em frente, fazendo com que o sistema enfrente alguns gargalos caso multiplas solicitações de compra sejam realizadas para um mesmo produto em um curto intervalo de tempo.

Vocês tem conhecimento de algum padrão / estratégia que poderia ser utilizado para lidar com esse último problema?

Carregando publicação patrocinada...
2

Porém, ao utilizar essa abordagem um novo problema surge, sempre que houver transações concorrentes acessando a mesma linha do banco, a segunda transação terá que esperar a primeira transação liberar o lock para seguir em frente, fazendo com que o sistema enfrente alguns gargalos caso multiplas solicitações de compra sejam realizadas para um mesmo produto em um curto intervalo de tempo.

De qual escala estamos falando?

Para um sistema pequeno isso é irrelevante.

Começa-se a tornar um problema somente com milhares de pessoas acessando simultaneamente, se esse não for o seu caso resolver esse problema é overengineering

1

Para um sistema pequeno um lock pessimista parece resolver, mas eu imagino que um sistema grande teria que lidar com essa situação. Eu queria saber quais são as práticas utilizadas pelo mercado em grandes sistemas para lidar com isso.

2

Uma vez fiz um projeto que tinha uma funcionalidade parecida, na época implementei uma fila de reserva onde quando o usuário demonstrava interesse por um item ele reserva aquele item por alguns minutos, dai caso o usuário não finalizasse a aquisição ele liberava o item.

E para não atrapalhar caso muitos usuários demostrassem interesse mais não efetivassem a aquisição, implementei um algoritmo bem simples que armazenava o número de vezes que ele demostrou interesse e não finalizou a aquisição, com isso tinha um índice que indicava a chance dele completar a aquisição e caso fosse muito baixa ele perdia a reserva para um usuário que tinha um índice alto de completar a aquisição.

Me "inspirei" em um da Uber que conheci em um podcast deles no Hipster da Alura, recomendo ouvir é muito interessante.

1

Sao usadas filas.
Cada compra cai em uma fila e vai sendo processada na sequência.
Enquanto isso, seu cliente fica em uma tela dizendo que o pedido está em processamento. Quando finaliza, ele recebe um e-mail avisando. Se a tela aijda estiver aberta, um socket avisa pra ela dizer que deu certo.
O importante é que nunca a requisição cai diretamente no banco. E, mesmo que tenha o lock, a requisição nunca ficará esperando ela finalizar.
O cliente clica em comprar e imediatamente vai pra página de processamento. Saca? Ele não fica com uma requisição esperando.
Pesquise sobre rabbitmq.

1

É um tema bem interessante! A princípio eu diria que basta ter produtos de redundância, como uma margem segura.

Exemplo: dos 100 disponíveis, permite a compra de forma mais simples até chegar em 10 unidades, a partir daí, um algoritmo iria restringir a possibilidade de acessos simultâneos para a possível compra.

Porém há casos e casos, e lidando com lucro, um algoritmo simples assim pode não ser a melhor opção.

1
1
1