meriksson
(Martin Eriksson)
2020 年7 月 3 日 12:01
1
我们偶尔会在论坛顶部收到这样的通知:
由于负载极高,当前页面将暂时以未登录用户的视角向所有人显示。
关于这一点,我有几点观察和疑问:
首先,服务器似乎并未处于极高负载状态。上次我看到该警告时,服务器监控显示 CPU 负载峰值仅为 24%,内存使用率略高于 50% 等。据我所知,用户并未察觉到明显的性能下降。因此我想知道:触发该警告的阈值是多少?其设定是否合理?
其次,也是对我而言更为重要的是,我所运营的论坛是完全私密的。未登录用户除了登录页面外,无法查看任何内容。因此,该通知并不准确,即页面并非“以未登录用户的视角显示”,因为未登录用户根本无法看到该页面。这曾多次引发误解,让人误以为我们私密论坛的帖子突然对未授权用户开放了。我第一次看到该通知时也曾十分担忧,并且不时有用户就此向我提问。
是否可以考虑重写该警告?或者针对私密论坛禁用或更改该通知?
是否可以为特定论坛禁用此通知?
3 个赞
neounix
(Dark Matter)
2020 年7 月 3 日 12:50
2
你好 @meriksson
供参考。此通知是通过 Cookie 触发的:
if ($.cookie("dosp") === "1") {
$.removeCookie("dosp", { path: "/" });
notices.push(
Notice.create({
text: I18n.t("forced_anonymous"),
id: "forced-anonymous"
})
);
}
参考:
import getURL from "discourse-common/lib/get-url";
import I18n from "I18n";
import { bind, cancel } from "@ember/runloop";
import Component from "@ember/component";
import LogsNotice from "discourse/services/logs-notice";
import EmberObject, { computed } from "@ember/object";
const _pluginNotices = [];
export function addGlobalNotice(text, id, options = {}) {
_pluginNotices.push(Notice.create({ text, id, options }));
}
const GLOBAL_NOTICE_DISMISSED_PROMPT_KEY = "dismissed-global-notice-v2";
const Notice = EmberObject.extend({
text: null,
id: null,
options: null,
This file has been truncated. show original
在 GitHub 上搜索此 Cookie 得到:
其中 force_anon 位于此处:
def initialize(app, settings = {})
@app = app
end
def call(env)
helper = Helper.new(env)
force_anon = false
if helper.should_force_anonymous?
force_anon = env["DISCOURSE_FORCE_ANON"] = true
helper.force_anonymous!
end
参考:
另请参阅:
# frozen_string_literal: true
require_dependency "mobile_detection"
require_dependency "crawler_detection"
require_dependency "guardian"
module Middleware
class AnonymousCache
def self.cache_key_segments
@@cache_key_segments ||= {
m: 'key_is_mobile?',
c: 'key_is_crawler?',
b: 'key_has_brotli?',
t: 'key_cache_theme_ids',
ca: 'key_compress_anon'
}
end
# Compile a string builder method that will be called to create
This file has been truncated. show original
MIN_TIME_TO_CHECK = 0.05
ADP = "action_dispatch.request.parameters"
def should_force_anonymous?
if (queue_time = @env['REQUEST_QUEUE_SECONDS']) && get?
if queue_time > GlobalSetting.force_anonymous_min_queue_seconds
return check_logged_in_rate_limit!
elsif queue_time >= MIN_TIME_TO_CHECK
if !logged_in_anon_limiter.can_perform?
return check_logged_in_rate_limit!
end
end
end
false
end
4 个赞
@sam 说得很好,在完全私密的网站上,这段文案确实会造成混淆……甚至可能是不正确的。
4 个赞
sam
(Sam Saffron)
2020 年7 月 6 日 08:53
4
当 NGINX 将请求转发给 Unicorn(应用服务器)并检测到显著延迟时,会出现此警告。
例如(夸张情况):
NGINX 说:嘿,这里有一个用户在下午 1 点提交的请求。
过了 1 个小时。
应用服务器收到请求:天哪,我花了 1 个小时才收到请求……我肯定过载了。
您可以通过以下两个设置来控制阈值:
DISCOURSE_FORCE_ANONYMOUS_MIN_QUEUE_SECONDS 和 DISCOURSE_FORCE_ANONYMOUS_MIN_PER_10_SECONDS
最重要的是,如果您的服务器有充足的额外容量,请通过增加 UNICORN_WORKERS 来添加更多 Unicorn 进程。
如果某个站点要求登录,那么我们或许应该将警告改为更严重的提示(例如蓝屏,表示您已被限流)。
这是我第一次听说有要求登录的站点触达此限流阈值。我们同意应在此方面做得更好。
4 个赞
sam
(Sam Saffron)
2020 年11 月 4 日 03:33
7
我打算再等一条独立的投诉。
在极端负载下,对于“需要登录”的网站,我们目前能做的最好的事情就是显示一个蓝色屏幕,提示“网站负载过高,请稍后重试”。我想再等一等,看看是否会有另一条投诉,然后再决定是否添加此功能。
3 个赞
sam:
我再等一个独立的投诉。
这发生在我经常访问的一个非常小型的私有 Discourse 社区上。它先是返回了 502 网关错误(Nginx),随后完全无法加载。最终页面加载成功了,但显示了我刚才提到的横幅消息。
1 个赞
我认为现在添加这个功能是安全的。如果某个需要登录的网站已经过载,增加更多用户并不会改善他们的体验。
3 个赞