用Cloudflare Durable Objects实现延迟部署
开发
-之前做过一个项目,由于是个人网站类型的内容站,就选择了纯静态网站方案,框架是Astro,CMS则采用Sanity,项目部署在Cloudflare Pages。在Sanity进行设置,在有内容变动的时候,触发重新build的webhook。
但是随着内容的增加(某个类型的内容有600多条),build时间也随之增加,每次构建时间甚至有7分钟。而Sanity不支持手动触发webhook,意味着假如你保存了几次文章,就会触发同样多次的build任务。不仅产生大量无用的部署,还极其耗时。如果改了十几篇文章,要看到最新内容就得等1个小时了。
所以今年在做该项目的新功能时,我把延迟构建也考虑了进去。
这个功能很简单:作为webhook中转,收到构建请求后,延迟一段时间再发出,如果一定时间内有新的请求,就重新计时。如果延迟时间是20分钟,无论你改了多少次,只要间隔时间不超过20分钟,实际的构建就只有一次。
由于我的原则是能不跟服务器打交道就不打交道,我想尽量用Cloudflare来实现这一需求。
仅仅用workers是不行的。因为workers无状态的,不能简单的setInterval。经过一番搜索发现Durable Objects可以实现这个需求。
在 这篇 文档中Cloudflare介绍了如何设置Durable Objects在未来某个时间唤醒。
并且还可以通 getByName(“scheduler”) 使这些触发事件获取到的是同一个实例,新请求会覆盖之前的请求,所以不会产生重复构建。
为了让其更通用,我没有将目标webhook链接写死,而是要求以http头的方式传入,同时也接受延迟时间、验证token。这样就变成了一个多项目共用的通用webhook延迟触发器。
详细代码和使用方法见 GitHub 。