Estou trabalhando nisso há alguns dias e encontrei várias soluções, mas nenhuma delas incrivelmente simples ou leve. O problema é basicamente o seguinte: temos um cluster de 10 máquinas, cada uma executando o mesmo software em uma plataforma ESB multithread. Posso lidar com problemas de simultaneidade entre threads na mesma máquina com bastante facilidade, mas e quanto à simultaneidade nos mesmos dados em máquinas diferentes?
Essencialmente, o software recebe solicitações para alimentar os dados de um cliente de uma empresa para outra via serviços da web. No entanto, o cliente pode ou não existir ainda no outro sistema. Caso contrário, criamos através de um método de serviço da web. Por isso, requer uma espécie de teste e configuração, mas preciso de um tipo de semáforo para impedir que as outras máquinas causem condições de corrida. Já tive situações em que um cliente remoto foi criado duas vezes para um único cliente local, o que não é realmente desejável.
As soluções com as quais eu brinquei conceitualmente são:
Usando nosso sistema de arquivos compartilhados tolerante a falhas para criar arquivos de "bloqueio" que serão verificados por cada máquina, dependendo do cliente
Usando uma tabela especial em nosso banco de dados e bloqueando a tabela inteira para fazer um "teste e configuração" para um registro de bloqueio.
Usando o Terracotta, um software de servidor de código aberto que auxilia no dimensionamento, mas usa um modelo de hub e spoke.
Usando o EHCache para replicação síncrona dos meus "bloqueios" na memória
Não consigo imaginar que sou a única pessoa que já teve esse tipo de problema. Como você resolveu isso? Você preparou algo internamente ou tem um produto de terceiros favorito?
convém considerar o uso de bloqueios distribuídos Hazelcast . Super leve e fácil.
java.util.concurrent.locks.Lock lock = Hazelcast.getLock ("mymonitor");
lock.lock ();
try {
// do your stuff
}finally {
lock.unlock();
}
Hazelcast - Fila distribuída, Mapa, Conjunto, Lista, Bloqueio
Este artigo é coletado da Internet.
Se houver alguma infração, entre em [email protected] Delete.
deixe-me dizer algumas palavras