Cache In Next.js
next.js的缓存机制前段时间在使用next.js搭建个人博客的时候遇到了一些性能上的问题,最早的实现使用prisma+postgres自己实现了数据缓存。后来发现在部署到生产环境以后效果并不理想,因为云端缓存跟本地的环境还是有差距,无法保障next后台和pg的时延,此外就是缓存过期时从notion取数据会有明显的卡顿,也没有找到xian后来看了了next的文档,发现其已经提供了不少缓存解决方案,降低对后台数据源的实时依赖。虽然有了一些内存上的上涨以及透明度上的隐患,但是相对自己去实现可能会更加合适。
本文重点介绍next.js的几种缓存机制。
简介next.js的缓存机制实现比较复杂,可以分为多层,重点包括:
Router-Cache: 客户端(浏览器)上的缓存,主要目的是通过预拉取、缓存RSCP等减少客户端等待耗时。
Full Route Cache:服务端的渲染结果缓存,目的是减少静态路由的重复渲染。对于页面无变化的场景适用
React-Cache / Request-Memorization:对同一次(页面渲染)请求时多次拉取同一数据源的缓存,既能减少同一次渲 ...
Introduct to NotionAPI
Notion API 介绍Notion的页面组织结构非常灵活,但是一直没有找到相关介绍,最近了解到一个使用Notion作为后台CMS的项目,浏览了一下源码和Notion API。通过API也能大致了解下官方开放的能力以及相关数据结构。
pages
page内容主要由两部分构成
page properties
指定page的基础信息,基础数据结构详见文档,包括:
type Page struct { Object ObjectType `json:"object"` ID ObjectID `json:"id"` CreatedTime time.Time `json:"created_time"` LastEditedTime time.Time `json:"last_edited_time"` CreatedBy User `json:"created_by,omitempty"` ...
Architecture of Supabase
supabase 整体架构分析Firebase是一家典型的BaaS公司,它可以帮助手机以及网页应用的开发者轻松构建App。通过Firebase的框架就可以简单地开发一个App,无需服务器以及基础设施,简单来说,它就是一整套的解决方案。Supabase 是一个开源的 Firebase 替代方案。官方表示,其正在使用企业级开源工具构建 Firebase 的功能。Supabase 可以:• 监听数据库的变化。• 查询你的表,包括过滤、分页和深度嵌套关系(如GraphQL)。• 创建、更新和删除行。• 管理你的用户和他们的权限。• 使用一个简单的用户界面与你的数据库进行交互
本文通过从本地部署方案大致分析其整体架构。
简介Supabase的定位为Firebase的开源替代,围绕 PostgreSQL 组合了一系列的开源工具,用以实现 BaaS 所需的用户认证、实时数据库、对象存储、RESTAPI 接口等功能。在整合这些工具的同时,为开发者封装了统一的 SDK,方便开发者以统一的方式调用这些能力。官方提供了 JavaScript 和 Flutter 的 SDK,社区贡献了 Python、C ...
Introduct-to-nocoDB
nocoDB 体验本地安装体验了一把nocoDB,总体感觉功能挺丰富。既适合作为headerless CMS使用,也适合作为数据展示、编辑终端,官网描述的主要特点:
丰富的电子表格界面
⚡ 基本操作:创建、读取、更新和删除表、列和行
⚡ 字段操作:排序、过滤、隐藏/取消隐藏列
⚡ 多种视图类型:网格(默认)、图库、表单视图和看板视图
⚡ 查看权限类型:协作视图和锁定视图
⚡ 共享基础/视图:公共或私有(受密码保护)
⚡ 变体单元格类型:ID、LinkToAnotherRecord、Lookup、Rollup、SingleLineText、附件、货币、公式等
⚡ 角色访问控制:不同级别的细粒度访问控制
用于工作流程自动化的 App Store
我们在三个主要类别中提供不同的集成。详情请参阅应用商店。
⚡ 聊天:Slack、Discord、Mattermost 等等
⚡ 电子邮件:AWS SES、SMTP、MailerSend 等
⚡ 存储:AWS S3、Google Cloud Storage、Minio 等
接口访问
我们提供以下方法让用户以编程方式调用 ...
Doploy outline without docker
非Docker方式部署outline预研了几个可托管部署的团队wiki,看了一圈还是觉得outline比较合适。但是不太希望以docker的方式来部署,所以折腾下本地非docker方式的部署方案。记录如下。
需求作为团队知识管理系统,选型上重点考虑以下需求:
开源,可定制。
支持多机部署。即所有数据不存储在本地,而是外部存储服务中。
Markdown语法支持。
可导出Markdown。即随时可以切换到别的平台。
团队协作的权限管理。针对用户设置不同级别的访问权限。内部用户可编辑,外部用户仅查看。
支持多种账号形态。
outline基本符合以上各类条件。支持Slack、Google以及Azure,同时也支持第三方OIDC认证。刚好前段时间预研过dex的用法,所以就以dex作为OIDC的服务方来部署。
部署整体部署流程分为几步:
安装相关依赖,包括Postgres、Redis、minio(可选)
安装OIDC鉴权服务。配置相关认证鉴权参数。
从git下载代码,启动方式参考官方文档即可。
依赖存在以下几个存储依赖:
Postgres:用于存储outline内部数据以及文章数据。 ...
Archive Service Governance
业务服务治理背景挑战故障频发上半年新老系统突发N次故障,部分已经影响用户体验。
故障1:xx服务故障,原因为系统设计不合理,导致晚高峰流量突破系统瓶颈,而相关服务缺少过载保护措施。幸好主流程有对应的稳定性措施,未造成大规模影响。
故障2:xx服务故障,原因未开发同学误操作接入层现网配置,且相关变更未同步到团队其他人,另外接入层问题相对隐晦,定位耗时比较长。影响部分用户体验。
故障3:xx服务重构,因老系统交接N手,新接手同学未考虑到老版本的特殊需求,上线后问题一直未大规模暴露。直到某节假日现网问题集中反馈才暴露。
研发效率、质量差几个典型问题:
开发、测试环境冲突,缺少系统集成测试环境:因为业务的复杂性,大部分业务都需要依赖平台相关服务,而平台业务却很少考虑业务的诉求,导致环境各异,开发、测试冲突时有发生。
版本兼容性:业务的特殊性,终端还有N年前的版本在线上,这些都需要后台兼容。后台祖传的服务太多,交接过多手后不清楚哪些特性还在使用,哪些已经废弃。不敢重构。
系统容灾能力考虑不足:容灾措施评估不足,或者年久失修,没有真正经历过故障的考验。当故障发生时发现跟预估的效果差别较大。
...
Sentinel Code Analyze
sentinel-go背景之前团队在服务治理项目过程中引入了司内稳定性相关的组件,其中也包含了流量控制、熔断降级等稳定性相关的能力,但我一直也没有时间来深挖各模块的实现细节。趁最近有空,看了下阿里开源版本的稳定性组件sentinel实现,整体感觉代码结构清晰,在并发控制、性能优化细节上也做了不少工作,于是花时间仔细阅读了下部分代码,并输出笔记一篇。
另外写文章之前发现sentinel的官方文档非常细致,包括功能使用以及原理介绍,于是直接copy了部分,并根据最新代码做了修正。最后补充了流量控制的代码分析,其他模块原理也类似,时间有限就没有逐一阅读了。
Sentinel介绍:Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
流量控制任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel 作为一个调配器,可以根据需要把随机的请求调整成合适的形状。
流量控制有以下几 ...
Introduct to dexide / dex
dexidp / dex 部署及使用简介阅读pocketbase源码时其授权流程比较感兴趣,但pocketbase代码量太大了,授权部分并不是一个独立的模块。之前也看了kratos文档,感觉太过庞大,形态一套自己的生态体系。今天刚好看到了dex的介绍,预览了一下用法和代码仓库,感觉复杂度居中,而且能力不差。所以研究了一下其用法。
功能:降低app开发者实现Identifier provider对接的成本,可以通过Dex来快速实现各类provider的对接。
当用户通过dex进行登陆时,用户的身份信息通常存放在第三方用户管理系统中,例如LDAP。Dex作为客户端和第三方用户管理系统之间的垫片,其价值是,客户端仅仅需要理解OIDC,后端用户管理系统可以随时切换。
用法Demo演示
启动Dex server
$ make$ ./bin/dex serve examples/config-dev.yamltime="2023-10-24T06:23:41Z" level=info msg="Dex Version: 6f745746c1c98 ...
Introduct to pocketbase
pocketbase / pocketbase 源码分析功能介绍pocketbase 是一个开源的开箱即用的后端服务(库),使用它可以快速搭建一个典型的后台服务,支持简单的CRUD操作,同时也支持权限控制、关联查询、插件化等特性,包括:
CRUD基础能力
大量后台服务的要求就是基于DB的CRUD操作,比如创建一个自定义字段的表格,以及对应的增删改啥。pocketbase提供了一个管理台页面支持快速创建数据表(collection),指定字段名称及字段类型等。后台使用sqlite作为数据engine。
业务方可以通过RESTFUL接口(可以理解为普通用户)实现基础的CRUD操作,当然也可以直接在管理台配置(admin用户)。
权限校验:创建、更新、删除、查询等可以灵活配置规则,比如要求删除记录的用户必须与记录中的用户id保持一致、查询数据(ListRule)时当前用户必须已登录或者属于某个集合等。此功能可以实现比较精细化的权限控制,保护数据安全。
用户管理
除数据表外,还支持用户表的创建。具有同一批用户权限的用户可以存储在同一个用户表中,同一个表中的用户具有类似的权限以及 ...
memos code analyze
简介Memos是一个开源的支持自托管部署的知识库,类似flomo。作为一个go+react实现的产品,功能齐全,且活跃度一直不错,所以找了个时间阅读了一下代码。本次仅记录后端及DB设计部分,前端部分后续有时间了再继续。
安装方法方法一:可能是出于部署便捷的考虑,代码中仅支持docker安装,下面解析Dockerfile中镜像构建步骤,属于典型的多阶构建过程:
协议代码生成:安装buf,buf generate生成协议代码。包括后端所需的pb、grpc、grpc-gateway代码以及前端所需的ts代码。详见buf.yml配置
使用pnpm build编译前端文件,详见前端文件夹(web/)下的package.json
将前端打包结果(web/dist)copy到server目录,build后端服务。注意:项目中使用了go embed,将前端资源目录一并打包到了二进制memos文件中,并在代码中提供了静态文件的读服务。所以部署时不再需要copy前端目录文件,也无需其他反向代理。
//go:embed distvar embeddedFiles embed.FS ...