Leve fragmentação para seu aplicativo do Spring Boot com o Spring Data MongoDB
Avalie esse Tutorial
Você está atingindo seus limites. Seu aplicativo está consumindo grandes quantidades de dados todos os dias. Mais recursos, mais interações, tudo o que você queria que seu aplicativo alcançasse, mas chegou a um gargalo. Com um aplicativo com alto rendimento, o sharding pode ser a solução que você procura.
{Sharding é um método de distribuição de umconjunto de dados em várias máquinas. Bancos de dados com conjuntos de dados ou taxa de transferência de leitura/gravação suficientemente grandes podem desafiar a capacidade de um único servidor. Há dois métodos para enfrentar esse desafio: escalonamento vertical e escalonamento horizontal.
O dimensionamento vertical é simples. As taxas de query estão esgotando a CPU? Atualize a CPU! Meu conjuntos de trabalho excederam o tamanho da RAM do sistema? Mais RAM! Embora a atualização de seu servidor seja uma solução perfeitamente válida e, muitas vezes, correta, há limites. O hardware só fica tão bom, graças aos limites da tecnologia. E, muitas vezes, o custo crescente é exponencial em comparação com o retorno do seu capital, então você atinge um ponto de retornos decrescentes.
O dimensionamento horizontal significa dividir seu conjunto de dados e carga de trabalho em vários servidores (como por meio de fragmentação). Cada máquina pode ser tão poderosa quanto a anterior, mas lida apenas com um subconjunto da carga de trabalho geral, proporcionando potencialmente melhor eficiência do que um servidor superpotente. "Muitas mãos fazem a luz funcionar!"
A desvantagem é uma maior complexidade na infraestrutura, mas expandir a capacidade significa apenas adicionar novos servidores conforme necessário, e o MongoDB Atlas reduz grande parte da complexidade do gerenciamento de clusters fragmentados.
- Uma conta do MongoDB
- Um projeto de inicialização Spring com
- Spring Data MongoDB
- Spring Web
- Você pode configurar isso usando Spring Initializr
Crie um cluster fragmentado, M30 ou superior. Ao criar seu cluster, em configurações adicionais, selecione Fragmentação e alterne para ativado. Defina o número de fragmentos a serem implantados com o cluster fragmentado. Para aplicativos de produção, use mais de um fragmento ou você não poderá colher todos os benefícios do cluster fragmentado, sobre o qual você pode ler mais na documentação de fragmentação. Isso pode ser entre 1 e 100 fragmentos, inclusive. Aguarde até que o cluster seja criado. Isso levará alguns minutos, então pegue uma xícara de café ou role seus TikToks. Depois de configurado, selecione carregar os dados de exemplopara este tutorial.
O Spring Data MongoDB não configura automaticamente a fragmentação para collection. Você precisa executar essas operações manualmente. Podemos fazer isso usando
mongosh
.Conecte-se ao seu cluster do MongoDB como administrador com sua string de conexão por meio de
mongosh
:1 mongosh "mongodb+srv://<username>:<password>@<cluster-url>/admin"
Fragmente a coleção de usuários por e-mail:
1 sh.shardCollection("sample_mflix.users", { email: 1 })
Você pode verificar se a fragmentação está habilitada e se a collection está fragmentada executando
sh.status()
.Em seu projeto de inicialização Spring, defina uma classe de entidade e use a anotação
@Sharded
para especificar os campos de chave de shard.O Spring Data MongoDB usa a anotação
@Sharded
para identificar entidades armazenadas em collection fragmentadas.1 import org.springframework.data.annotation.Id; 2 import org.springframework.data.mongodb.core.mapping.Document; 3 import org.springframework.data.mongodb.core.mapping.Field; 4 import org.springframework.data.mongodb.core.mapping.Sharded; 5 6 7 8 public class User { 9 10 11 private String id; 12 private String name; 13 14 private String email; 15 private String password; 16 17 // Getters and Setters 18 }
Adicionar a anotação
@Sharded
a uma entidade ajuda o Spring Data MongoDB a otimizar as operações em um ambiente fragmentado. Ela garante que a chave do fragmento seja incluída nas consultasreplaceOne
durante os upserts. Às vezes, isso pode exigir uma verificação adicional para encontrar o valor atual da chave de fragmento.Defina uma interface de repositório para sua entidade
User
estendendo MongoRepository
.1 import org.springframework.data.mongodb.repository.MongoRepository; 2 3 import com.mongodb.sharded.model.User; 4 5 public interface UserRepository extends MongoRepository<User, String> { 6 }
Crie uma classe de serviço para lidar com a lógica comercial e interagir com o repositório.
1 import java.util.List; 2 3 import org.springframework.beans.factory.annotation.Autowired; 4 import org.springframework.stereotype.Service; 5 6 import com.mongodb.sharded.model.User; 7 import com.mongodb.sharded.repository.UserRepository; 8 9 10 public class UserService { 11 12 13 private UserRepository userRepository; 14 15 public List<User> getAllUsers() { 16 return userRepository.findAll(); 17 } 18 19 public User saveUser(User user) { 20 return userRepository.save(user); 21 } 22 }
Crie uma classe de controlador para expor os pontos de extremidade REST para a entidade
User
.1 import org.springframework.beans.factory.annotation.Autowired; 2 import org.springframework.web.bind.annotation.*; 3 4 import java.util.List; 5 6 7 8 public class UserController { 9 10 11 private UserService userService; 12 13 14 public List<User> getAllUsers() { 15 return userService.getAllUsers(); 16 } 17 18 19 public User createUser( User user) { 20 return userService.saveUser(user); 21 } 22 }
Certifique-se de que seu aplicativo Spring Boot esteja configurado para se conectar ao MongoDB Atlas. Em seu application.properties ou
application.yml
, forneça o URI de conexão do MongoDB.1 spring.data.mongodb.uri=mongodb+srv://<username>:<password>@<cluster-url>/myDatabase?retryWrites=true&w=majority
Substitua
<username>
, <password>
e <cluster-url>
pelas suas credenciais e connection string do MongoDB Atlas.Escolha uma chave de fragmentação que garanta uma distribuição uniforme dos dados. A escolha de uma chave de fragmentação é fundamental para o desempenho e a escalabilidade do cluster fragmentado. Uma chave de fragmentação ideal deve:
- Ter alta cardinalidade: Isso significa que a chave deve ter muitos valores exclusivos para garantir que os dados sejam distribuídos uniformemente entre os shards. Não é necessário que uma chave de sharding seja totalmente exclusiva.
- Forneça uma distribuição uniforme: a chave deve distribuir os documentos uniformemente em todos os fragmentos para evitar pontos de acesso em que um fragmento processa mais dados ousolicitações do que outros.
- Suporte a consultas comuns: escolha uma chave que se alinhe aos padrões de consulta mais comuns para minimizar a dispersão de consultas e otimizar o desempenho.
Para a collection de usuários no banco de dados
sample_mflix
, o uso do campo de e-mail como chave de fragmentação pode ser uma boa opção se:- Os e-mails são exclusivos e bem distribuídos.
- As consultas frequentemente são filtradas ou classificadas por e-mail.
A fragmentação com MongoDB Atlas e Spring Boot permite que seu aplicativo seja dimensionado com eficiência e lide com cargas altas com desempenho e disponibilidade aprimorados. Seguindo este guia, você pode configurar um banco de dados fragmentado, desenvolver microsserviços e garantir que seu aplicativo esteja pronto para crescer e ter sucesso em um ambiente rigoroso.
Se quiser saber mais sobre MongoDB e Java, leia mais no Developer Center, onde você pode aprender a implantar seu aplicativo sharded spring como um microsserviço com o Azure e o Kubernetes. Ou, se você tiver alguma dúvida, acesse nossosfóruns da MongoDB Community.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.