Испытайте проблему с подключением Neptune Gremlin при вызове лямбда-обработчиков AWS - PullRequest
0 голосов
/ 07 февраля 2019

Я использую gremlin@3.3.5 для моего приложения Node.js 8.10 с AWS Lambdas.Процесс работает все хорошо для одного вызова.Вот мой пример кода.

const gremlin = require('gremlin');
const DriverRemoteConnection = gremlin.driver.DriverRemoteConnection;
const Graph = gremlin.structure.Graph;

exports.handler = (event, context, callback) => {
    dc = new DriverRemoteConnection('wss://your-neptune-endpoint:8182/gremlin');

    const graph = new Graph();
    const g = graph.traversal().withRemote(dc);
    try {
        const result = await g.V().limit(1).count().next();
        dc.close();
        callback(null, { result: result });
    } catch (exception) {
        callback('Error');
        throw error;
    }
}

Когда я запускаю этот процесс для одиночного вызова, кажется, что он работает нормально, но как только я пытаюсь запустить пакетный процесс операций (что-то вроде 100 000 запросов /hr) в метриках журнала CloudWatch я обнаружил, что мои соединения не закрыты успешно.Я пробовал ряд реализаций этого, таких как callbackWaitForEventLoopEmpty, но это захватывает лямбду.Когда я удаляю обратный вызов (или возвращаю аналогично), этот процесс также отлично работает с пакетными операциями.Но я хочу вернуть данные из этой лямбды с информацией, которая передается в мою функцию шага для запуска другой лямбды на основе этой информации.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Проведя некоторые исследования, я обнаружил, что проблема заключалась в том, что пакет gremlin обрабатывал событие закрытия соединения, не поддерживающего безсерверную архитектуру.При срабатывании driver.close ().Когда создается экземпляр драйвера, он создает экземпляр клиента, который внутри себя создает экземпляр соединения, который создает экземпляр websocket с использованием библиотеки ws.Теперь событие ws.close () изящно закрывает все события, которые не ждут, пока событие будет вызвано, прежде чем будет вызван мой обратный вызов, и это событие останется открытым и утечками.Поэтому после явного вызова dc._client._connection.ws.terminate () для экземпляра соединения, а затем dc.close () немедленно закрывает соединение.

0 голосов
/ 07 февраля 2019

g.V().limit(1).count().next() является асинхронным.

Попробуйте:

exports.handler = async (event) => {

  try {
      dc = new DriverRemoteConnection('wss://your-neptune-endpoint:8182/gremlin');    
      const graph = new Graph();
      const g = graph.traversal().withRemote(dc);
      const result = await g.V().limit(1).count().next();
      dc.close();
      return result;
  } catch (error) {
      throw error;
  }
}

Поскольку ваша среда выполнения Lambda - Node.js 8.10, вам не нужно использовать callback.

...