我有一个node.js应用程序,该应用程序使用Gmail API来检索用户的电子邮件以进行其他内容处理。
我正在使用具有域范围委派的服务帐户来授权用户并访问其邮箱。目前,我分别授权每个用户,使用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));