突然想做一个自建评论系统

感慨 打开了自己的博客,发现上一次写博客都是去年6月份了,居然都过去一年了。感慨之余,突然想写点什么,就写写刚刚想到的自建评论系统吧。 起因 之前博客的评论系统是用的disqus,不过总是有点问题,每一篇文章都可以看到所有的评论。然后又折腾了一下,换了现在的这个gitalk。大概看了一下,做得还是挺巧妙的,用github的issue在存储评论,然后用gitalk的评论来显示评论。这样省下了自建服务器。不过搜索了一下,没有找到自建评论系统的开源项目,而使用像disqus或者gitalk这种还是会有一些限制。感觉开发一个自建评论系统还是可以多一种选择。 设计 框架选择 设计的话会考虑前后端分离的方式,后端打算使用FastAPI+TortoiseORM,然后前端打算使用React,或者考虑只提供一个SDK,本来我前端也不擅长,估计弄出来也很丑。 数据库设计 erDiagram project { int id varchar name } project ||--o{ post : contains post { int id varchar title } post ||--o{ comment : contains comment { int id varchar content } user ||--o{ comment : submit user { int id varchar name varchar email } 用户 考虑接入Github和Google的oauth2,然后把用户的信息存储在数据库中。 实现 仓库地址 https://github.com/long2ice/talkit 暂时先创建一个仓库地址吧,后面有时间了再看。

June 16, 2022

FastAPI-Admin,开箱即用的后台管理面板

简介 FastAPI-Admin 是一个基于 FastAPI 与 TortoiseORM 的开箱即用的后台管理面板,UI 框架使用了tabler,仅需要少量配置,即可快速搭建一个 CURD 管理台,类似于 Django Admin。 项目地址:https://github.com/fastapi-admin/fastapi-admin 线上 DEMO:https://fastapi-admin.long2ice.io/admin/login 用户名:admin 密码:123456 预览 特性 开箱即用,配置丰富。 集成登录、验证码、权限控制。 易于扩展,自定义。 内置多种组件,功能丰富的 CRUD 界面。 其它更多特性。 开发 FastAPI-Admin 基于 FastAPI 与 TortoiseORM,使用 jinja2 渲染前端界面。最早期的版本是使用前后端分离,通过 rest 协议进行通信,前端框架与查询协议直接来源于另一个开源项目,后来由于不便于扩展、不熟悉等原因放弃,并基于 tabler ui 开发了现在的版本。实现过程中参考了 Django Admin,通过后端进行资源配置,渲染菜单,界面等。并且实现了多种展示组件、编辑组件、筛选组件等。 除此之外,Pro 版本还实现了基于资源读写的权限控制,包括管理员、角色、权限三种对象。 文档 文档地址:https://fastapi-admin-docs.long2ice.io 目前英文文档更全面一些,中文文档还待编写中。

June 25, 2021

开源项目计划

有一些计划中的,感兴趣,想做的一些开源项目,在此记录一下,以免遗忘。 trader 项目地址:https://github.com/long2ice/trader 用 Go 开发的一个加密货币自动交易框架,使用自定义策略进行买卖,最终从中获利,项目优先级略高,基本框架已经搭建好,后续准备支持更多的交易所以及合约。 rearq 项目地址:https://github.com/long2ice/rearq 一个 asyncio 的分布式异步任务执行框架,Fork 自另外一个项目,做了一些修改和提升,最终想做成类似于 celery 或者 airflow 那样,带有 api 与 web 界面的 asyncio 异步任务框架。 fastapi-admin 项目地址:https://github.com/long2ice/fastapi-admin 打算用react-admin作为前端重写一个版本,感觉这个似乎更完善,要是早知道的话就好了。 dataetl 项目地址:https://github.com/long2ice/dataetl 打算将synch翻译成 Go 语言实现,顺便学习 Go 语言,优先级不那么高,因为有了 trader 这个项目。 MiraiPy 项目地址:https://github.com/long2ice/MiraiPy 原本打算将MiraiGo这个项目翻译成 Python 实现,可惜没时间暂时搁置了。 aiomysqlreplication 项目地址:https://github.com/long2ice/aiomysqlreplication 原本想实现一个 asyncio 下的mysql-replication,也是没有时间与契机,暂时搁置。 其它 想实现一个 Go 下面的 ORM,因为感觉现在的一些 ORM 比如gorm太难用了,不过 Go 语言限制比较多,不如 Python 灵活,估计需要进一步调研以及技术沉淀。 tortoise-orm性能优化,可能需要学习一下 Cython,或者重写一个性能更高的 asyncio MySQL 驱动,类似asyncpg。

January 29, 2021

一个由于MySQL Binlog同步问题导致的bug

最近在项目中遇到了一个很奇怪的 bug,从发现到解决一共持续了一周左右的时间。 bug 现象:插入一条语句后在执行 select,会报查询不到记录,但是该 bug 只偶尔复现,频率很低。 刚开始的时候尝试了很多种方法,猜测是不是 ORM 框架问题,或者是 MySQL 版本问题,但是经过测试都不会复现。并且由于出现的概率很低,很不好 debug。 在问题的代码周围打了很多 log,也还是没有找到问题所在。 就在有一次我上厕所的时候灵机一动,联想到我们用的是阿里云的读写分离数据库,猜测是否是因为 MySQL 同步延迟导致的? 查询了阿里云文档后,地址为https://help.aliyun.com/knowledge_detail/41767.html?spm=5176.11065259.1996646101.searchclickresult.3d3c31d8pXWGBr,最终确定正是这个问题。 解决方案有两种,一种是在同一事务中支持先写入再读取操作,另一种是使用单实例,放弃读写分离。

October 26, 2020

面试要点记录

Python GIL(Global Interpreter Lock) 全局解释器锁,CPython 实现时引入的概念,为了解决多线程数据完整性和同步问题。GIL 是一个防止解释器多线程并发执行机器码的一个全局互斥锁。其存在主要是因为在代码执行过程中,CPython 的内存管理不是线程安全的。 进程、线程、协程 进程:进程是资源分配的最小单位,每个进程拥有独立的代码区,堆,数据区。 线程:线程是 CPU 调度的最小单位,一个进程至少拥有一个线程,多个线程共享进程的资源。 协程:协程是基于事件循环的单独的子程序,协程可以被中断并在适当的时候重新执行。 MySQL 存储引擎 innodb:支持事务,外键,行级锁,聚蔟索引和辅助索引。 myisam:不支持事务,外键,支持表级锁,不支持聚蔟索引,主键索引和辅助索引结构一样。 查询计划 主要查看 key、extra 等信息,key 表示查询用到的索引,extra 包含多种信息。 using index:查询使用了索引。 using where:MySQL 将在存储引擎检索行后再进行过滤。 using temporary:使用了 join 但是使用了其他表的字段作为查询条件。 using filesort:排序没有走索引。 索引 ACID 原子性:一个事务要么全部提交成功,要么全部失败,不能只执行一部分操作。 一致性:事务前后数据的完整性必须保持一致。 隔离性:多个事务之间相互隔离。 持久性:事务一旦被提交,就会永久保存在磁盘中。 隔离级别 读未提交:可读取其它事务为提交的数据,会产生脏读 读已提交:可读取其它事务已提交的数据,会产生重复读取返回不同结果的情况 可重复读:多次重复读取会得到相同的结果,但是会产生幻读 串行化:对所有 select 强制加共享锁,使之不相互冲突,可能产生大量的超时现象和锁竞争 三大 log binlog 记录 sql 语句,通过追加日志的形式写入,主要使用场景为主从复制与数据恢复。 有 STATMENT,ROW,MIXED 三种格式,STATMENT 记录修改数据的 SQL,减少日志量,某些情况会导致主从数据不一致;ROW 记录变动的数据,可能会产生大量的日志;MIXED 优先使用 STATMENT,STATMENT 不支持的使用 ROW。 redolog 记录事务对哪些数据进行了修改,实现一致性,先写 redolog buffer,再写磁盘文件。 undolog 记录数据的逻辑变化,比如 INSERT 的时候记录一条 DELETE,UPDATE 的时候记录一条相反的 undolog,在发生错误时通过 undolog 回滚到事务之前的状态。 ...

October 26, 2020