首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于Node.js的调度系统设计

基于Node.js的调度系统设计
EN

Software Engineering用户
提问于 2022-05-15 04:42:59
回答 1查看 91关注 0票数 0

仅举一个例子:

我有一个系统,它需要根据用户的喜好在特定的时间间隔内获取社交媒体时间线。

假设我们有用户A,B,C,等等。

让我们再说一遍,我们有时间间隔选项从每5分钟到每60分钟,用户可以选择他们想要的间隔。

  • 用户A希望它每5分钟取一次。
  • 用户B希望它每18分钟取一次。
  • 用户B希望它每36分钟取一次。

等。

电流逼近

首先,我像这样定义了social media表。

代码语言:javascript
复制
- id
- userId
- twitterUsername
- interval // int, store interval in minutes
- lastRunAt
- createdAt
- updatedAt

Interval用于存储用户首选项,lastRunAt用于标记最后一次运行行的时间。

因此,为了运行这个函数,我创建了一个cron作业,它将每分钟运行一次,执行这个函数来获取社交媒体数据。假设是fetchSocialMedia()

fetchSocialMedia()内部,我执行一个select查询,从social media表中获取数据,然后循环它,然后在循环中检查interval + lastRunAt,以将其与当前时间进行比较。如果interval + lastRunAt已经超过了当前时间,那么是时候让该行获取社交媒体时间线了,否则就跳过它。

fetchSocialMedia()

代码语言:javascript
复制
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以每分钟运行一次。

代码语言:javascript
复制
cron.schedule('* * * * *', () => {
  fetchSocialMedia()
});

如果你有机会让它变得更好,或者你想从头开始创建它,你会怎么做?

我担心的是这个系统的性能,特别是如果我们有数千个或更多的社交媒体数据。

EN

回答 1

Software Engineering用户

发布于 2022-05-16 10:29:08

  • 首先(这不是你的问题的一部分,但真正重要的是要有一个清晰的理解),考虑命名。social media是用词不当的,这实际上是一种日程安排或重复的任务表。选择一个合适的名字。
  • 正确使用数据库的服务。与其读取所有条目并测试每个条目是否应该再次运行,不如使用where子句来选择现在应该运行的条目。如果您不存储lastRunAt,而是存储nextTimeToRun,这将得到简化。
  • 您可能希望运行守护进程,而不是每分钟触发处理。守护进程可以在运行任务后选择最小的nextTimeToRun,并在处理下一个条目之前使用它来适当地休眠。但是,如果您有许多条目,这可能会导致活动增加,因此您可能希望它至少睡眠30秒左右,以确保它不会经常运行。
  • 这实际上应该是第一点,但我最后提到它,所以它坚持:关注自己的性能时,只有当你有性能问题。然后从测量、分析测量开始,在解决方案之前比较各种不同的方法。过早的优化很少有好的效果。
票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/438620

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档