在 Node.js 中为 postgres 表中的每一行以不同的间隔为每一行运行重复任务

Posted

技术标签:

【中文标题】在 Node.js 中为 postgres 表中的每一行以不同的间隔为每一行运行重复任务【英文标题】:Running a repetitive task in Node.js for each row in a postgres table on a different interval for each row 【发布时间】:2020-01-02 02:35:57 【问题描述】:

在 Node.js 中以不同的每行间隔为大型 postgres 数据库表中的每一行运行重复任务的好方法是什么。

为了给您提供更多背景信息,下面是对该应用程序的简要说明:

这是一款基于聊天的客户支持应用。 它由团队组成,可以是客户团队或支持团队。团队有用户,可以是客户用户或支持用户。 客户用户向支持团队发送消息并等待该团队的一位用户回答他们的问题。 当有等待响应的未答复客户消息时,接收支持团队的每个代理都会每 n 秒收到一次通知(n 由团队管理员在每个团队的基础上设置)。

因此,此任务需要无限循环遍历团队表中的行并在以下情况下发送通知:

    团队有消息等待回复。 自上次发送通知以来已过去 N 秒(N 是团队管理员设置的秒数)。 对于这种情况可能有更好的方法。

所以我的问题是:

    在没有行数上限的情况下无限循环 postgres 表的有效方法是什么? 我应该一次加载 1 行吗?一次几个? 在 Node 中执行此操作的好方法是什么? 我正在使用 Knex。 Knex 是否提供延迟加载表和遍历行的机制?

【问题讨论】:

【参考方案1】:

A) 通过节点运行重复性任务可以通过 js 内置函数“setInterval”来完成。

// run the intervalFnc() every 5 seconds
const timerId = setTimeout(intervalFnc, 5000);

function intervalFnc()  console.log("Hello"); 

// to quit running it:
clearTimeout(timerId);

然后你的区间函数可以做实际的工作。另一种方法是使用 cron (linux) 或某些操作系统进程调度程序来触发该功能。如果您想每分钟执行一次,我会使用这种方法,如果您想每小时执行一次,我会使用 cron 作业(在这些时间之间变得更有争议)。

B) 一种有效的方法...

B-1) 从数据库中检索一个记录块将比一次一个更有效。 Knex 有.offset 和.limit 子句来选择要检索的一组记录。来自 knex 文档的示例:

knex.select('*').from('users').limit(10).offset(30)

B-2) 如果表非常大,数据库索引访问对性能很重要。我建议在您的表中包含一个状态标志字段以记录哪些记录是“处理中”的,并且还包括一个“下一个审查时间戳”字段,这两个字段都被编入索引。检索具有status_flag='in-process' AND next_review_timestamp <= now() 的记录。示例:

knex('users').where('status_flag', 'in-process').whereRaw('next_review_timestamp <= now()')

希望这会有所帮助!

【讨论】:

以上是关于在 Node.js 中为 postgres 表中的每一行以不同的间隔为每一行运行重复任务的主要内容,如果未能解决你的问题,请参考以下文章

如何在Postgres中为表中的虚拟列创建数据库链接?

postgres 与 node.js 连接中的 SASL 错误

如何将 postgres 查询分配给 node.js、Discord bot 和 postgres 集成中的变量?

使用node.js将postgres库中的空间数据导出为geojson

如何在node.js中为对象动态添加属性?

使用 Node.js 和 AWS Lambda 将 S3 文件的内容记录到 postgres 表