仅举一个例子:
我有一个系统,它需要根据用户的喜好在特定的时间间隔内获取社交媒体时间线。
假设我们有用户A,B,C,等等。
让我们再说一遍,我们有时间间隔选项从每5分钟到每60分钟,用户可以选择他们想要的间隔。
等。
首先,我像这样定义了social media表。
- id
- userId
- twitterUsername
- interval // int, store interval in minutes
- lastRunAt
- createdAt
- updatedAtInterval用于存储用户首选项,lastRunAt用于标记最后一次运行行的时间。
因此,为了运行这个函数,我创建了一个cron作业,它将每分钟运行一次,执行这个函数来获取社交媒体数据。假设是fetchSocialMedia()。
在fetchSocialMedia()内部,我执行一个select查询,从social media表中获取数据,然后循环它,然后在循环中检查interval + lastRunAt,以将其与当前时间进行比较。如果interval + lastRunAt已经超过了当前时间,那么是时候让该行获取社交媒体时间线了,否则就跳过它。
fetchSocialMedia() {
const socialMedias = SocialMedia.findAll();
for(let i=0; i<socialMedias.length; i++) {
const item = socialMedias[i]
// Ignore the syntax, just focus on the approach :)
const compare = (item.lastRunAt + item.interval) < time now
if (compare) {
// do fetch the timeline here
}
}
}添加到cronjob以每分钟运行一次。
cron.schedule('* * * * *', () => {
fetchSocialMedia()
});如果你有机会让它变得更好,或者你想从头开始创建它,你会怎么做?
我担心的是这个系统的性能,特别是如果我们有数千个或更多的社交媒体数据。
发布于 2022-05-16 10:29:08
social media是用词不当的,这实际上是一种日程安排或重复的任务表。选择一个合适的名字。lastRunAt,而是存储nextTimeToRun,这将得到简化。nextTimeToRun,并在处理下一个条目之前使用它来适当地休眠。但是,如果您有许多条目,这可能会导致活动增加,因此您可能希望它至少睡眠30秒左右,以确保它不会经常运行。https://softwareengineering.stackexchange.com/questions/438620
复制相似问题