gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:35 26 4
gpt4 key购买 nike

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

为了给您更多背景信息,这里是应用程序的简要说明:

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

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

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

所以我的问题是:

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

最佳答案

A) 通过 Node 运行重复性任务可以通过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) 从数据库中检索记录 block 比一次检索一条记录更有效。 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 - 在 Node.js 中为 postgres 表中的每一行以每行的不同间隔运行重复任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57699637/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com