所以,这就是我的问题。我需要通过插件的管理员操作,每次为 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 个赞
pfaffman
(Jay Pfaffman)
2020 年1 月 16 日 17:44
2
2 个赞
这并不是我想要的方向,因为我希望由用户来发起,而不是让他们依赖我在控制台中运行脚本。
3 个赞
Isambard
(Isambard)
2024 年5 月 27 日 16:42
5
你弄明白了吗?修改 yaml 文件并不理想,因为它需要重新构建。我对 rails/discourse 不够熟悉,无法弄清楚如何在控制台中暂时禁用它。
pfaffman
(Jay Pfaffman)
2024 年5 月 27 日 17:43
6
您的用例是什么?您试图解决的、受到速率限制阻碍的问题是什么?
Isambard
(Isambard)
2024 年5 月 27 日 17:56
7
尝试通过 API 尽快导入 60k 用户,而无需重建。我也在测试安装上尝试通过 YAML 提高 ADMIN API 限制,但似乎不起作用,但也许我做错了什么。(我正在容器上运行导入,因此不应应用 HTTP 限制)。
pfaffman
(Jay Pfaffman)
2024 年5 月 27 日 18:09
8
但这并没有太大帮助,但我会这样做:在 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 个赞
Isambard
(Isambard)
2024 年5 月 27 日 18:30
9
奇怪。当我查看 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}
pfaffman
(Jay Pfaffman)
2024 年5 月 27 日 20:21
10
我想知道这是否是引号的问题?
您可以检查 SiteSettings.max_admin_api_reqs_per_key_per_minute 并查看它是否为整数。
1 个赞
Isambard
(Isambard)
2024 年5 月 27 日 20:27
11
in default_current_user_provider.rb(我找到的唯一引用此值的文件的内容是:
limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i
所以它确实会进行转换。我甚至尝试在代码中将其替换为一个数字。)
1 个赞
Isambard
(Isambard)
2024 年5 月 27 日 20:37
13
我认为这与另一个限制有关:我认为它达到了 IP 地址的最大注册数限制,但不明白为什么达到此限制后不会永久阻止。这可能是此垃圾邮件限制中的一个错误?
pfaffman
(Jay Pfaffman)
2024 年5 月 27 日 20:54
14
如果那些用户都有相同的IP地址,那么我打赌你是对的。我认为解决方案是更改该设置或为人们提供虚假的IP地址,例如 127.0.0.x(或者使用IPv6使其更容易?)
1 个赞
Isambard
(Isambard)
2024 年5 月 27 日 22:47
15
我认为它正在检测请求的来源(主机计算机),但我可以通过在同一 IP 地址上添加 TL2 用户(或调整 IP 限制)来解决它。
pfaffman
(Jay Pfaffman)
2024 年5 月 27 日 22:55
17
这就是为什么我建议用rails来做。它大概每分钟能处理500个。
1 个赞
Isambard
(Isambard)
2024 年5 月 27 日 23:35
18
是的,我会尝试一下。但我不太清楚该如何运行脚本,应该把它复制到哪里,以及(一旦我把 CSV 文件放到正确的位置)如何执行它?
pfaffman
(Jay Pfaffman)
2024 年5 月 27 日 23:53
19
您可以查看其他“操作方法”主题以了解其他内容。它们大多都以相同的方式工作。
1 个赞
Isambard
(Isambard)
2024 年5 月 29 日 08:39
20
鉴于理解脚本和 Ruby 等的努力以及可能的性能,我选择了另一条路线,通过直接使用 SQL 写入数据库来绕过所有限制。这样,我每秒可以插入数千条记录。
What are the minimum required tables that require rows to be added to create user, so is then visible active in discourse
Ive just inserted one row into user_emails
insert into user_emails (user_id, email, "primary", created_at, updated_at) values (2,'user@email.com',true, now(), now());
Unsuprisingly has not appeared in the gui, but what are the minimum steps, do I need to add to some more tables, or is there some restart I need to do.
Now I expect someone will say this is not the right way…
有一个关于需要哪些表的帖子,现在已关闭,所以我在这里回复,我更改了以下表来插入用户:
user_avatars
user_emails
user_profiles
user_search_data
user_stats
users
1 个赞