Se você imagina uma empresa como a Amazon (ou qualquer outro aplicativo Web de comércio eletrônico), que opera uma loja on-line em grande escala e possui apenas uma quantidade limitada de itens físicos em seus armazéns, como eles podem otimizar isso, de modo que não haja gargalo único? Obviamente, eles devem ter vários bancos de dados com replicação e muitos servidores que lidam com a carga de maneira independente. No entanto, se vários usuários estiverem sendo atendidos por servidores separados e ambos tentarem adicionar o mesmo item ao carrinho, para o qual resta apenas um, deve haver alguma "fonte de verdade" para a quantidade restante para esse item. Isso não significa que, no mínimo, todos os usuários que acessam informações do produto para um único item devem consultar o mesmo banco de dados em série?
Gostaria de entender como você pode operar uma loja tão grande usando computação distribuída e não criar um grande gargalo em um único banco de dados que contém informações de inventário.
fonte
Respostas:
Na verdade não. Este não é um problema que exija uma solução técnica 100% perfeita, porque os dois casos de erro têm uma solução comercial que não é muito cara:
De fato, recentemente experimentei o segundo caso, então não é hipotético: é isso que acontece e como a Amazon lida com isso.
É um conceito que se aplica frequentemente quando você tem um problema que é teoricamente muito difícil de resolver (seja em termos de desempenho, otimização ou qualquer outra coisa): geralmente você pode viver com uma solução que funciona muito bem na maioria dos casos e aceitar que às vezes falhar, desde que você possa detectar e lidar com as falhas quando elas ocorrerem.
fonte
Uma combinação de
Não há mágica, apenas situações cada vez mais complexas. Assim como o DNS, ele é feito em escala.
A 'versão única da verdade' faz parte de tais sistemas. Gerar uma nova chave se torna uma operação mais complexa do que apenas gerar o próximo número na sequência. Por exemplo, existem outras sequências. Esse é o tipo de complexidade com que os sistemas de banco de dados distribuídos podem lidar e o fazem executando várias operações de e para componentes ao criar novos objetos, tornando-os disponíveis para outros, garantindo que as seqüências sejam únicas quando precisam, chaves compostas, etc. .
fonte
Vi o problema 'Último item em estoque' resolvido da seguinte maneira:
Atualize todos os níveis de estoque diariamente e sinalize os produtos para categorias alta, baixa, no pedido ou fora de estoque, de acordo com os níveis limite.
Obviamente, são os itens de 'baixo estoque' que são problemáticos
Não se preocupe em verificar o nível de estoque. Basta fazer o pedido
Avise o usuário ao navegar em "Últimos poucos que restam!". Quando pagar, verifique e diminua o nível do estoque. Se estiver esgotado, atualize o status do item.
Dessa forma, você só acessa o banco de dados para os itens de 'estoque baixo' e o faz apenas quando o cliente está bastante adiantado no processo de compra. O custo é que alguns clientes não poderão concluir sua compra.
No entanto, na maioria dos casos, 'estoque esgotado' significa realmente que você está aguardando outra entrega; portanto, você deseja aceitar o pedido de qualquer maneira e talvez apenas exibir um aviso ou restringir as opções de entrega. Portanto, esses clientes não estão perdidos.
Durante tempos de carregamento altos, como vendas, você pode até desativar a verificação de estoque e enviar um e-mail aos clientes mais tarde: 'desculpe, ficamos sem X, gostaria de Y'?
Essencialmente, o objetivo de qualquer plataforma de comércio eletrônico nunca é lido no banco de dados. Sempre sirva páginas em cache e faça tudo do lado do cliente.
fonte
Neste vídeo, Martin Fowler discute os bancos de dados NoSQL:
https://www.youtube.com/watch?v=qI_g07C_Q5I
Um dos pontos (em algum lugar) é que lugares como a Amazon preferem manter 99% das pessoas felizes aceitando seu pedido sem poder verificar "com certeza" se ele está realmente disponível e talvez irritar uma porcentagem muito pequena por ter para dizer "desculpe, parece que alguém venceu você".
Ou seja, não há tratamento real para o cenário que você descreve, apenas que a Amazon tira proveito da dúvida com base na última leitura bem-sucedida do inventário e se uma transação simultânea se esvair entre oopsie.
(btw, esse é um ótimo vídeo se você estiver curioso sobre o NoSQL)
fonte