У меня есть приложение 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));