Supabase 极速入门之定时任务 | Indie Hacker 成长指南(捌)

科技   科技   2023-12-14 21:02   云南  

参考文章: 

https://supabase.com/blog/postgres-as-a-cron-server

BaaS(Backend as a Service,后端即服务)是指我们不再编写或管理所有服务端组件,可以使用领域通用的远程组件(而不是进程内的库)来提供服务。

Supabase 是一个开源的 Firebase 替代方案。官方表示,其正在使用企业级开源工具构建 Firebase 的功能。Supabase 可以:

  • 监听数据库的变化。
  • 查询你的表,包括过滤、分页和深度嵌套关系(如GraphQL)。
  • 创建、更新和删除行。
  • 管理你的用户和他们的权限。
  • 使用一个简单的用户界面与你的数据库进行交互。

Supabase 的美妙之处在于,在可能的情况下,他们选择了使用现有的库和数据库。他们没有利用最先进的技术,而是使用PostgreSQL来实现大量的功能,并使用其他库来实现其他功能。

独立开发者使用 Supabase 作为 Backend 方案,可以在很大程度上节约心智成本与时间成本。本专栏将在未来,持续更新关于 Supabase 的一系列玩法。

0x01 ⏰定时服务简介

在软件工程实践中,我们经常性的会用到定时服务,定时服务在各项系统重均有实现。

  • Elixir —— GenServer
  • Linux —— Cron
  • Postgres—— pg_cron

在 Supabase 中,我们是通过pg_cron 来实现定时任务的。

https://github.com/citusdata/pg_cron

关于pg_cron,我们掌握四条 SQL 命令即可:

  • 创建新的cron任务
select
  cron.schedule(
    'webhook-every-minute'-- name of the cron job
    '* * * * *'-- every minute
    $$
    select status
    from
      http_post(
        'https://webhook.site/2f767069-809e-4c75-ae1e-8bd7bc5a0090'-- webhook URL, replace the ID(223c8..) with your own
        '{"hello": "world"}'-- payload
        'application/json'
      )
    $$
  );
  • 查看所有的cron任务
select * from cron.job;
  • 查看cron任务的执行结果
select * from cron.job_run_details;
  • 关闭已有的cron 任务
SELECT cron.unschedule('webhook-every-minute'); -- by cron name
SELECT cron.unschedule(1); -- by cron id

💡快速生成 Cron 时间(也就是上面的 * * * * * 部分):

https://crontab.guru/

0x02 快速实践 pg_cron

打开 Supabase 的SQL Editor

image-20231214153809634

执行创建新cron任务的命令(见上)。

webhoot.site的页面可以看到一分钟接收到一条POST

https://webhook.site/


image-20231214154017729

执行关闭cron命令:

image-20231214154311286

0x03 实战!定时从 API 接口拉取数据插入数据库中

这个是一个在日常工程实践中常见的实际案例。例如,我们需要定时拉取关于某个合约的最新 Events 信息,以进行本地缓存。

💡这里有一系列测试用的 API 接口:

https://apipheny.io/free-api/

在这里我们使用这个接口:

https://www.boredapi.com/api/activity

3.1 创建新表格

image-20231214161751140

简单期间,我们创建一个新的表格,新建一个叫 Payload 的字段存储每次cron抓取到的数据。

image-20231214161919590

3.2 新建 cron 任务

新建cron 任务:

select
  cron.schedule(
    'webhook-every-minute'-- name of the cron job
    '* * * * *'-- every minute
    $$
      insert INTO table_name(payload) 
      select content::json from http_get('https://www.boredapi.com/api/activity');
    $$
  );

点击run创建:

image-20231214162058492

3.3 查看 cron 执行结果

image-20231214162322776

3.4 在 Table Editor 里查看数据库的变化

数据每分钟增加,和预期相符。

image-20231214162739845

历史文章:

独立开发者工具梳理 | Indie Hacker 成长指南(柒)

全链上创业组织 | Indie Hacker 成长指南(陆)

运行社区的 4 大挑战 | Indie Hacker 成长指南(伍)

产品上线前如何解决资金问题?|  Indie Hacker 成长指南(肆)

Waitlist 经验谈:独立开发者企业的工具栈 | Indie Hacker 成长指南(叄)

如何围绕你的生活设计你的事业 |  Indie Hacker 成长指南(贰)

打破 MVP 魔咒 | Indie Hacker 成长指南(壹)


李大狗LDG
面向「炫酷」编程
 最新文章