之前评课社区的搜索功能依赖 SQL LIKE,性能比较差,每次选课高峰期,服务器都会被打挂。例如 2024 年 1 月的春季学期选课高峰期,单日动态页面访问量高达 45 万次,尽管提前升级到了 16 核 CPU,但选课刚开始的那一个小时还是被挤爆了。
而且 SQL LIKE 不会根据搜索结果的相关度排序。在搜索点评内容的时候,如果有多个搜索关键词,之前的排序是按照发表时间从新到旧,而没有考虑点评中包含了几个关键词。
非常感谢 taoky 的贡献,使用 jieba 分词和 MySQL 全文索引取代 SQL LIKE,搜索性能提升了一倍以上。同时全文索引还解决了点评搜索结果按相关度排序的问题,现在多个检索关键词同时出现的排序会更靠前。2 月的 PR 终于合入了。
非常感谢 taoky 的贡献,把富文本编辑器升级到 CKEditor 5,总算是有了一个看起来比较现代的富文本编辑器。这个新的富文本编辑器也支持移动端,终于解决了移动端没有富文本编辑器的问题。这是评课社区最近一年来最大的更新了。
https://github.com/USTC-iCourse/ustc-course/pull/42
也感谢 cuihao 帮忙测试。
评课社区之前是运行在 1 核 4G 的小水管服务器上(2022 年 3 月之前甚至只有 1 核 2G,后来发现 OOM,才升到了 4G)。
今天(北京时间 2022-07-17)上午 11:00 左右,服务器开始响应缓慢。11:10 另一位管理员发现了这个问题,但没有联系到我;11:37 另一位管理员转发给我的消息我也没有看到。11:40 正在开会中的我偶然访问了下评课社区首页(是的,我还没有部署监控报警),发现了这个问题。看到服务器上数据库进程(mariadbd)几乎占满 100% CPU,一开始以为是受到攻击,但很快发现都是正常请求,于是对服务器进行了扩容,首先扩容到 2 核 4G,但 CPU 还是 100%,访问仍然很慢,再次扩容到 4 核 8G,CPU 仍然是 100%,但是访问变快了很多,大约 12:00 服务恢复正常。
下图是今天(2022-07-18)每小时的 PV(Page View,访问页面的次数,不含访问静态文件和用户图片、头像等)。峰值的 12:00~13:00,共处理 41K 次页面访问,几乎相当于平时半天的访问量,是以往流量峰值的 5 倍左右。不过流量的洪峰很快就过去了,下午 14:00 后,由于访问量减少,服务器的 CPU 负载降低到了 50% 左右。今天总的 PV 达到了 238K,是平时的 2 倍多。
下图是昨天(2022-07-17)每小时的 PV,昨天全天 PV 103K,前几天都是 100K~110K 左右。
原因是今天 12:00 选课开始……
后来分析数据库负载高的原因,发现主要是由于【搜索】功能。目前搜索功能非常原始,用的是数据库模糊匹配的方法,不仅执行效率低,也经常有排序不够合理的情况(例如用多个关键词搜索,排序是随机的,其实应该是同时包含所有关键词的排在前面)。未来我们将考虑用 ElasticSearch 做个比较专业的搜索,这样一方面可以提升搜索排序的精准度,另一方面也可以降低服务器的负载。
评课社区近期新增以下4个保护用户隐私的功能。我们将在本公告中具体介绍这个4个功能,以及预期的实现效果。由于此次新增功能涉及改动的地方很多,如果发现任何地方与我们预期的效果有偏差,或认为我们的某些改动不合理,或有更好的建议,欢迎邮件联系我们(service@icourse.club)。谢谢!
匿名发布点评
发布点评仅登录学生用户可见
用户可隐藏/取消隐藏自己的点评
个人主页可设置为仅自己可见
匿名规则:匿名发表的点评将不会显示作者的用户名和头像,而会显示“匿名用户”、默认头像。
个人主页:用户可以在自己的个人主页看到自己的匿名点评,并标注“匿名”label,且点评总数为所有点评;其他用户不可以在个人主页中看到匿名点评,且点评总数显示为非匿名点评的数量。
搜索功能:匿名点评搜索用户名不可以被搜到,但用其他关键词(课程名、点评内容等)可以搜到匿名点评
课程评分:匿名点评的评分仍然会反映在课程评分中,仍然会计入课程的总点评数
排行榜:匿名点评参与点评排行榜(点赞最多的点评、最长的点评),作者为匿名用户。匿名点评不参与用户排行榜(贡献最多的用户),及不计入排行榜中的用户贡献
通知系统和关注页面:被关注的用户发表匿名点评,关注者不会收到通知,也不会出现在关注页面。被关注的课程,有其他用户发布匿名点评,关注者会收到通知,会出现在关注页面,但显示的是匿名用户发表了点评。
首页更新:把之前发布的点评改成匿名发表后,不会出现在首页。只有点评内容或者评分发生改变才会出现在首页。
教师用户:教师用户发表匿名点评,仍然会被标注“教师点评”,但不会显示用户名和头像。如果教师用户点评的是自己的课程,只会被标注“教师点评”,而不是“本课程教师”(非匿名情况下会精确到“本课程教师”)。
可见规则:选择“仅登录学生用户可见”选项发布点评后,未登录用户、教师用户将无法看到该点评。学生用户是按照注册邮箱后缀为@mail.ustc.edu.cn 来判断的。
课程页面:该点评会被标注“仅登录学生可见”的label,所有学生用户可见。
个人主页:登录学生用户可以在其他用户个人主页中看到该点评,标注“仅登录学生可见”的label,且点评总数为所有点评;未登录用户和教师用户看不到该点评,且点评总数显示为公开的点评数量。
搜索功能:未登录用户和教师用户不能搜到仅登录学生可见的点评,已登录的可以搜到。
课程评分:该点评评分仍然会反映在课程评分中、仍然会计入课程的总点评数
排行榜:由于排行榜是公开的,该点评将不参与点评排行榜(点赞最多的点评、最长的点评),该点评会计入用户贡献排行榜(贡献最多的用户)。
如果由于外部压力,你不得不“删除”自己的点评,那么你可以考虑隐藏自己的点评(等毕业之后再取消隐藏),等有时间了修改点评内容再发布。
用户可以自己隐藏自己的点评,用户隐藏的点评仅对作者本人可见,其他人、包括管理员都不可见。
被隐藏的点评,会出现在个人主页和课程页面,但仅作者本人可见,并且带有“您已隐藏此点评,点评内容仅对您可见。”的提示。
被隐藏点评类似于未发表的点评、处于草稿箱中的点评,不会参与课程评分、不会计入课程总点评数、不计入用户总点评数、不在排行榜中显示、不在首页显示、不在搜索结果中显示
用户可以在任何时候取消隐藏自己的点评,类似于重新发布点评,但不会出现在首页。
用户可以在账号设置中选择个人主页的权限,可以选择部分隐藏和全部隐藏。
隐藏关注的人、关注的课程、学过的课程:只保留用户基本信息和点评列表
彻底隐藏个人主页:个人主页直接显示 “此用户的个人主页未公开”
希望以上功能能够更好地保护学生用户的隐私,让同学们能更放心地撰写课程点评、分享课程信息。
jenny42 撰写了一篇博客,分享了评课社区背后的故事。为什么她会在物理学院赵瑾老师的《新生“科学与社会”研讨课》上做了 USTC 评课社区网站?开发团队是如何组建的?网站开发过程中遇到了哪些困难?正式发布后又面临哪些挑战?为啥7年过后网站没有倒闭,反而开始增加新功能?这篇博客将回答以上所有问题。
博客链接:USTC 评课社区背后的故事
知乎链接:USTC 评课社区背后的故事
关于2015年前后的故事,主要参考了她当时新生研讨课的一些记录。
选题报告 Report,选题报告 Slides,发表于 2015年3月19日
中期报告 Slides,发表于 2015年4月26日
结题报告 Report,结题报告 Slides,发表于 2015年5月30日