Discourse的优雅降级机制

结城 建站 3 次阅读 509 字 发布于 7 天前 预计阅读时间: 2 分钟


最近玩Discours,因为服务器性能比较差,经常会出现下面的提示。

由于负载过大,暂时向所有人显示未登录用户可以看到的内容

正好前段时间学习了一些分布式高并发架构,对这种行为有一点自己的认知。这就是降级保证可用性的典型例子。

查了查相关的资料,官方的描述是这样。

当服务器的负载过高时,为了防止整个网站彻底崩溃,Discourse 会自动触发降级策略。

此时,系统会暂停处理消耗资源较大的动态请求,例如验证登录状态、加载个性化时间线、发帖回复等,降级转而向所有人展示消耗极小的静态缓存页面。

说直白点就是,服务器罢工了,你登录与否,服务器都给你展示静态内容。

当一个已登录用户访问论坛时,服务器需要为他进行大量的​个性化定制

  • 检查该用户的 Session/Token 是否有效,读取其角色权限。
  • 查询数据库:哪些帖子是他读过的?哪些是新发的?他有没有被私信?他关注的话题有没有更新?

相反,当一个未登录用户访问时,所有人看到的界面是一模一样的。未登录用户看到的是标准的公共页面,类似于静态缓存

Discourse 的后端主要基于 Ruby,并在其前面挡了一层高性能的 Nginx。

系统内部有一个定时监控器,会频繁检查当前服务器的平均负载或响应延迟。当负载超过预设的阈值,系统会立刻启动“熔断”保护,暂时关闭消耗资源的“动态认证路由”。

无论传入的请求是否带有登录 Cookie,系统一律对外宣称卡了,大家凑合看吧。