Rishabh Garg
Rishabh Garg

Reputation: 745

aws web-socket gateway taking much time

I am using AWS Websocket api-gateway. I am sending message to connected client by aws:execute-api:region:account-id:api-id/stage-name/POST/@connections.However, the message is getting delayed somehow and the UI won't be able to receive the chat message immediately. I don't why any suggestion where getting something wrong????

One thing very exceptional, when I am sending message, last message getting time. Example : If I sent one message that take much time. If I send 1st message, as I sent second message, First message will received to client immediately but now 2nd second message take much time. SO basically when I am sending nth message, then every nth message will deliver to client when (n+1)th message sent and (n+1)th messages takes much time to deliver.

Your help much appreciated!!!

This is only Code Snippet which I have

import * as AWS from 'aws-sdk';
export class AWSWebsocketGateway {
    websocketInstance;
    constructor() {
        AWS.config.update({
            accessKeyId: <accessKeyId>,
            secretAccessKey: <secretAccessKey>,
            region: <region>
        });
        this.websocketInstance = new AWS.ApiGatewayManagementApi({
            endpoint: <webSocketDomainName> + <webSocketStage>
        });
    }

    sendMessage(connection, messageObject, callback: Function) {

        messageObject = JSON.stringify(messageObject);
        this.websocketInstance.postToConnection({ ConnectionId: connection, Data: JSON.stringify(messageObject) }, function (error, data) {
            console.log('Error', error, 'Send Message...', data);
            return callback(error, data);
        });
    }
}

I retrieving connection Id from DB in one query and calling this function in loop to send message.

Upvotes: 4

Views: 1149

Answers (1)

deanmcpherson
deanmcpherson

Reputation: 748

For anyone else who get's bitten by this one ->

You need to wait for the API call to return it's result before finishing the lambda's execution.

E.g. this won't work

module.exports.ping = async (event) => {
  ... //setting up api gateway, etc
  apig.postToConnection({ ConnectionId: connectionId, Data: JSON.stringify(message) }, (err, res) => {})

  return {
    statusCode: 200
  }
}

But this will:

module.exports.ping = async (event) => {
  ... //setting up api gateway, etc
  await apig.postToConnection({ ConnectionId: connectionId, Data: JSON.stringify(message) }).promise();

  return {
    statusCode: 200
  }
}

Any async code that is executing after the return of the lambda appears to be paused til that handler is run again, which is why you see the delayed n+ issue you outlined above.

Upvotes: 3

Related Questions