Aws лямбда с подключением mongoDb - PullRequest
0 голосов
/ 01 ноября 2019

Привет, парень, мне нужен ответ на простой вопрос. Я использую Aws lambda с безсерверной средой и использую соединение mongoDb в aws lambda. Я использовал код соединения внутри своей функции-обработчика и использовал пул соединений.

Теперь, когда я развертываю свое приложение на AWS с использованием sls deploy и после развертывания, когда я вызываю лямбду в первый раз, соединение устанавливается только один раз, и после этого на других вызовах API лямбда-кода оно повторно использует мое соединение вместо создания нового соединениятак что все в порядке.

Теперь после этого процесса я запускаю скрипт, который не связан с моим приложением AWS, чтобы проверить мои параллельные лямбда-запросы. Я вызвал тот же самый лямбда-API, используя модуль npm запроса дляцикл в сценарии, и в этом случае все мое новое соединение создается до тех пор, пока цикл не прекратится, вместо использования моего существующего, созданного при первом вызове. Может кто-нибудь сказать мне, почему это происходит и в чем причина этого? Почему мое соединение создается снова, когда этот скрипт запускается, когда я уже создал свое соединение при первом лямбда-вызове.

И тот же API, когда я звоню из почтальона, затем возобновляет соединение после первого лямбда-вызова, но когда я запускаюэтот скрипт и изнутри скрипта я вызываю этот API (используя модуль NPM запроса), используя команду "node app.js", затем все время до завершения цикла он создает новое соединение.

Пожалуйста, помогите мне в этом.

 'use strict'

 const bodyParser = require('body-parser')
 const express = require('express')
 const serverless = require('serverless-http')
 const cors = require('cors');
 const mongoConnection = require('./connection/mongoDb');
 const app = express()

app.use(cors())
app.use(bodyParser.json())

const handler = serverless(app);
let cachedDb = null;

module.exports.handler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
if (cachedDb == null) {
let Database = await mongoConnection();
console.log("DB", Database);
cachedDb = Database
}

const baseRouter = require('./routes/index');
app.use('/api', baseRouter);

const result = await handler(event, context);
return result;
};

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Я вижу, что вы определили переменную cachedDb вне области обработчика, поэтому она становится доступной при повторном использовании контейнера. Тем не менее, нет никакой гарантии, что контейнер будет использоваться повторно (см. Мою предыдущую ссылку на это), потому что это не так, как работает Lambda. Если вы вызываете одни и те же функции много раз очень быстро после каждого другого, Lambda необходимо горизонтально масштабировать, чтобы иметь возможность быстро обрабатывать запросы. Каждый из них получает свой собственный контейнер и соединение.

Когда вызов завершится, AWS будет некоторое время удерживать контейнер (продолжительность зависит от многих факторов, таких как размер функции и ограничение ОЗУ). Если вы вызываете его снова, контейнеры могут повторно использовать свое соединение. Вы можете попытаться вызвать функцию 20 раз с интервалом в 1 секунду и посчитать количество открытых соединений. Это будет ниже 20, но выше 1.

0 голосов
/ 01 ноября 2019

Вот пример node.js, который показывает параметры соединения. Возможно, это поможет?

const express = require("express");
const bodyParser= require("body-parser")
const app = express();
const MongoClient = require("mongodb").MongoClient


MongoClient.connect("mongodb://myusername:mypassword@localhost:27017", (err, client) => {
  if (err) return console.log(err)

  var db = client.db("mydatabase")

  db.collection("mycollection").countDocuments(getCountCallback);

  app.listen(3000, () => {
    console.log("listening on 3000")
  })  
})


function getCountCallback(err, data) {
  console.log(data);
}

app.use(bodyParser.urlencoded({extended: true}))

app.get("/", (req, res) => {
  res.sendFile(__dirname + "/index.html")
})

app.post("/quotes", (req, res) => {
  console.log(req.body)
})

Ваш пример кода не показывает имя хоста для вашего сервера базы данных и не указывает, какой порт использовать. Пожалуйста, сравните ваш код и контраст с моим примером.

...