我有个关于在Postgres上产生独立线程的问题。以下是我理想中想要的:
有一个postgres端解决方案,可以在自己的线程中根据计划自动启动任务。
类似于(想象中的)下面的例子:
CALL_IN_NEW_THREAD do_db_maintenance();我知道这是不存在的,但我不知道什么是可能的或者更好的。我正处于设计阶段,所以我的问题不涉及SQL语法等等。我试图弄清楚是否有一种方法可以“分离”一个查询,这样我的连接就可以在不等待任务完成的情况下关闭。或者,更好的是,如果有一种方法可以自动启动Postgres本身上的常规任务,而不需要客户端启动或响应通知。
首先,设置:
我希望做的事情是这样的:
所以,客户就这样开始工作,然后离开。在Postgres中,这是否有可能没有共享库或RDS上不可能的其他任何东西?
如果不可能,我总是可以让我的外部程序登录,查找挂起的任务,并以与客户端不同的线程启动它们。(要仁慈,并假设我已经正确地处理了锁定,而不是双重启动任何任务。)让客户端连接没有真正的目的而存在似乎有点愚蠢,但这并不是世界末日。从好的方面来说,如果我搞砸了一些事情,并且有一项花费太长时间的任务,这可能会让我更容易注意到。
我在Postgres中查看了各种计划任务的解决方案,这似乎是一个常见的要求。关于我看到的解决方案的几个注意事项:
触发器--当然,这使得sense...they作为一种信号工作。但是,在任务完成之前,您已经将运行触发器的进程捆绑在一起。(似乎没有分离过程调用的方法。)所以,这感觉不是什么大帮助。我想我可以有一个实用程序表,其中触发器除了运行一个方法没有别的用途,但是我看不出直接在查询中运行该方法能提供什么。
pg_cron在RDS上不可用。
PgAgent在RDS上不可用。
RDS上找不到cron。但是您可以设置一个EC2实例等来运行cron。
您的语言在这里使用您选择的语言连接,运行,等待,重复。我猜这就是我最后要做的。
通知/听,酷!但是它仍然需要“你在这里的语言”来做听力,所以我认为它不会对我有任何改变。
dblink这听起来很有希望,但我不确定我想要的是什么。dblink_send_query支持每个连接一个异步查询,听起来该连接必须持续。文档中也没有显示您可以将dblink返回到同一个数据库。我们现在没有第二个DB正在运行,但是在某些point...so dblink上,我们会考虑这样做。
发布于 2019-07-21 16:33:58
你似乎在反抗RDS的限制。RDS为您提供了哪些值得限制的地方,而不仅仅是租用硬件并在其上运行您自己的数据库?
触发器和通知/侦听是事件驱动的,而不是时钟驱动的。它们是用来解决一个不同于你的问题的。
我更喜欢的方法是把'cron‘和’您这里的语言‘结合起来。用你的语言写这份工作,用cron启动它。例如,如果我正在编写一个web应用程序,我实际上会将维护逻辑写入web应用程序,然后让cron use wget访问一个特殊的URI来调用它。是的,这需要一台非RDS机器来运行cron和您选择的语言(除非您放弃了RDS),但是如果您有一个web应用程序,您已经有了一个应用服务器,可以用于这个目的(除非这台机器也是由AWS管理的,没有CLI访问权限)。
您也可以以同样的方式使用pgAgent。您需要一台单独的机器来运行pgAgent软件。您还可以在该机器上运行一个小型数据库来保存作业--pgAgent可以从一个数据库读取作业,但可以对另一个数据库执行作业。我认为(但我还没有对此进行测试)您甚至可以将作业放入主数据库的架构中。虽然不能使用“”,但可以手动运行脚本来创建所有对象。(如果您确实想使用pgAgent,您可以错误地使用AWS来白化它-因为它不需要超级用户,所以除了所涉及的工作之外,没有理由不这么做)
https://dba.stackexchange.com/questions/243366
复制相似问题