Подключение к MongoDB Atlas из AWS Lambda занимает слишком много времени - PullRequest
0 голосов
/ 04 августа 2020

Холодный пуск длится ок. 10 секунд, что для меня неприемлемо. Если лямбда повторно использует соединение, длительность уменьшается до 30 мс. Есть ли способ уменьшить время начального подключения?

Самая трудоемкая часть (6 секунд)

2020-08-04T20: 39: 45.004 + 02: 00 ИНФОРМАЦИЯ: com.mongodb.client.internal.MongoClientDelegate не выбран сервер из описания кластера ClusterDescription {type = REPLICA_SET, connectionMode = MULTIPLE, serverDescriptions = [ServerDescription {, type = UNKNOWN, state = CONNECTING}, ServerDescription {, type = НЕИЗВЕСТНО, состояние = СОЕДИНЕНИЕ}, ServerDescription {, тип = НЕИЗВЕСТНО, состояние = СОЕДИНЕНИЕ}]}. Ожидание 30000 мс перед истечением времени ожидания

2020-08-04T20: 39: 51.302 + 02: 00 4 августа 2020 г. 18:39:51 com.mongodb.diagnostics.logging. Журнал JULLogger

import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;

public class MongoDBConnectionLambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

    // declare MongoClient as an instance variable to ensure connection pooling
    private MongoClient mongoClient = null;

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) {

        MongoDatabase database = getDBConnection(context);

        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        Document doc = database.getCollection(System.getenv("MONGO_DB_COLLECTION"))
                               .find()
                               .first();

        response.setBody(doc == null ? null : doc.toJson());

        response.setStatusCode(200);
        return response;
    }

    private MongoDatabase getDBConnection(Context context) {

        if (mongoClient == null) {

            context.getLogger().log("Initializing new MongoDB connection");
            mongoClient = MongoClients.create(System.getenv("MONGO_DB_URI"));
            return mongoClient.getDatabase(System.getenv("MONGO_DB_NAME"));
        }

        context.getLogger().log("Reusing existing MongoDB connection");
        return mongoClient.getDatabase(System.getenv("MONGO_DB_NAME"));
    }

}

1 Ответ

0 голосов
/ 09 августа 2020

Мне удалось сократить время начального соединения на 2 секунды, запустив соединение вне метода обработчика. Оставшееся время, вероятно, является результатом выбора языка.

import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;

import org.bson.Document;

public class MongoDBConnectionHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

    // declare MongoClient as an instance variable to ensure connection pooling
    private final MongoClient mongoClient = MongoClients.create(System.getenv("MONGO_DB_URI"));

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent request, Context context) {

        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();
        Document doc = mongoClient.getDatabase(System.getenv("MONGO_DB_NAME"))
                                  .getCollection(System.getenv("MONGO_DB_COLLECTION"))
                                  .find()
                                  .first();

        response.setBody(doc == null ? null : doc.toJson());

        response.setStatusCode(200);
        return response;
    }

}
...