介绍 pg_later:受 Snowflake 启发的 Postgres 异步查询

read-normal-img


为什么要使用异步查询?

想象一下,您启动了一项长期维护工作。您在执行过程中离开,但回来后发现,由于笔记本电脑关机,该工作在几个小时

前就被中断了。您不希望这种情况再次发生,因此花了一些时间在 Google 上搜索或询问您最喜欢的 LLM 如何使用

 screen 或 tmux 在后台运行该命令。如果从一开始就支持异步查询,那么您将节省大量时间和精力!

异步处理是软件工程中一种有用的开发模式。它具有提高资源利用率、解除主执行线程阻塞等优点。

异步查询有用的一些示例是:

  • DBA 运行临时维护。

  • 在 Jupyter笔记本等交互式环境中进行开发。您可以使用异步任务来避免阻塞笔记本,或者只是稍后再回来检查任务,

而不是提交长时间运行的查询,而只是让您的笔记本挂起然后崩溃。

  • 长时间运行的分析查询。例如,满足临时请求,如查看过去一个月每天有多少新用户注册。您可以提交该查询并让它
  • 在后台运行,同时继续其他工作。

使用异步功能扩展 Postgres

pg_later 类似,您可以将查询发送到您的 Postgres 数据库,而不必等待结果,您的程序可以根据您的方便返回和检索结果。

一个常见示例是手动执行VACUUM表操作。通常,人们可能在一个会话中执行 VACUUM,然后使用另一个会话通过 检查 

VACUUM 作业的状态pg_stat_progress_vacuum。pg_later 让您能够在单个会话中执行此操作。您可以使用它来排队 

Postgres 数据库上的任何长时间运行的分析或管理任务。

堆叠 Postgres 扩展

pg_later 建立在PGMQ之上,这是 Tembo 的另一个开源扩展。一旦用户提交查询,pg_later 就会无缝地将请求排入 

Postgres 管理的消息队列。然后,此机制会异步处理查询,确保不会出现不必要的等待时间或延迟。


Postgres 后台工作程序从队列中获取查询并执行它。结果以JSONB格式写入表并持久化,可以使用 pg_later API 轻松检索。

您可以简单地引用查询提交时提供的唯一作业 ID 并检索结果集,或者直接查询表。默认情况下,结果将保留。但是,

我们正在将保留策略作为一项功能构建到 pg_later 中。

使用 pg_later

首先,请查看我们项目的README以获取安装扩展的指南。

初始化扩展

首先,您需要初始化扩展。这将处理 PGMQ 对象(如作业队列和一些元数据表)的管理。


read-normal-img


调度查询

现在,您已准备好分派查询。使用 pglater.exec 提交查询,并确保记下job_id返回的。在本例中,这是第一个作业,因此job_id为 1。


read-normal-img


检索结果

只要您准备好,只需查询一下即可获得结果:


read-normal-img


read-normal-img


     #PG培训#PG考试#postgresql培训#postgresql考试#postgresql认证


请使用浏览器的分享功能分享到微信等