Vercel serverless function timeout, using functions that take more then 10 sec to execute

629 Views Asked by At

I am building a pet project like a multiplayer quiz using Next JS deployed on Vercel. Everything works perfect on a localhost, but when I deploy it on Vercel as a cloud function (in the API route) I meet a problem that serverless function can only last for 10 seconds.

So I want to understand what is the best practice to handle the problem. version of the cycle in an api route looks like this:

export async function quizGameProcess(
roomInitData: InitGameData,
questions: QuestionInDB\[\],
) {

let questionNumber = 0;
let maxPlayerPoints = 0;
const pointsToWin = 10;

while (maxPlayerPoints \< pointsToWin) {
const currentQuestion = questions\[questionNumber\];

    // Wait 5 seconds before start
    await new Promise(resolve =\>
    setTimeout(resolve, 5000),
    );

    // Show question to players for 15 seconds
    await questionShowInRoom(roomInitData, currentQuestion);
    await new Promise(resolve => setTimeout(resolve, 15000)); <====== Everything works great until this moment
    
    // Show the right answer for 5 seconds
    await AnswerPushInRoom(roomInitData);
    await new Promise(resolve =>
      setTimeout(resolve, 5),
    );
    
    maxPlayerPoints = await countPlayerPoints(roomInitData)
    ...
    questionNumber++

So i need 15 seconds to show players the question and cloud function returns error while invoking it.

questionShowInRoom() function just changes a string in the database from :

room = {activeWindow: prepareToStart}

to


 room = {activeWindow: question} 

after 15 seconds it must change it to:

room = {activeWindow: showAnswer}

So the function must return something before 10 seconds, but if you return something - the route stops execution.

  • I cant use VPS because the project must stay as one Next JS project folder and must be easy maintained in one place and be free.

  • So if i divide the code - and make some 'worker', how it should be invoked? By some other route? isnt that a bad practice?

  • Or of it will be the frontend just making polling every second trying to invoke it until timestamp difference become more than 15 seconds.. looks like a strange decision.

So what is the best practice to handle the problem?

0

There are 0 best solutions below