GooseForum 开发背景

这个项目是很早之前创建了初始化仓库,写的很慢,一直断断续续的写,中间还没有写完的时候有重构过一次。虽然写的很慢,但是也算是慢慢的写出一个版本了。只是中途重构有一个多文章主题的选择忘了实现了。服务端逻辑写好了。近期会迁移过来。

从背景开始讲吧。

最早我是受cloudreve影响比较大。当时发现 golang 打包成可执行文件给别人分发软件实在是太方便了。(当时 cloudreve 的静态资源嵌入用的还不是 embed 还是 go 的一些静态资源生成)。而且可以交叉编译,无论是 windows 还是 linux ,下载下来就可以直接部署一个小的站点,当时对我关于站点部署还是蛮有冲击力的,虽然 php 的相关开源项目很多,但是我认为这种无环境依赖的安装方式我觉得对于一些非软件开发人员的部署友好程度真的是非常高。当然 docker 之下众生平等,不过这种无环境依赖,windows 也可一键运行的分发方式确实让我内心有点想做点什么的冲动。

过程中我也看到一些优秀的项目,例如 halo , bbs-go , 虽然都是很强大的项目,但是并没有向 cloudreve 那样给我比较明显的触动,并没有把环境依赖减少到小白可以双击运行的程度(很大程度是采用了前后端分离后,使用了前端的服务端渲染,在生产环境中引入了 node 依赖)。 其中 sonic 这个博客项目我是比较感冒的(今年才看到),因为这个就是那种一键运行的站点,依赖极其少,也推荐使用 sqlit 作为服务器的数据库。也希望 GooseForum 未来也可以和其他前辈项目一样成为一个优秀的项目。

这里说一些我开发中的一些心得吧,

1 、缓存的使用

因为我的服务器是一个 2c2g 40g 硬盘的轻量服务器,所以我希望我的服务器可以在有限资源内带来更好的体验,这里有做 gzip 压缩的支持,以及通过中间件对一些静态资源设置浏览器缓存,减少服务器压力。 同时由于 gzip 对于服务 cpu 会有一定压力,所以 gzip 后的数据交由 sync.map 存储,以达到不需要重复压缩的目的(因为所有的前端资源都以 embed 的形式存在,并且占比并不大,这些 gzip 的数据放在内存中洒洒水~)

2 、前后端分离和服务端渲染的取舍

这里主要是我考虑到既要一键部署在生产环境减少依赖,又要希望未来可以有好的 seo ,目前采用的方案是如果是不需要登录的页面一定通过静态页面+go 模板渲染实现,需要登录的页面可以考虑直接使用前后端分离。这样在开发过程中既可以跟随前沿效率,也不背离原始的目标。前后端分离定义好接口写起来其实比模板要快不少,并且用 vue3+ts 的开发体验也不错。有类型提示开发的速度还是有一定保证。

3 、平衡下的开发依赖 数据查询效率 备份

平衡下的开发依赖

因为希望项目可以在任何环境下都可以直接交叉编译,同时也要保证可以一键运行,那么 sqlite 以及 gopure 的 sqlite 一定是必不可少的。没有 cgo 的影响,并且性能损失在可接受范围内。直接使用 gopure 版本的 sqlite 是一个不错的选择。同时一些队列也是默认使用 sqlite 的。有利于一键部署。

数据查询效率

目前效率都是还可以的,大家可以直接访问 GooseForum 看一下实际效果。 这里我是采用了 sqlite 的 wal 模式。这个模式在我几个压测场景下吞吐可以提高 3 倍左右(仅仅测的查询和插入同时进行场景,非完整的请求)。与之配合的就是程序的关闭需要监听好信号,做到关闭前合并 sqlite 的多个文件。如果不合并的话,可能有部分数据没有刷入进去,正常情况下不用担心,除非是 kill-9 或者断电。另外如果使用了 sqlite ,项目也做了定时备份的功能。这里后面单独讲

备份

这里既有文字数据的备份也有图片的备份(没错默认 GooseForum 的图片也是存入了一个 sqlite ,项目有两个 sqlite 一个是非文件的数据,一个只存了文件数据,目的是为了方便迁移) 。设置执行时间,每天定时会执行 sqlite 的备份指令把此刻的两个 sqlite 备份到指定位置,并且可以设置保留数量。目前我的服务器是每天 3 点执行备份操作,备份 7 天的。也是程序内的逻辑,不需要额外设置,只需要设置好配置文件即可。

这些也是我这次开发的一些小小心得。也希望为了可以把GooseForum迭代为一个简单,可靠,实用,小而美的开源小论坛。

gooseforum

评论列表