有办法让管理员暂时关闭 RateLimiter 以进行批量创建吗?

所以,这就是我的问题。我需要通过插件的管理员操作,每次为 Discourse 生产环境实例批量创建约 200 篇帖子。这些帖子将由 10 个普通用户中的某一个“创建”。之所以采用插件操作,是因为该实例的用户希望培训他们的 Moderators 团队,需要一些测试帖子供其练习,并且希望能够在需要时随时生成更多测试数据。

我最初通过向 PostCreator.new 传递 skip_validations: true 成功实现了这一功能,但现在需要部分创建的帖子也被标记(flag)。

我使用 PostActionCreator.create 来标记部分帖子,但现在遇到了速率限制器的问题,具体位置在这里:discourse/lib/post_action_creator.rb at ad7a13921f2af8c792530c84386b64911c8e7ea2 · discourse/discourse · GitHub

我最初尝试禁用 RateLimiter,但这导致我的操作最终使服务器进程崩溃,可能是在我试图重新启用它时发生的。随后我意识到,无论如何,这都不是一个好主意。

所以我的问题是,是否有更好的方法在执行任意代码时绕过速率限制器?例如,类似这样的方式:

RateLimiter.bypass do
# 运行不受速率限制器影响的代码
end

或者,我是否基本上需要复制 PostActionCreator 的大部分逻辑,但去掉那个有问题的行?

任何帮助都将不胜感激!我还在大量吸收 Discourse 的代码,所以我意识到自己可能忽略了一些能让这件事变得简单得多的方法!

1 个赞

我可能会在 Rails 控制台中运行一个脚本来处理。你看过这个吗:https://meta.discourse.org/t/global-rate-limits-and-throttling-in-discourse/78612?看起来你可以修改这些速率限制。

2 个赞

这并不是我想要的方向,因为我希望由用户来发起,而不是让他们依赖我在控制台中运行脚本。

3 个赞

你看了关于更改速率限制的链接吗?

你弄明白了吗?修改 yaml 文件并不理想,因为它需要重新构建。我对 rails/discourse 不够熟悉,无法弄清楚如何在控制台中暂时禁用它。

您的用例是什么?您试图解决的、受到速率限制阻碍的问题是什么?

尝试通过 API 尽快导入 60k 用户,而无需重建。我也在测试安装上尝试通过 YAML 提高 ADMIN API 限制,但似乎不起作用,但也许我做错了什么。(我正在容器上运行导入,因此不应应用 HTTP 限制)。

但这并没有太大帮助,但我会这样做:在 Rails 中创建用户,而不是通过 API。discourse/script/import_scripts/csv_importer.rb at main · discourse/discourse · GitHub 可以作为起点。

但你可以进入容器并编辑 /var/www/discourse/config/discourse.conf 并在此处设置这些变量,然后执行 sv restart unicorn(或者可能是 sv reload unicorn)。你可能需要执行类似 apt-get update; apt-get install -y vim 的操作来安装编辑器。

2 个赞

奇怪。当我查看 conf 文件时,新限制已设置。因此,YAML 更新有效:

max_admin_api_reqs_per_key_per_minute = '6000'

但它似乎不起作用。每分钟仍然有 60 的限制。当我将请求限制为每分钟 60 个时,大多数请求都能通过,但由于抖动,少数请求仍然触发了速率限制器:

{'success': True, 'active': True, 'message': 'Your account is activated and ready to use.', 'user_id': 3596}
{'success': False, 'message': ' New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member.', 'errors': {'ip_address': ['New registrations are not allowed from your IP address (maximum limit reached). Contact a staff member.']}, 'values': {'name': None, 'username': 'asdfd', 'email': 'user@domain.com'}, 'is_developer': False}
{'success': True, 'active': True, 'message': 'Your account is activated and ready to use.', 'user_id': 3597}

我想知道这是否是引号的问题?

您可以检查 SiteSettings.max_admin_api_reqs_per_key_per_minute 并查看它是否为整数。

1 个赞

in default_current_user_provider.rb(我找到的唯一引用此值的文件的内容是:

limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i

所以它确实会进行转换。我甚至尝试在代码中将其替换为一个数字。)

1 个赞

糟糕。我早就料到了。

1 个赞

我认为这与另一个限制有关:我认为它达到了 IP 地址的最大注册数限制,但不明白为什么达到此限制后不会永久阻止。这可能是此垃圾邮件限制中的一个错误?

如果那些用户都有相同的IP地址,那么我打赌你是对的。我认为解决方案是更改该设置或为人们提供虚假的IP地址,例如 127.0.0.x(或者使用IPv6使其更容易?)

1 个赞

我认为它正在检测请求的来源(主机计算机),但我可以通过在同一 IP 地址上添加 TL2 用户(或调整 IP 限制)来解决它。

user add API 速度太慢了。

这就是为什么我建议用rails来做。它大概每分钟能处理500个。

1 个赞

是的,我会尝试一下。但我不太清楚该如何运行脚本,应该把它复制到哪里,以及(一旦我把 CSV 文件放到正确的位置)如何执行它?

您可以查看其他“操作方法”主题以了解其他内容。它们大多都以相同的方式工作。

1 个赞

鉴于理解脚本和 Ruby 等的努力以及可能的性能,我选择了另一条路线,通过直接使用 SQL 写入数据库来绕过所有限制。这样,我每秒可以插入数千条记录。

有一个关于需要哪些表的帖子,现在已关闭,所以我在这里回复,我更改了以下表来插入用户:

user_avatars
user_emails
user_profiles
user_search_data
user_stats
users
1 个赞