Оптимизировать приложение узла для обработки данных Gmail - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть приложение node.js, которое использует API Gmail для получения электронной почты от пользователей для дополнительной обработки контента.

Я использую служебную учетную запись с делегированием по всему домену для авторизации пользователей и получения доступа ких почтовый ящик.В настоящее время я авторизую каждого пользователя отдельно, с помощью gmail.list перечисляю их электронные письма за предыдущие 24 часа, а затем с помощью gmail.get на каждом электронном письме получаем контент, который затем обрабатывается.Все пользователи обрабатываются параллельно.

В своем текущем состоянии приложение использует огромный объем памяти, который, я думаю, является нормальным, учитывая количество пользователей (свыше 50 000), и я ищу несколько советов о том, какоптимизировать это.У кого-нибудь есть какие-либо советы о том, что я должен сделать по-другому или улучшить?

Спасибо!

РЕДАКТИРОВАТЬ:

Вот мой текущий код:

async function getEmail(id, user, auth) {
  try {
    const gmail = google.gmail({ version: 'v1', auth });
    const data = await gmail.users.messages.get({ user, id });
    let encoded = '';
    if (data.data.payload.parts) {
      for (let i = 0; i < data.data.payload.parts.length; i += 1) {
        encoded += data.data.payload.parts[i].body.data;
      }
    } else {
      encoded = data.data.payload.body.data;
    }
    const content = Buffer.from(encoded, 'base64').toString('ascii');
    return {
      content,
      email: data.data,
    };
  } catch (e) {
    return null;
  }
}

async function getMailBox(user, query = '') {
  try {
    const mailBox = [];
    const jwt = new google.auth.JWT(
      SERVICE_ACCOUNT.client_email,
      null,
      SERVICE_ACCOUNT.private_key,
      ['https://www.googleapis.com/auth/gmail.readonly'],
      user,
    );
    const auth = await authorize(jwt);
    const gmail = google.gmail({ version: 'v1', auth });
    const data = await gmail.users.messages.list({ userId: user, maxResults: 100, q: query });
    for (const m of data.data.messages) {
      const email = await getEmail(m.id, user, auth);
      if (email) {
        mailBox.push({
          text: email.content,
          email: email.email,
        });
      }
    }
    return mailBox;
  } catch (e) {
    return [];
  }
}

async function processUser(user) {
  const tomorrow = moment().add(1, 'days').format('YYYY/MM/DD');
  const yesterday = moment().add(-1, 'days').format('YYYY/MM/DD');
  const query = `before:${tomorrow} after:${yesterday}`;

  const mailbox = await getMailbox(user, query);
  if (mailbox.length > 0) {
    analyzeData(user, mailbox);
  }
} 

users.forEach(u => processUser(u));
...