AWS javascript SDK request.js发送请求函数执行时间逐渐增加

时间:2016-03-30 07:11:44

标签: amazon-web-services aws-lambda aws-sdk amazon-kinesis

我正在使用aws-sdk将数据推送到Kinesis流。 我正在使用PutRecord来实现实时数据推送。 在批量写入的情况下,我也会在putRecords中观察到相同的延迟。 我已经尝试了4条记录,其中我没有超过任何碎片限制。

以下是我的节点js http代理配置。默认maxSocket值设置为无穷大。

 Agent {
  domain: null,
  _events: { free: [Function] },
  _eventsCount: 1,
  _maxListeners: undefined,
  defaultPort: 80,
  protocol: 'http:',
  options: { path: null },
  requests: {},
  sockets: {},
  freeSockets: {},
  keepAliveMsecs: 1000,
  keepAlive: false,
  maxSockets: Infinity,
  maxFreeSockets: 256 }

以下是我的代码。

我正在使用以下代码来触发putRecord调用

    event.Records.forEach(function(record) {
    var payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
     // put record request
     evt = transformEvent(payload );
     promises.push(writeRecordToKinesis(kinesis, streamName, evt ));
}

活动结构

evt = {
          Data: new Buffer(JSON.stringify(payload)),
          PartitionKey: payload.PartitionKey,
          StreamName: streamName,
          SequenceNumberForOrdering: dateInMillis.toString()
        };

此事件用于放置请求。

function writeRecordToKinesis(kinesis, streamName, evt ) {
  console.time('WRITE_TO_KINESIS_EXECUTION_TIME');
  var deferred = Q.defer();
  try {
    kinesis.putRecord(evt , function(err, data) {
      if (err) {
        console.warn('Kinesis putRecord %j', err);
        deferred.reject(err);
      } else {
          console.log(data);
        deferred.resolve(data);
      }
      console.timeEnd('WRITE_TO_KINESIS_EXECUTION_TIME');
    });
  } catch (e) {
    console.error('Error occured while writing data to Kinesis' + e);
    deferred.reject(e);
  }
  return deferred.promise;
}

以下是3条消息的输出。

WRITE_TO_KINESIS_EXECUTION_TIME: 2026ms
WRITE_TO_KINESIS_EXECUTION_TIME: 2971ms
WRITE_TO_KINESIS_EXECUTION_TIME: 3458ms

在这里,我们可以看到响应时间和功能执行时间的逐渐增加。

我在aws-sdk request.js类中添加了计数器。我也可以在那里看到相同的模式。

下面是执行put请求的aws-sdk request.js类的代码片段。

 send: function send(callback) {
console.time('SEND_REQUEST_TO_KINESIS_EXECUTION_TIME');
if (callback) {
  this.on('complete', function (resp) {
    console.timeEnd('SEND_REQUEST_TO_KINESIS_EXECUTION_TIME');
    callback.call(resp, resp.error, resp.data);
  });
}
this.runTo();

return this.response;

},

发送请求的输出:

SEND_REQUEST_TO_KINESIS_EXECUTION_TIME: 1751ms
SEND_REQUEST_TO_KINESIS_EXECUTION_TIME: 1816ms
SEND_REQUEST_TO_KINESIS_EXECUTION_TIME: 2761ms
SEND_REQUEST_TO_KINESIS_EXECUTION_TIME: 3248ms

在这里你可以看到它逐渐增加。

任何人都可以建议我如何减少这种延迟? 将单个记录推送到Kinesis的3秒钟是完全不可接受的。

0 个答案:

没有答案