Выполнение 700 вызовов API и объединение данных с помощью AWS Lambda - PullRequest
0 голосов
/ 02 июня 2018

У меня есть задача, в которой я должен сделать 700 вызовов REST API.Я использовал цикл, но время его выполнения превышает время ожидания службы AWS Lambda.Есть ли способ сделать звонки одновременно и объединить результаты.Я использую узел JS, но также приветствуется решение на python

Вот пример кода, который я сейчас запускаю:

HitBTCData = {}
for item in exchanges:
    itemlist = item.split('-')
    response = requests.get('https://min- 
    api.cryptocompare.com/data/histominute? 
    fsym='+itemlist[0]+'&tsym='+itemlist[1]+'&limit=2000&aggregate=1
    &e=HitBTC').json()

    if itemlist[0]+itemlist[1] not in HitBTCData:
        HitBTCData[itemlist[0]+itemlist[1]] = []
        HitBTCData[itemlist[0]+itemlist[1]].append(response['Data'])

    while response['Type'] != 1:
        time = response['TimeFrom']
        response = requests.get('https://min- 
        api.cryptocompare.com/data/histominute? 
        fsym='+itemlist[0]+'&tsym='+itemlist[1]+
       '&limit=2000&aggregate=1&toTs='+str(time)+'&e=HitBTC').json()

        if response['Type'] != 1:
          HitBTCData[itemlist[0]+itemlist[1]]
          .append(response['Data'])

    HitBTCData[itemlist[0]+itemlist[1]] = 
    HitBTCData[itemlist[0]+itemlist[1]][::-1]

Ответы [ 2 ]

0 голосов
/ 20 июня 2018

Вы можете очень легко сделать это с помощью Promise.all():

const urls = [...];

const requestFunction = async (url) => {
    // all your ifs go here
    let data = await request(url);
    // transform/sanitize your data
    return data;
}

const allResults = await Promise.all(urls.map(requestFunction));
// you now have an array of results

Единственным недостатком Promise.all() является то, что если любое из обещаний отклоняется, все терпит неудачу.Поэтому я бы предложил отлавливать ошибки и устранять их с помощью null или чего-то подобного.

Вы можете сделать цикл for для генерации массива URL-адресов, new Array(700).map(...), или, похоже, у вас уже есть некоторыевид массива, просто .map(), который напрямую и выполняет дополнительные преобразования внутри функции запроса.

0 голосов
/ 04 июня 2018

Используйте цикл в Node.js, и вызовы будут выполняться одновременно, но чтобы убедиться, что все ваши вызовы обрабатываются до выхода из лямбды, вам нужно иметь некоторую форму счетчика, чтобы убедиться, что все запросы завершены.

пример:

var request = require('request');

var results = [];
var runningQueries = 0;
exchanges.forEach(function (item) {
  ++runningQueries;
  callAPI (item, function (err, data) { 
    if (err) {
      results.push(err)
      --runningQueries;
    } else {
      results.push(data)
      --runningQueries;
    }
    if (runningQueries == 0) {
      // all call results have been collated, so do something
    }
  })
})

Вам необходимо создать собственную функцию callAPI.Кроме того, я немного ленив с тем, что я помещаю сюда в массив, но это просто для того, чтобы дать вам основу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...