首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在RDS上运行一个任务而不等待Postgres 11中的结果

在RDS上运行一个任务而不等待Postgres 11中的结果
EN

Database Administration用户
提问于 2019-07-20 04:53:22
回答 1查看 1.4K关注 0票数 2

我有个关于在Postgres上产生独立线程的问题。以下是我理想中想要的:

有一个postgres端解决方案,可以在自己的线程中根据计划自动启动任务。

类似于(想象中的)下面的例子:

代码语言:javascript
复制
   CALL_IN_NEW_THREAD do_db_maintenance();

我知道这是不存在的,但我不知道什么是可能的或者更好的。我正处于设计阶段,所以我的问题不涉及SQL语法等等。我试图弄清楚是否有一种方法可以“分离”一个查询,这样我的连接就可以在不等待任务完成的情况下关闭。或者,更好的是,如果有一种方法可以自动启动Postgres本身上的常规任务,而不需要客户端启动或响应通知。

首先,设置:

  • 我们有许多常规任务要定期运行。想象一下刷新物化视图,集成发布的更改,DB管理杂务等等。
  • 查询/任务的结果被写回数据库,因此客户机不需要收集它们。
  • 假设我们有一个task_definition表,它可以简单地确定哪些任务是挂起的,哪些任务应该运行。
  • 我们的部署环境是RDS上的Postgres11.x,因此pg_cron不可用。实际上,命令行是不可用的。
  • 我们将在Postgres 11.x,直到RDS认证PG 12。所以,我正在寻找一个基于PG-11的解决方案,在可预见的未来,可能更好的部分下一年。

我希望做的事情是这样的:

  • 让外部程序登录到Postgres,扫描task_definition表,找到应该启动的作业,然后启动它们。
  • “启动他们”在不同的线程。
  • 然后注销。

所以,客户就这样开始工作,然后离开。在Postgres中,这是否有可能没有共享库或RDS上不可能的其他任何东西?

如果不可能,我总是可以让我的外部程序登录,查找挂起的任务,并以与客户端不同的线程启动它们。(要仁慈,并假设我已经正确地处理了锁定,而不是双重启动任何任务。)让客户端连接没有真正的目的而存在似乎有点愚蠢,但这并不是世界末日。从好的方面来说,如果我搞砸了一些事情,并且有一项花费太长时间的任务,这可能会让我更容易注意到。

我在Postgres中查看了各种计划任务的解决方案,这似乎是一个常见的要求。关于我看到的解决方案的几个注意事项:

触发器--当然,这使得sense...they作为一种信号工作。但是,在任务完成之前,您已经将运行触发器的进程捆绑在一起。(似乎没有分离过程调用的方法。)所以,这感觉不是什么大帮助。我想我可以有一个实用程序表,其中触发器除了运行一个方法没有别的用途,但是我看不出直接在查询中运行该方法能提供什么。

pg_cron在RDS上不可用。

PgAgent在RDS上不可用。

RDS上找不到cron。但是您可以设置一个EC2实例等来运行cron。

您的语言在这里使用您选择的语言连接,运行,等待,重复。我猜这就是我最后要做的。

通知/听,酷!但是它仍然需要“你在这里的语言”来做听力,所以我认为它不会对我有任何改变。

dblink这听起来很有希望,但我不确定我想要的是什么。dblink_send_query支持每个连接一个异步查询,听起来该连接必须持续。文档中也没有显示您可以将dblink返回到同一个数据库。我们现在没有第二个DB正在运行,但是在某些point...so dblink上,我们会考虑这样做。

EN

回答 1

Database Administration用户

发布于 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来白化它-因为它不需要超级用户,所以除了所涉及的工作之外,没有理由不这么做)

票数 0
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/243366

复制
相关文章

相似问题

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