Desenvolvendo seus aplicativos de forma mais eficiente com as instâncias sem servidor do MongoDB Atlas
Avalie esse Tutorial
Se você é um desenvolvedor, se preocupar com seu banco de dados não é necessariamente algo que você queira fazer. Você provavelmente não quer gastar seu tempo provisionando ou dimensionando clusters à medida que a demanda de seu aplicativo muda. Você provavelmente também não quer se preocupar em gastar muito se tiver escalado algo incorretamente.
Com o MongoDB Atlas, você tem algumas opções de implantação para escolher quando se trata do seu banco de dados. Embora você possa escolher um cluster compartilhado ou dedicado pré-provisionado, ainda precisa dimensionar e estimar os recursos de banco de dados necessários e, posteriormente, gerenciar a capacidade do cluster para melhor atender à demanda. Embora um cluster pré-provisionado não seja necessariamente uma coisa ruim, pode não fazer sentido se seu desenvolvimento ficar inativo ou se você estiver esperando períodos frequentes de crescimento ou declínio. Em vez disso, você pode optar por uma instância sem servidor para ajudar a eliminar a carga do gerenciamento de capacidade e liberar tempo para se dedicar à escrita de código. As instâncias sem servidor fornecem um endpoint de banco de dados sob demanda para seu aplicativo que será dimensionado automaticamente para cima e para baixo até zero com a demanda do aplicativo e cobrará apenas com base no seu uso.
Neste tutorial curto e simples, vamos ver como é fácil começar a usar uma MongoDB Atlas serverless instance e como começar a desenvolver um aplicativo nela.
Vamos começar implantando uma nova instância sem servidor do MongoDB Atlas. Há várias maneiras de implantar o MongoDB, mas, neste exemplo, vamos nos limitar ao painel da Web e a apontar e clicar.
Escolha "Sem servidor", bem como um cloud fornecedor onde essa instância deve residir.
Se possível, escolha um fornecedor de nuvem que corresponda ao local onde seu aplicativo ficará. Isso lhe proporcionará a melhor latência possível entre o banco de dados e o aplicativo.
Depois de optar por clicar no botão "Criar instância", sua instância está pronta para Go!
No entanto, você ainda não está limpo. Você não poderá usar sua MongoDB Atlas serverless instance fora do painel da Web até criar algumas regras de acesso ao banco de dados e à rede.
Começaremos com um novo usuário do banco de dados.
Escolha o tipo de autenticação que faz mais sentido para você. Para manter as coisas simples para este tutorial, recomendo escolher a opção "Senha".
Embora você possa usar a função incorporada " " quando se trata de privilégios de usuário, sua melhor opção para qualquer aplicativo é definir " Specific Privileges ", dependendo do que o usuário deve ter permissão para fazer. Para este projeto, usaremos um banco de dados " example " e uma coleção " people ", então faz sentido dar acesso de ReadWrite somente a esse banco de dados e coleção.
Use seu melhor critério ao criar usuários e definir acesso.
Com um usuário criado, podemos passar para o lado do acesso à rede. A etapa final antes de podermos começar a desenvolver nosso banco de dados.
Na guia "Network Access", adicione os IP que devem ter permissão de acesso. Se você estiver desenvolvendo e testando localmente, como eu, basta adicionar seu IP local. Lembre-se de adicionar o intervalo de IPs para seus servidores ou cloud quando chegar a hora. Você também pode aproveitar as vantagens da rede privada, se necessário.
Com o banco de dados e o acesso à rede fora do caminho, vamos pegar a string URI que usaremos na próxima etapa do tutorial.
Na aba Banco de dados, clique no botão "Conectar" para sua instância sem servidor.
Escolha a linguagem de programação que você deseja usar e anote o URI.
Precisa de mais ajuda para começar a usar instâncias sem servidor? Confira este vídeo que pode orientá-lo.
Neste ponto, você deve ter uma instância sem servidor do Atlas implantada. Vamos nos conectar a ele a partir do código do aplicativo e fazer algumas interações, como CRUD básico.
Para este exemplo específico, usaremos JavaScript com o driver Node.js do MongoDB, mas as mesmas regras e conceitos se aplicam, menos as diferenças de idioma para a linguagem de programação que você deseja usar.
No seu computador local, crie um diretório de projeto e navegue até ele com sua linha de comando. Você desejará executar os seguintes comandos assim que ele se tornar seu diretório de trabalho:
1 npm init -y 2 npm install mongodb 3 touch main.js
Com os comandos acima, inicializamos um projeto Node.js, instalamos o driver Node.js do MongoDB e criamos um arquivomain.js para conter nosso código.
Abra o arquivo main.js e adicione o seguinte código JavaScript:
1 const { MongoClient } = require("mongodb"); 2 3 const mongoClient = new MongoClient("MONGODB_URI_HERE"); 4 5 (async () => { 6 try { 7 await mongoClient.connect(); 8 const database = mongoClient.db("example"); 9 const collection = database.collection("people"); 10 const inserted = await collection.insertOne({ 11 "firstname": "Nic", 12 "lastname": "Raboy", 13 "location": "California, USA" 14 }); 15 const found = await collection.find({ "lastname": "Raboy" }).toArray(); 16 console.log(found); 17 const deleted = await collection.deleteMany({ "lastname": "Raboy" }); 18 } catch (error) { 19 console.error(error); 20 } finally { 21 mongoClient.close(); 22 } 23 })();
Então, o que está acontecendo no código acima?
Primeiro, definimos nosso cliente com a string URI para nossa instância sem servidor. Esta é a mesma string que você anotou anteriormente no tutorial e deve conter um nome de usuário e senha.
Com o cliente podemos estabelecer uma conexão e obter uma referência a um banco de dados e collection que queremos utilizar. O banco de dados e a collection não precisam existir antes da execução do seu aplicativo.
Em seguida, estamos realizando três operações diferentes com o MongoDB Query API. Primeiro, estamos inserindo um novo documento em nossa coleção. Depois que a inserção for concluída, supondo que nosso bloco try/catch não tenha encontrado um erro, encontramos todos os documentos em que o sobrenome corresponde. Neste exemplo, deve haver apenas um documento, mas você nunca sabe qual é a aparência do seu código. Se um documento for encontrado, ele será impresso no console. Por fim, estamos excluindo qualquer documento em que o sobrenome corresponda.
Ao final disso, nenhum documento deve existir em sua coleção, supondo que você esteja seguindo meu exemplo. No entanto, um documento (em algum momento) existia em sua coleção - acabamos de excluí-lo.
Tudo bem, então temos um exemplo básico de como criar um aplicativo em torno de um banco de dados on-demand, mas ele não destaca realmente o benefício do motivo pelo qual você gostaria de fazê-lo. Então, o que podemos fazer sobre isso?
Sabemos que clusters pré-provisionados e sem servidor funcionam bem e, do ponto de vista do desenvolvimento, você obterá os mesmos resultados usando o mesmo código.
Vamos criar um cenário em que uma instância sem servidor no Atlas possa reduzir seus custos de desenvolvimento e reduzir a carga de escalonamento para atender à demanda. Digamos que você tenha uma loja online, mas não qualquer tipo de loja online. Essa loja on-line vê tráfego suave na maior parte do tempo e um pico de 1000% no tráfego todas as segundas-feiras entre as horas de 9Manhã e 12tarde, devido a um negócio rápido que você executa.
Deixaremos o tráfego moderado para sua imaginação, mas um aumento de 1000% não é nada pequeno e provavelmente exigiria algum tipo de intervenção de escalonamento todas as sextas-feiras em um cluster pré-provisionado. Isso, ou você precisaria pagar por um banco de dados de tamanho maior.
Vamos visualizar este exemplo com o seguinte código Node.js:
1 const { MongoClient } = require("mongodb"); 2 const Express = require("express"); 3 const BodyParser = require("body-parser"); 4 5 const app = Express(); 6 7 app.use(BodyParser.json()); 8 9 const mongoClient = new MongoClient("MONGODB_URI_HERE"); 10 var database, purchasesCollection, dealsCollection; 11 12 app.get("/deal", async (request, response) => { 13 try { 14 const deal = await dealsCollection.findOne({ "date": "2022-10-07" }); 15 response.send(deal || {}); 16 } catch (error) { 17 response.status(500).send({ "message": error.message }); 18 } 19 }); 20 21 app.post("/purchase", async (request, response) => { 22 try { 23 if(!request.body) { 24 throw { "message": "The request body is missing!" }; 25 } 26 const receipt = await purchasesCollection.insertOne( 27 { 28 "sku": (request.body.sku || "000000"), 29 "product_name": (request.body.product_name || "Pokemon Scarlet"), 30 "price": (request.body.price || 59.99), 31 "customer_name": (request.body.customer_name || "Nic Raboy"), 32 "purchase_date": "2022-10-07" 33 } 34 ); 35 response.send(receipt || {}); 36 } catch (error) { 37 response.status(500).send({ "message": error.message }); 38 } 39 }); 40 41 app.listen(3000, async () => { 42 try { 43 await mongoClient.connect(); 44 database = mongoClient.db("example"); 45 dealsCollection = database.collection("deals"); 46 purchasesCollection = database.collection("receipts"); 47 console.log("SERVING AT :3000..."); 48 } catch (error) { 49 console.error(error); 50 } 51 });
No exemplo acima, temos um aplicativo da web habilitado para Express Framework com duas funções de endpoint. Temos um endpoint para fechar o negócio e temos um endpoint para criar uma compra. O resto pode ficar por conta da sua imaginação.
Para testar a carga deste aplicativo com rajadas e simular o valor potencial de uma instância sem servidor, podemos usar uma ferramenta como Apache JMeter.
Com o JMeter, você pode definir o número de threads e iterações que ele usa ao fazer solicitações HTTP.
Lembre-se de que estamos simulando uma intermitência neste exemplo. Se você decidir jogar com o JMeter e for excessivo no burst, você pode acabar com uma conta interessante. Se você estiver interessado em saber como o serverless é cobrado, confira a página de preços na documentação.
Dentro do seu Grupo de threads do JMeter, você vai querer definir o que está acontecer com cada thread ou iteração. Neste caso, estamos fazendo uma solicitação HTTP para nossa API Node.js.
Como a API espera JSON, podemos definir as informações de cabeçalho da solicitação.
Depois de obter as informações do thread, as informações da solicitação de HTTP e as informações do cabeçalho, você pode executar o JMeter e terá muitas atividades não apenas em seu aplicativo da web, mas também em seu banco de dados.
Mais uma vez, muito desse exemplo deve ser deixado para sua mente porque, para ver os benefícios de dimensionamento de uma instância sem servidor, você precisará de muito tráfego contínuo que não é facilmente simulado durante o desenvolvimento. No entanto, isso deve deixar você com algumas ideias.
Você acabou de ver como é rápido desenvolver no MongoDB Atlas sem ter que se preocupar com o dimensionamento do seu próprio cluster. Com uma instância sem servidor do MongoDB Atlas, seu banco de dados será dimensionado para atender à demanda do seu aplicativo e você será cobrado por essa demanda. Isso protegerá você de pagar por clusters de tamanho inadequado que estão sendo executados sem parar. Isso também economizará o tempo que você teria gasto fazendo ajustes relacionados ao tamanho em seu cluster.
O código neste exemplo funciona independentemente se você estiver usando uma instância sem servidor do Atlas ou um cluster compartilhado ou dedicado pré-provisionado.
Tem alguma dúvida sobre este exemplo ou quer ver mais? Confira os Fóruns da MongoDB Community para ver o que está acontecendo.