feat: dont load all subscribers at once

increase batch to 500
v1.18.x
Barış Soner Uşaklı 5 years ago
parent 23a9a334cd
commit 2a5f8ab27e

@ -29,13 +29,14 @@ Digest.execute = async function (payload) {
return; return;
} }
try { try {
winston.info('[user/jobs] Digest (' + payload.interval + ') scheduling completed. Sending emails; this may take some time...');
await Digest.send({ await Digest.send({
interval: payload.interval, interval: payload.interval,
subscribers: subscribers, subscribers: subscribers,
}); });
winston.info('[user/jobs] Digest (' + payload.interval + ') scheduling completed. Sending emails; this may take some time...'); winston.info('[user/jobs] Digest (' + payload.interval + ') complete.');
} catch (err) { } catch (err) {
winston.error('[user/jobs] Could not send digests (' + payload.interval + ')', err.stack); winston.error('[user/jobs] Could not send digests (' + payload.interval + ')\n' + err.stack);
throw err; throw err;
} }
}; };
@ -81,7 +82,10 @@ Digest.getSubscribers = async function (interval) {
}); });
subUids = await user.bans.filterBanned(subUids); subUids = await user.bans.filterBanned(subUids);
subscribers = subscribers.concat(subUids); subscribers = subscribers.concat(subUids);
}, { interval: 1000 }); }, {
interval: 1000,
batch: 500,
});
const results = await plugins.fireHook('filter:digest.subscribers', { const results = await plugins.fireHook('filter:digest.subscribers', {
interval: interval, interval: interval,
@ -91,15 +95,13 @@ Digest.getSubscribers = async function (interval) {
}; };
Digest.send = async function (data) { Digest.send = async function (data) {
var emailsSent = 0; let emailsSent = 0;
if (!data || !data.subscribers || !data.subscribers.length) { if (!data || !data.subscribers || !data.subscribers.length) {
return emailsSent; return emailsSent;
} }
const now = new Date();
const users = await user.getUsersFields(data.subscribers, ['uid', 'username', 'userslug', 'lastonline']);
async.eachLimit(users, 100, async function (userObj) { await async.eachLimit(data.subscribers, 100, async function (uid) {
const userObj = await user.getUserFields(uid, ['uid', 'username', 'userslug', 'lastonline']);
let [notifications, topicsData] = await Promise.all([ let [notifications, topicsData] = await Promise.all([
user.notifications.getUnreadInterval(userObj.uid, data.interval), user.notifications.getUnreadInterval(userObj.uid, data.interval),
getTermTopics(data.interval, userObj.uid, 0, 9), getTermTopics(data.interval, userObj.uid, 0, 9),
@ -128,6 +130,7 @@ Digest.send = async function (data) {
return topicObj; return topicObj;
}); });
emailsSent += 1; emailsSent += 1;
const now = Date.now();
try { try {
await emailer.send('digest', userObj.uid, { await emailer.send('digest', userObj.uid, {
subject: '[[email:digest.subject, ' + (now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate()) + ']]', subject: '[[email:digest.subject, ' + (now.getFullYear() + '/' + (now.getMonth() + 1) + '/' + now.getDate()) + ']]',
@ -145,9 +148,8 @@ Digest.send = async function (data) {
if (data.interval !== 'alltime') { if (data.interval !== 'alltime') {
await db.sortedSetAdd('digest:delivery', now.getTime(), userObj.uid); await db.sortedSetAdd('digest:delivery', now.getTime(), userObj.uid);
} }
}, function () {
winston.info('[user/jobs] Digest (' + data.interval + ') sending completed. ' + emailsSent + ' emails sent.');
}); });
winston.info('[user/jobs] Digest (' + data.interval + ') sending completed. ' + emailsSent + ' emails sent.');
}; };
Digest.getDeliveryTimes = async (start, stop) => { Digest.getDeliveryTimes = async (start, stop) => {

Loading…
Cancel
Save