Como podemos sincronizar o acesso a um recurso comum usando a sincronização em Java quando meu aplicativo java é implantado em várias instâncias atrás de um balanceador de carga?
Porque, tanto quanto eu sei, a sincronização funciona apenas sob um JVM. Mas quando implantar o mesmo aplicativo Java em várias instâncias para lidar com a carga, então como podemos fornecer um mecanismo de sincronização?
Por exemplo: - Há um arquivo HDFS ao qual o aplicativo java quer Anexa / edita o conteúdo desse arquivo HDFS. Quando eu implantar o meu aplicativo java em várias instâncias, então como posso ter certeza de que apenas um pedido de aplicação Java acessa esse arquivo HDFS?
Resposta curta - Você não pode fazê-lo sem a introdução de uma série de complexidades na sua configuração.
Embora tecnicamente você pode usar algo como um bloqueio distribuído que está disponível no Zookeeper . Eu realmente não recomendo-los. É meio difícil argumentar com eles em escala e há também uma complexidade adicional em termos de si Zookeeper Operações.
Em relação ao exemplo que você postou, não é por isso que sistemas como o HBase foi construído? Modelar seus dados em uma chave -> [várias colunas] formato. Você pode, então, ler / gravar dados em HBase e seria nos bastidores fazer o trabalho pesado de edição / gerenciamento de múltiplos arquivos para você.
Por outro lado, se você pode modelar a sua mudança que você quer fazer em seu arquivo como um evento que você pode então construir o seu sistema nos princípios da Event Driven Architecture.
Você pode ler mais sobre isso em
- Introdução de vídeo no EDA de Martin Fowler - https://www.youtube.com/watch?v=STKCRSUsyP0
- Parte 1 - https://www.confluent.io/blog/build-services-backbone-events/
- Parte 2 - https://www.confluent.io/blog/apache-kafka-for-service-architectures/
- Modelo CQRS que Martin Fowler fala sobre nesta conversa - https://martinfowler.com/bliki/CQRS.html