Com licença, se essa pergunta parecer ingênua, mas me deparei com um cenário em que preciso gerenciar a contagem de produtos no banco de dados de uma loja de comércio eletrônico.
Existe uma classe de produto com uma variável inteira productCount
que significa o número de produtos disponíveis no banco de dados que é visível para os usuários do site. Agora, essa classe é acessada por vários threads ou pode-se dizer vários usuários do site de comércio eletrônico. Todo mundo está adicionando ou removendo o produto ao carrinho.
A estrutura ORM que está sendo usada é hibernada
Código de amostra
@Entity
@Table
class Product{
@Column
private int productCount;
public void addProductToCart(){
// decrements the product count by 1 & updates the database
}
public void removeTheProductFromTheCart(){
// increments the product count by 1 & updates the database
}
Como está claro no código, eu preciso manter uma verificação de simultaneidade na contagem de produtos no banco de dados para evitar atualizações perdidas.
Além disso, se vários usuários estiverem tentando adicionar apenas um produto esquerdo no banco de dados. De qual carrinho de usuário o produto deve ser adicionado?
Eu fiz uma pequena pesquisa sobre isso
As possíveis maneiras que encontrei foram
Criando uma classe singleton para Product. Isso garantiria que apenas uma instância do produto estivesse disponível em todo o aplicativo.
Sincronize os métodos addProductToCart
& removeTheProductFromTheCart
. o que permitiria que apenas um segmento atualizasse a contagem de produtos e atualizasse o banco de dados por vez.
Use o controle de simultaneidade do banco de dados e aplique algum nível de isolamento de transação de banco de dados, bloqueio otimista / pessimista para o productCount
. Estou usando o mysql, o nível de isolamento padrão é REPEATABLE_READ
.
Qual seria a melhor abordagem para lidar com isso?
Nas duas primeiras possibilidades que você está considerando, elas funcionam apenas se você estiver restrito a implantar apenas uma única instância do aplicativo. Você não pode ter singletons gerenciados em várias instâncias de aplicativos, não pode ter sincronização em várias JVMs. Portanto, se você optar por uma dessas opções, as opções de implantação serão restritas, a única maneira de implantar várias instâncias do aplicativo é se você fizer algo como fixar as sessões em uma instância específica, o que é ruim para o balanceamento de carga. Então, esses dois parecem indesejáveis.
A abordagem de obter as contagens de produtos do banco de dados tem a vantagem de permanecer válida à medida que seu aplicativo é escalado em várias instâncias sem prejudicar o balanceamento de carga.
Você pode pensar que esta será apenas uma instância em um servidor, para que eu possa resolver isso. Mas, no momento em que você está construindo um aplicativo, pode não estar totalmente claro como o aplicativo será implantado (estive em situações em que não sabíamos qual era o plano até que o aplicativo foi configurado em um ambiente de pré-produção) ou posteriormente, pode haver um motivo para alterar a maneira como um aplicativo é implantado; se o seu aplicativo tiver uma carga acima do esperado, pode ser benéfico configurar uma segunda caixa.
Uma coisa que não é aparente para mim é o quão vital é que a contagem de produtos esteja realmente correta. Em diferentes domínios comerciais (passagens aéreas, remessas), é comum reservar em excesso e pode ser mais complicado do que vale a pena manter uma contagem 100% precisa, especialmente se estiver em um ponto inicial do processo, como adicionar um item às compras carrinho (comparado ao ponto em que o cliente realmente se compromete a fazer uma compra). No momento em que o cliente compra algo, pode fazer mais sentido garantir a reserva desses itens com uma transação de banco de dados (ou não, consulte overbooking novamente).
Parece comum em aplicativos da Web esperar uma baixa taxa de conversão de itens no carrinho para itens realmente comprados. Lembre-se de que nível de precisão para suas contagens é apropriado para o domínio da sua empresa.
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras