当前位置: 首页 > 知识库问答 >
问题:

运行 cron 作业以从大量计划作业记录表中进行轮询是否不好?

辛盛
2023-03-14

我有一个表,cron 作业会每分钟轮询该表,以向其他服务发送消息。表中的记录实质上是计划在特定时间运行的活动。cron 作业只是检查哪些活动已准备好运行,并通过 SQS 将该活动的消息发送到其他服务。

当cron作业发现活动已准备好运行时,在通过SQS发送消息后,该记录将被标记为done。有一个API允许其他服务检查计划活动是否已经完成。因此,需要保留那些已完成记录的历史记录。

然而,我在这里关心的是这样的设计从长远来看是否是可扩展的。每天大约有200k计划的活动,甚至在某些日子里更多。因为我在记录完成后通过将它们标记为完成来保存记录,所以我担心表最终会变得非常大,有超过千万行,并成为cron作业频繁运行的问题。

即使有一个正确索引的表,我的担心是正确的吗?否则,如果我必须以某种方式为cron或其他东西持久化那些预定的活动,以便在它们准备好运行时进行轮询和检查,我还能设计什么其他的替代方案呢?

我正在使用邮递数据库。

共有2个答案

慕承允
2023-03-14

使用正确的索引,cron作业应该没有严重的问题。您可以有一个部分/过滤索引,例如

create index on jobs (id) where status <> 'done'.

保持较小的索引大小。查询必须与索引where子句匹配。

我使用<code>(id)</code>只是因为不允许空列表,所以必须有一些东西。根据您的评论,<code>schedule_dt</code>可能是一个更好的选择。如果包括所选的所有列,则可以获得仅索引扫描。但是如果不这样做,它仍然会使用索引,它只需要访问表来获取那些特定行的列。我怀疑只扫描索引的尝试对您来说不值得,因为您需要的页面可能不会被标记为全部可见,因为一分钟前对相邻元组进行了修改。

但是,在仅计划而不是完成时将工作标记为已完成似乎有点奇怪。

有一个API允许其他服务检查计划活动是否已经完成。

除了cron作业之外,一个无约束地增加大小的表可能会带来管理问题。当然,服务不会为了做到这一点而回顾几个月,是吗?你能在几天后删除“完成”的作业吗?如果一个服务试图查找一个作业,而不是找到它“完成”,而是根本找不到它怎么办?

我不认为cron作业本身就是个问题,但是没有它会更干净。为什么谁插入作业就实时调用SQS呢?

师谦
2023-03-14

只要 cron 作业的查询必须提取的行数保持不变,并且您可以使用索引,表的大小就无关紧要。

索引扫描相对于扫描的行数为O(n),相对于表大小为O(log(n))。更具体地说,将表大小增加10到200倍(索引键的大小越小,扇出效果越好)将使索引扫描使用更多的块,并且该块通常被缓存。

如果表变大,您可能仍然需要考虑分区,但主要是为了有效地删除旧数据。

 类似资料:
  • 我希望每天早上9点完成一项任务。我得到了一些有趣的结果。目前我的工作是这样的: 这是怎么回事?这是正确的表达吗?

  • 问题内容: 我想清除所有超过1周的SQL数据库,我想每晚进行一次。所以,我要安排一份工作。如何查询mySQL,而不必每次都手动输入密码? PHP中的查询如下: 有没有办法将其作为shell脚本运行?如果没有,有没有一种方法可以使cron运行php文件? 问题答案: 尝试创建如下所示的shell脚本: 然后可以将其添加到cron

  • 我有一个页面“test.PHP”,它运行一个PHP脚本并返回datetime/some结果...这个页面我在cron作业中调用,它运行成功,但我想将返回的结果记录在一个文件中 我试过了...cron_log.log是空的

  • 问题内容: 我想以分离模式在docker容器中运行python cron作业。我的设置如下: 我的python脚本是test.py 我的cron文件是my-crontab 而我的Dockerfile是 这种方法潜在的问题是什么?还有其他方法,它们的优缺点是什么? 问题答案: 我在尝试使cron作业在docker容器中运行时遇到的几个问题是: Docker容器中的时间不是UTC的本地时间; dock

  • 这种方法的潜在问题是什么?是否还有其他方法,它们的利弊是什么?

  • 我需要在Java中创建一个计划作业或Cron作业,以便每天早上6点运行。有没有一个简单的方法。我曾尝试将Timer类与scheduledAtFixedRate方法一起使用,但只需要一个延迟。 有一种方法可以将一天作为第一次,然后是第二次 如何创建启动计划程序的特定日期和时间? 我的类需要运行作业已经扩展了TimerWork。