Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/

Crie um aplicativo resiliente com o MongoDB Atlas

Nesta página

  • Resiliência do cluster
  • Gerenciamento de memória aprimorado
  • Filtros de rejeitar operação
  • Tempo limite em nível de cluster para operações de leitura
  • Isolar o impacto de collections ativas e não fragmentadas
  • Melhores práticas de aplicativos e do lado do cliente
  • Instale os drivers mais recentes
  • Cadeias de conexão
  • Escrituras e leituras retráteis
  • Escreva e leia a preocupação
  • Error Handling
  • Testar failover
  • Aplicação de exemplo resiliente

Ao criar um aplicação de importância crítica, é importante se preparar para eventos inesperados que podem ocorrer na produção. Isso inclui queries lentas inesperadas, índices ausentes ou um aumento acentuado no volume do volume de trabalho.

O MongoDB Atlas ajuda você a criar um aplicação resiliente, fornecendo recursos prontos para o uso que permitem que você se prepare de forma proativa e responda de forma reativa às situações. Para criar um aplicação resiliente, recomendamos que você configure a implantação do MongoDB com as seguintes práticas recomendadasde resiliência e aplicativo de cluster e do lado do cliente .

Para melhorar a resiliência do cluster, atualize o cluster para o MongoDB 8.0. O MongoDB 8.0 introduz as seguintes melhorias de desempenho e novas funcionalidades relacionadas à resiliência:

Para executar seu aplicação com segurança na produção, é importante garantir que a utilização da memória permita o headroom. Se um nó ficar sem memória disponível, ele pode se tornar suscetível ao Linux Out of Memory Killer que encerra o processo mongod .

O MongoDB 8.0 usa um TCMalloc atualizado para todas as implantações automaticamente, o que reduz o crescimento médio da fragmentação da memória ao longo do tempo. Essa fragmentação menor melhora a estabilidade operacional durante os carregamentos de pico e resulta em uma utilização geral da memória aprimorada.

Uma operação não intencional de uso intensivo de recursos pode causar problemas na produção se você não lidar com ela imediatamente.

O MongoDB 8.0 permite minimizar o impacto dessas operações usando filtros de aceitação de operações. Os filtros de exclusão de operações permitem configurar o MongoDB para rejeitar a execução de queries até que você reative as queries com essa forma de query.

Em outras palavras, depois de identificar uma query lenta, não é necessário esperar que as equipes de aplicação corrijam suas queries para conter o impacto da query lenta. Em vez disso, quando você notar uma query de baixo desempenho em seu Analisador de Query, Painel de Desempenho em Tempo Real ou logs de query, você pode definir um filtro de rejeitação para essa forma de query. O MongoDB então impede que novas instâncias dessa forma de query recebida sejam executadas. Depois de corrigir a query, você pode reativar a forma de query.

Você deve usar um filtro de aceitação de operação se quiser:

  • Contenha o impacto de queries lentas rapidamente enquanto a correção está em andamento.

  • Priorize cargas de trabalho mais importantes durante períodos de sobrecarga rejeitando consultas menos importantes.

  • Dê ao cluster tempo para se recuperar se estiver próximo da utilização máxima de recursos.

Para utilizar um filtro de aceitação de operação na UI do Atlas :

1
  1. Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.

  2. Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.

  3. Se ainda não estiver exibido, clique em Clusters na barra lateral.

    A página Clusters é exibida.

2
  1. No painel do projeto, clique em View Monitoring na instância desejada.

  2. Clique na aba Query Insights.

  3. Clique na aba Query Profiler.

3
4

Nos detalhes no lado direito, copie o valor queryHash .

5

Use setQuerySettings na função db.adminCommand() .

Para obter um exemplo, consulte Bloquear queries lentas com filtros de Rejeição de Operação.

Você pode monitorar como suas queries são executadas posteriormente na aba Métricas:

1
  1. Clique no nome do cluster para abrir a visão geral do cluster.

  2. Clique na aba Metrics.

2

Em Shard Name, clique no shard que deseja monitorar.

3

Em MongoDB Metrics, clique em Operation Throttling.

Com essa métrica, o gráfico do MongoDB mostra o seguinte:

  • Killed, que mostra o número de operações de leitura que o MongoDB elimina ao longo do tempo por exceder o tempo limite padrão do cluster.

  • Rejected, que mostra o número de operações que o MongoDB rejeita ao longo do tempo porque a query corresponde ao filtro de votação definido pelo usuário.

É importante garantir que seu processo de desenvolvimento considere cuidadosamente a eficiência das queries antes que elas cheguem à produção. Exceções sempre podem ocorrer, mas ter uma mitigação proativa contra queries ineficientes pode ajudar a evitar problemas de desempenho do cluster.

Com o MongoDB 8.0, você pode proteger suas queries de operações não indexadas com o defaultMaxTimeMS do lado do servidor que entra no cluster. Se uma operação exceder esse tempo limite, o MongoDB cancelará a operação para evitar que as queries sejam muito longas e retenham os recursos. Isso permite que você:

  • Transfira a responsabilidade de definir timeouts de equipes de aplicação individuais para equipes focados no banco de dados de dados.

  • Minimize o impacto de uma verificação de collection se a query não tiver um índice.

  • Tenha uma mitigação de última rodada contra operações caras que chegam à produção.

Se você tiver queries que exigem um tempo limite diferente, como queries de analítica, poderá substituí-las definindo o tempo limite de nível de operação com o método maxTimeMS .

Para definir o parâmetro defaultMaxTimeMS por meio da API de administração do Atlas , consulte Atualizar opções de configuração avançadas para um cluster.

Para configurar o parâmetro defaultMaxTimeMS na UI do Atlas :

1
  1. Se você tiver um cluster existente, navegue até a página Editar Cluster .

    Se você estiver criando um novo cluster, no menu suspenso Select a version , selecione MongoDB 8.0.

  2. Clique em Additional Settings.

  3. Role para baixo e clique em More Configuration Options.

2
3
4
  1. Clique em Review Changes.

  2. Revise suas alterações e clique em Apply Changes para atualizar seu cluster.

Para visualizar o comportamento das operações eliminadas, consulte Monitore suas queries após Rejeição ou Tempo Limite. Para saber mais, consulte defaultMaxTimeMS e Definir tempo limite padrão para operações de leitura.

A fragmentação permite que você escale seu cluster horizontalmente. Com o MongoDB, você pode fragmentar algumas collections e, ao mesmo tempo, permitir que outras collections no mesmo cluster permaneçam não fragmentadas. Quando você cria um novo banco de dados de dados, o fragmento no cluster com a menor quantidade de dados é escolhido como o fragmento primário desse banco de dados por padrão. Todas as collections não fragmentadas desse banco de dados de dados residem nesse fragmento primário por padrão. Isso pode causar um aumento no tráfego para o fragmento primário à medida que sua carga de trabalho cresce, especialmente se o crescimento do volume de trabalho se concentrar nas coleções não fragmentadas do fragmento primário.

Para distribuir melhor esse volume de trabalho, o MongoDB 8.0 permite mover uma coleção não fragmentada do fragmento primário para outros shards com o comando moveCollection . Isso permite que você coloque collections ativas e sobrecarregadas em shards com um uso menor de recursos. Com isso, você pode:

  • Otimize o desempenho em volumes de trabalho maiores e complexos.

  • Obtenha uma melhor utilização dos recursos.

  • Distribua a data de forma mais uniforme entre os fragmentos.

Recomendamos isolar sua coleção nas seguintes circunstâncias:

  • Se o seu fragmento primário tiver uma carga de trabalho significativa devido à presença de várias collections não fragmentadas de alta taxa de transferência.

  • Você antecipa uma coleção não fragmentada para experimentar um crescimento futuro, o que pode se tornar um gargalo para outras coleções.

  • Você está executando um design de implantação de uma collection por cluster e deseja isolar esses clientes com base em prioridade ou volumes de trabalho.

  • Seus shards têm uma quantidade mais do que proporcional de dados devido ao número de collections não fragmentadas localizadas neles.

Para saber como mover uma collection não fragmentada com mongosh, consulte Mover uma collection.

Você pode configurar os recursos de seus sistemas do MongoDB e as bibliotecas de drivers para criar um aplicativo resiliente que possa resistir a interrupções de rede e eventos de failover. Para escrever código de aplicativo que aproveite ao máximo os recursos sempre ativos do MongoDB Atlas, você deve executar as seguintes tarefas:

Instale os drivers mais recentes do seu idioma a partir de Drivers do MongoDB. Os drivers conectam e retransmitem queries da sua aplicação para o seu banco de dados de dados . O uso dos drivers mais recentes ativa os recursos mais recentes do MongoDB .

Em seguida, em seu aplicativo, importe a dependência:

Se você estiver usando o Maven, adicione o seguinte à sua lista de dependências do pom.xml:

<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver-sync</artifactId>
<version>4.0.1</version>
</dependency>
</dependencies>

Se você estiver usando o Gradle, adicione o seguinte à sua lista de dependências build.gradle:

dependencies {
compile 'org.mongodb:mongodb-driver-sync:4.0.1'
}
// Latest 'mongodb' version installed with npm
const MongoClient = require('mongodb').MongoClient;
# Install the latest 'pymongo' version with pip and
# import MongoClient from the package to establish a connection.
from pymongo import MongoClient

Observação

O Atlas fornece uma cadeia de conexão pré-configurada. Para ver as etapas para copiar a string pré-configurada, consulte Cadeias de conexão fornecidas pelo Atlas.

Utilize uma cadeia de conexão que especifica todos os nós no seu cluster do Atlas para conectar seu aplicativo ao seu banco de dados. Se o cluster executar uma eleição de conjunto de réplicas e um novo primário for eleito, uma cadeia de conexão que especifica todos os nós no cluster descobrirá o novo primário sem lógica de aplicativo.

Você pode especificar todos os nós em seu cluster usando:

A cadeia de conexão também pode especificar opções, principalmente retryWrites e writeConcern.

O Atlas pode gerar uma cadeia de conexãoSRV otimizada para clusters fragmentados usando os balanceadores de carga do seu serviço de pontos de extremidade privados. Quando você utiliza uma cadeia de conexão otimizada, o Atlas limita o número de conexões por mongos entre seu aplicativo e seu cluster fragmentado. As conexões limitadas por mongos melhoram o desempenho durante picos nas contagens de conexões.

Observação

O Atlas não é compatível com cadeias de conexão otimizadas para clusters executados no Google Cloud ou no Azure.

Para saber mais sobre cadeias de conexão otimizadas para clusters fragmentados por trás de um ponto de extremidade privado, consulte Aprimorar o desempenho da conexão dos clusters fragmentados por trás de um ponto de extremidade privado.

Se você copiar a cadeia de conexão da interface do cluster do Atlas, a cadeia de conexão será pré-configurada para o cluster, usará o formato DNS Seedlist e incluirá as opções recomendadas de retryWrites e w (preocupação de gravação) para resiliência.

Para copiar o URI da cadeia de conexão do Atlas:

1
  1. Se ainda não tiver sido exibido, selecione a organização que contém seu projeto no menu Organizations na barra de navegação.

  2. Se ainda não estiver exibido, selecione o projeto desejado no menu Projects na barra de navegação.

  3. Se ainda não estiver exibido, clique em Clusters na barra lateral.

    A página Clusters é exibida.

2
  1. Clique em Connect no cluster ao qual deseja conectar seu aplicativo.

  2. Selecione Drivers como seu método de conexão.

  3. Selecione seu Driver e Version.

3

Copie a cadeia de conexão ou o exemplo completo do driver no código do seu aplicativo. Você deve fornecer as credenciais de usuário do banco de dados.

Observação

Este guia usa a autenticação SCRAM por meio de uma string de conexão. Para saber mais sobre como usar certificados X.509 para autenticar, consulte X.509.

Use sua cadeia de conexão para instanciar um cliente MongoDB em seu aplicativo:

// Copy the connection string provided by Atlas
String uri = <your Atlas connection string>;
// Instantiate the MongoDB client with the URI
MongoClient client = MongoClients.create(uri);
// Copy the connection string provided by Atlas
const uri = <your Atlas connection string>;
// Instantiate the MongoDB client with the URI
const client = new MongoClient(uri, {
useNewUrlParser: true,
useUnifiedTopology: true
});
# Copy the connection string provided by Atlas
uri = <your Atlas connection string>
# Pass your connection string URI to the MongoClient constructor
client = MongoClient(uri)

Observação

A partir da versão 4.0 do MongoDB e com drivers compatíveis com4.2, o MongoDB tenta novamente gravações e leituras uma vez por padrão.

Use gravações repetíveis para repetir determinadas operações de gravação uma única vez se elas falharem. Se você copiou sua connection string do Atlas, ela incluirá "retryWrites=true". Se você estiver fornecendo sua própria connection string, inclua "retryWrites=true" como um parâmetro de query.

Repetir gravações exatamente uma vez é a melhor estratégia para lidar com erros transitórios de rede e eleições de conjunto de réplicas nas quais o aplicativo não consegue encontrar temporariamente um nó primário íntegro. Se a nova tentativa for bem-sucedida, a operação como um todo será bem-sucedida e nenhum erro será retornado. Se a operação falhar, provavelmente será devido a:

  • Um erro de rede duradouro

  • Um comando inválido

Quando uma operação falha, seu aplicativo precisa lidar com o próprio erro.

As operações de leitura são automaticamente repetidas uma única vez se falharem a partir da versão 4.0 do MongoDB e com motores compatíveis com4.2. Nenhuma configuração adicional é necessária para tentar ler novamente.

Você pode ajustar a constância e a disponibilidade do seu aplicativo usando write concern e read concern. Preocupações mais rigorosas implicam que as operações de banco de dados aguardam por garantias mais fortes de consistência de dados, enquanto o afrouxamento dos requisitos de consistência fornece maior disponibilidade.

Exemplo

Se a sua aplicação lida com saldos monetários, a consistência é extremamente importante. Você pode usar majority preocupações de gravação e leitura para garantir que nunca leia dados obsoletos ou dados que possam ser revertidos.

Como alternativa, se o aplicativo registrar dados de temperatura de centenas de sensores a cada segundo, talvez você não esteja preocupado se ler os dados que não incluem as leituras mais recentes. Você pode perder os requisitos de consistência e fornecer acesso mais rápido a esses dados.

Você pode configurar o nível de write concern do seu conjunto de réplicas do Atlas configurado através da URI da connection string. Utilize uma write concern do majority para garantir que seus dados sejam gravados com sucesso no seu banco de dados e persistam. Esse é o padrão recomendado e suficiente para a maioria dos casos de uso. Se você copiou sua connection string do Atlas, ela incluirá "w=majority".

Quando você usa uma write concern que exige confirmação, como majority, também pode especificar um limite de tempo máximo para que as gravações atinjam esse nível de confirmação:

  • O parâmetro de cadeia de conexão wtimeoutMS para todas as gravações, ou

  • A opção tempo-limite para uma única operação de gravação.

Se você utiliza ou não um limite de tempo e o valor que você utiliza depende do contexto do seu aplicativo.

Importante

Se você não especificar um limite de tempo para gravações e o nível de write concern for inatingível, a operação de gravação travará indefinidamente.

Você pode definir o nível de preocupação de leitura do conjunto de réplicas do Atlas por meio do URI da cadeia de conexão. A preocupação de leitura ideal depende dos requisitos do aplicativo, mas o padrão é suficiente para a maioria dos casos de uso. Não é necessário nenhum parâmetro de cadeia de conexão para utilizar as preocupações de leitura padrão.

Especificar uma questão de leitura pode melhorar as garantias em torno dos dados que a sua aplicação recebe do Atlas.

Observação

A combinação específica de write concern e read concern que seu aplicativo usa afeta as garantias de ordem de operação. Isso é chamado de consistência causal. Para obter mais informações sobre garantias de consistência causal, consulte Consistência causal e read and write concern.

Comandos inválidos, interrupções de rede e erros de rede que não são tratados por gravações repetíveis retornam erros. Consulte a documentação da API do seu driver para obter detalhes sobre o erro.

Por exemplo, se um aplicativo tentar inserir um documento que contém um valor _id que já é utilizado na coleção do banco de dados, seu driver retornará um erro que inclui:

Unable to insert due to an error: com.mongodb.MongoWriteException:
E11000 duplicate key error collection: <db>.<collection> ...
{
"name": : "MongoError",
"message": "E11000 duplicate key error collection on: <db>.<collection> ... ",
...
}
pymongo.errors.DuplicateKeyError: E11000 duplicate key error collection: <db>.<collection> ...

Sem o tratamento adequado de erros, um erro pode bloquear seu aplicativo de processar solicitações até que ele seja reiniciado.

Seu aplicativo deve lidar com erros sem travamentos ou efeitos colaterais. No exemplo anterior de um aplicativo inserindo um _id duplicado em uma coleção, este aplicativo pode lidar com erros como segue:

// Declare a logger instance from java.util.logging.Logger
private static final Logger LOGGER = ...
...
try {
InsertOneResult result = collection.insertOne(new Document()
.append("_id", 1)
.append("body", "I'm a goofball trying to insert a duplicate _id"));
// Everything is OK
LOGGER.info("Inserted document id: " + result.getInsertedId());
// Refer to the API documentation for specific exceptions to catch
} catch (MongoException me) {
// Report the error
LOGGER.severe("Failed due to an error: " + me);
}
...
collection.insertOne({
_id: 1,
body: "I'm a goofball trying to insert a duplicate _id"
})
.then(result => {
response.sendStatus(200) // send "OK" message to the client
},
err => {
response.sendStatus(400); // send "Bad Request" message to the client
});
...
try:
collection.insert_one({
"_id": 1,
"body": "I'm a goofball trying to insert a duplicate _id"
})
return {"message": "User successfully added!"}
except pymongo.errors.DuplicateKeyError as e:
print ("The insert operation failed:", e)

A operação de inserção neste exemplo gera um erro "duplicate key" na segunda vez em que é invocada porque o campo _id deve ser exclusivo. O erro é detectado, o cliente é notificado e o aplicativo continua em execução. No entanto, a operação de inserção falha e cabe a você decidir se deseja mostrar uma mensagem ao usuário, repetir a operação ou fazer outra coisa.

Você deve sempre registrar erros. Estratégias comuns para erros de processamento adicionais incluem:

  • Devolva o erro ao cliente com uma mensagem de erro. Essa é uma boa estratégia quando você não consegue resolver o erro e precisa informar ao usuário que uma ação não pode ser concluída.

  • Escreva em um banco de dados de cópia de segurança. Essa é uma boa estratégia quando você não consegue resolver o erro, mas não quer correr o risco de perder os dados da solicitação.

  • Tente novamente a operação além da tentativa única padrão. Essa é uma boa estratégia quando você pode resolver a causa de um erro programaticamente e, em seguida, tentar novamente.

Você deve selecionar as melhores estratégias para o contexto do seu aplicativo.

Exemplo

No exemplo de um erro de chave duplicada, você deve registrar o erro, mas não repetir a operação porque ela nunca terá êxito. Em vez disso, você pode gravar em um banco de dados de fallback e revisar o conteúdo desse banco de dados posteriormente para garantir que nenhuma informação seja perdida. O usuário não precisa fazer mais nada e os dados são gravados, então você pode optar por não enviar uma mensagem de erro para o cliente.

Retornar um erro pode ser um comportamento desejável quando uma operação travaria indefinidamente e bloquearia seu aplicativo de executar novas operações. Você pode usar o método maxTimeMS para colocar um limite de tempo em operações individuais, retornando um erro para que seu aplicativo manipule se esse limite de tempo for excedido.

O limite de tempo que você coloca em cada operação depende do contexto desta operação.

Exemplo

Se sua aplicação ler e exibir informações simples do produto de uma coleção inventory , você poderá ter certeza razoável de que essas operações de leitura levam apenas um momento. Uma query de execução incomumente longa é um bom indicador de que há um problema de rede duradouro. Definir maxTimeMS nessa operação para 5000, ou 5 segundos, significa que seu aplicativo recebe comentários assim que você tiver certeza de que há um problema de rede.

No espírito dos testes de caos, o Atlas realizará eleições de conjunto de réplicas automaticamente para manutenção periódica e certas alterações de configuração.

Para verificar se seu aplicativo é resiliente às eleições de conjunto de réplicas, teste o processo de failover simulando um evento de failover.

O aplicativo de exemplo reúne as seguintes recomendações para garantir a resiliência contra interrupções de rede e eventos de failover:

  • Use a cadeia de conexão fornecida pelo Atlas com gravações repetíveis, preocupação de gravação majoritária e preocupação de leitura padrão.

  • Especifique um limite de optime com o método maxTimeMS . Para obter instruções sobre como configurar o maxTimeMS, consulte sua Documentação do Driverespecífica.

  • Lidar com erros de chaves duplicadas e tempos-limite.

O aplicativo é uma API HTTP que permite aos clientes criar ou listar registros de usuário. Ele expõe um endpoint que aceita solicitações GET e POST http://localhost:3000:

Método
Endpoint
Descrição
GET
/users
Obtém uma lista de nomes de usuário de uma coleção do users.
POST
/users
Exige um name no corpo da solicitação. Adiciona um novo usuário a uma coleção users.

Observação

O seguinte aplicação de servidor usa NanoHTTPD e que você precisa adicionar ao seu projeto como dependências antes de JSON executá-lo.

1// File: App.java
2
3import java.util.Map;
4import java.util.logging.Logger;
5
6import org.bson.Document;
7import org.json.JSONArray;
8
9import com.mongodb.MongoException;
10import com.mongodb.client.MongoClient;
11import com.mongodb.client.MongoClients;
12import com.mongodb.client.MongoCollection;
13import com.mongodb.client.MongoDatabase;
14
15import fi.iki.elonen.NanoHTTPD;
16
17public class App extends NanoHTTPD {
18 private static final Logger LOGGER = Logger.getLogger(App.class.getName());
19
20 static int port = 3000;
21 static MongoClient client = null;
22
23 public App() throws Exception {
24 super(port);
25
26 // Replace the uri string with your MongoDB deployment's connection string
27 String uri = "<atlas-connection-string>";
28 client = MongoClients.create(uri);
29
30 start(NanoHTTPD.SOCKET_READ_TIMEOUT, false);
31 LOGGER.info("\nStarted the server: http://localhost:" + port + "/ \n");
32 }
33
34 public static void main(String[] args) {
35 try {
36 new App();
37 } catch (Exception e) {
38 LOGGER.severe("Couldn't start server:\n" + e);
39 }
40 }
41
42 @Override
43 public Response serve(IHTTPSession session) {
44 StringBuilder msg = new StringBuilder();
45 Map<String, String> params = session.getParms();
46
47 Method reqMethod = session.getMethod();
48 String uri = session.getUri();
49
50 if (Method.GET == reqMethod) {
51 if (uri.equals("/")) {
52 msg.append("Welcome to my API!");
53 } else if (uri.equals("/users")) {
54 msg.append(listUsers(client));
55 } else {
56 msg.append("Unrecognized URI: ").append(uri);
57 }
58 } else if (Method.POST == reqMethod) {
59 try {
60 String name = params.get("name");
61 if (name == null) {
62 throw new Exception("Unable to process POST request: 'name' parameter required");
63 } else {
64 insertUser(client, name);
65 msg.append("User successfully added!");
66 }
67 } catch (Exception e) {
68 msg.append(e);
69 }
70 }
71
72 return newFixedLengthResponse(msg.toString());
73 }
74
75 static String listUsers(MongoClient client) {
76 MongoDatabase database = client.getDatabase("test");
77 MongoCollection<Document> collection = database.getCollection("users");
78
79 final JSONArray jsonResults = new JSONArray();
80 collection.find().forEach((result) -> jsonResults.put(result.toJson()));
81
82 return jsonResults.toString();
83 }
84
85 static String insertUser(MongoClient client, String name) throws MongoException {
86 MongoDatabase database = client.getDatabase("test");
87 MongoCollection<Document> collection = database.getCollection("users");
88
89 collection.insertOne(new Document().append("name", name));
90 return "Successfully inserted user: " + name;
91 }
92}

Observação

O aplicativo de servidor a seguir usa o Express, que você precisa adicionar ao seu projeto como uma dependência antes de executá-lo.

1const express = require('express');
2const bodyParser = require('body-parser');
3
4// Use the latest drivers by installing & importing them
5const MongoClient = require('mongodb').MongoClient;
6
7const app = express();
8app.use(bodyParser.json());
9app.use(bodyParser.urlencoded({ extended: true }));
10
11const uri = "mongodb+srv://<db_username>:<db_password>@cluster0-111xx.mongodb.net/test?retryWrites=true&w=majority";
12
13const client = new MongoClient(uri, {
14 useNewUrlParser: true,
15 useUnifiedTopology: true
16});
17
18// ----- API routes ----- //
19app.get('/', (req, res) => res.send('Welcome to my API!'));
20
21app.get('/users', (req, res) => {
22 const collection = client.db("test").collection("users");
23
24 collection
25 .find({})
26 .maxTimeMS(5000)
27 .toArray((err, data) => {
28 if (err) {
29 res.send("The request has timed out. Please check your connection and try again.");
30 }
31 return res.json(data);
32 });
33});
34
35app.post('/users', (req, res) => {
36 const collection = client.db("test").collection("users");
37 collection.insertOne({ name: req.body.name })
38 .then(result => {
39 res.send("User successfully added!");
40 }, err => {
41 res.send("An application error has occurred. Please try again.");
42 })
43});
44// ----- End of API routes ----- //
45
46app.listen(3000, () => {
47 console.log(`Listening on port 3000.`);
48 client.connect(err => {
49 if (err) {
50 console.log("Not connected: ", err);
51 process.exit(0);
52 }
53 console.log('Connected.');
54 });
55});

Observação

O seguinte aplicação da web usa FastAPI. Para criar um novo aplicação, use o arquivo de amostra FastAPI estrutura.

1# File: main.py
2
3from fastapi import FastAPI, Body, Request, Response, HTTPException, status
4from fastapi.encoders import jsonable_encoder
5
6from typing import List
7from models import User
8
9import pymongo
10from pymongo import MongoClient
11from pymongo import errors
12
13# Replace the uri string with your |service| connection string
14uri = "<atlas-connection-string>"
15db = "test"
16
17app = FastAPI()
18
19@app.on_event("startup")
20def startup_db_client():
21 app.mongodb_client = MongoClient(uri)
22 app.database = app.mongodb_client[db]
23
24@app.on_event("shutdown")
25def shutdown_db_client():
26 app.mongodb_client.close()
27
28##### API ROUTES #####
29@app.get("/users", response_description="List all users", response_model=List[User])
30def list_users(request: Request):
31 try:
32 users = list(request.app.database["users"].find().max_time_ms(5000))
33 return users
34 except pymongo.errors.ExecutionTimeout:
35 raise HTTPException(status_code=status.HTTP_503_SERVICE_UNAVAILABLE, detail="The request has timed out. Please check your connection and try again.")
36
37@app.post("/users", response_description="Create a new user", status_code=status.HTTP_201_CREATED)
38def new_user(request: Request, user: User = Body(...)):
39 user = jsonable_encoder(user)
40 try:
41 new_user = request.app.database["users"].insert_one(user)
42 return {"message":"User successfully added!"}
43 except pymongo.errors.DuplicateKeyError:
44 raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Could not create user due to existing '_id' value in the collection. Try again with a different '_id' value.")

Voltar

Dimensionamento e Níveis de Cluster