Hi,
I’m running apollo-server-lambda with a mongodb database and mongosse. Is there any proven way to share connections between lambdas with sls offline ( and aws lambdas, presumably)?
As of now when i run the playground on localhost, the playground pings the server every 100ms (or so), creating hundreds of open connections in seconds. I’m not using the playground in production, but i assume the question still remains the same if we serve a lot of requests on a Lambda in production.
I’ve read some of the other posts on this forum and other articles, including the reference on mongoDb but I can’t seem to make this work offline, which makes me a bit worried about putting it into produciton.
Related post on this forum: Reusing Database Connections (node.js) - #5 by codepressd
Mongoose docs: Mongoose v6.2.0: Using Mongoose With AWS Lambda
Mongdb best practices: do a search for “mongodb lambda best practices” to find link. (can only put 2 links as a new user)
reference code
import { ApolloServer, gql } from 'apollo-server-lambda'
import { connect } from 'mongoose';
import * as mongoose from 'mongoose';
const typeDefs = gql`
type Query {
hello: String
}
`;
const resolvers = {
Query: {
hello: () => 'Hello world!',
},
};
const server = new ApolloServer(
{
typeDefs,
resolvers,
});
const handler = server.createHandler({
expressGetMiddlewareOptions: {
cors: {
origin: "*",
methods: ["POST", "GET"],
allowedHeaders: "*",
credentials: true
}
}
})
let conn: any = null
exports.handler = async (event, context, callback) => {
context.callbackWaitsForEmptyEventLoop = false
if (conn == null) {
console.log("connecting")
conn = mongoose.connect(process.env.DATABASE_URL!, {
serverSelectionTimeoutMS: 5000
})
.then(() => {
console.log('\x1b[34m', `💿 DB -> ${process.env.DATABASE_NAME}\n`);
console.log(conn)
return mongoose
})
.catch(error => {
console.info(error);
});
await conn
}
return handler(event, context, callback)
}
Resolvers here doesn’t need the DB, but connect block still runs, maxing out the connections to mongo in a matter of seconds.
┌────────────────────────────────────────────────────────────────────────────────┐
│ │
│ POST | http://localhost:3000/dev/lambdaServer │
│ POST | http://localhost:3000/2015-03-31/functions/lambdaServer/invocations │
│ GET | http://localhost:3000/dev/lambdaServer │
│ POST | http://localhost:3000/2015-03-31/functions/lambdaServer/invocations │
│ │
└────────────────────────────────────────────────────────────────────────────────┘
Server ready: http://localhost:3000 🚀
Enter "rp" to replay the last request
GET /dev/lambdaServer (λ: lambdaServer)
connecting
💿 DB -> MyMongoDb
Promise { undefined }
(λ: lambdaServer) RequestId: ckz6sw37i0002mwop3r97274r Duration: 2010.15 ms Billed Duration: 2011 ms
POST /dev/lambdaServer (λ: lambdaServer)
connecting
POST /dev/lambdaServer (λ: lambdaServer)
connecting
POST /dev/lambdaServer (λ: lambdaServer)
connecting
POST /dev/lambdaServer (λ: lambdaServer)
connecting
POST /dev/lambdaServer (λ: lambdaServer)
connecting
...
Im pretty new with serverless, so there might be some limitations with the serverless offline plugin i don’t know of.
Thanks in advance for any insight you can provide!