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

**URL:** <https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825>\
**Category:** Development\
**Created:** [2020年一月16日 14:28 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825 "2020-01-16T14:28:38Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![jamesmarkcook](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jamesmarkcook/32/168563_2.png) [@jamesmarkcook](https://meta.discourse.org/u/jamesmarkcook)\
**Post date:** [2020年一月16日 14:28 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/1 "2020-01-16T14:28:38Z")

</div>

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

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

我使用 `PostActionCreator.create` 来标记部分帖子，但现在遇到了速率限制器的问题，具体位置在这里：[discourse/lib/post\_action\_creator.rb at ad7a13921f2af8c792530c84386b64911c8e7ea2 · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/ad7a13921f2af8c792530c84386b64911c8e7ea2/lib/post_action_creator.rb#L69)

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

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

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

```

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

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2020年一月16日 17:44 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/2 "2020-01-16T17:44:30Z")

</div>

我可能会在 Rails 控制台中运行一个脚本来处理。你看过这个吗：[https://meta.discourse.org/t/global-rate-limits-and-throttling-in-discourse/78612？看起来你可以修改这些速率限制。](https://meta.discourse.org/t/global-rate-limits-and-throttling-in-discourse/78612%EF%BC%9F%E7%9C%8B%E8%B5%B7%E6%9D%A5%E4%BD%A0%E5%8F%AF%E4%BB%A5%E4%BF%AE%E6%94%B9%E8%BF%99%E4%BA%9B%E9%80%9F%E7%8E%87%E9%99%90%E5%88%B6%E3%80%82)

---

<div class="post-metadata">

**Author:** ![jamesmarkcook](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/jamesmarkcook/32/168563_2.png) [@jamesmarkcook](https://meta.discourse.org/u/jamesmarkcook)\
**Post date:** [2020年一月16日 17:46 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/3 "2020-01-16T17:46:22Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2020年一月16日 18:43 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/4 "2020-01-16T18:43:04Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 16:42 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/5 "2024-05-27T16:42:37Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 17:43 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/6 "2024-05-27T17:43:26Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 17:56 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/7 "2024-05-27T17:56:54Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 18:09 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/8 "2024-05-27T18:09:27Z")

</div>

但这并没有太大帮助，但我会这样做：在 Rails 中创建用户，而不是通过 API。[discourse/script/import\_scripts/csv\_importer.rb at main · discourse/discourse · GitHub](https://github.com/discourse/discourse/blob/main/script/import_scripts/csv_importer.rb) 可以作为起点。

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 18:30 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/9 "2024-05-27T18:30:17Z")

</div>

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

`max_admin_api_reqs_per_key_per_minute = '6000'`

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

```plaintext
{'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}

```

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 20:21 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/10 "2024-05-27T20:21:42Z")

</div>

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

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 20:27 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/11 "2024-05-27T20:27:26Z")

</div>

in default\_current\_user\_provider.rb（我找到的唯一引用此值的文件的内容是：

`limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i`

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 20:30 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/12 "2024-05-27T20:30:05Z")

</div>

糟糕。我早就料到了。

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 20:37 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/13 "2024-05-27T20:37:50Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 20:54 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/14 "2024-05-27T20:54:56Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 22:47 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/15 "2024-05-27T22:47:25Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 22:47 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/16 "2024-05-27T22:47:54Z")

</div>

user add API 速度太慢了。

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 22:55 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/17 "2024-05-27T22:55:29Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月27日 23:35 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/18 "2024-05-27T23:35:55Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)\
**Post date:** [2024年五月27日 23:53 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/19 "2024-05-27T23:53:09Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![Isambard](https://avatars.discourse-cdn.com/v4/letter/i/858c86/32.png) [@Isambard](https://meta.discourse.org/u/Isambard)\
**Post date:** [2024年五月29日 08:39 UTC](https://meta.discourse.org/t/any-way-to-turn-off-ratelimiter-temporarily-for-bulk-creation-by-admin/138825/20 "2024-05-29T08:39:55Z")

</div>

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

> [@How to create a new user in pure sql](https://meta.discourse.org/t/how-to-create-a-new-user-in-pure-sql/136525?u=isambard):
>
> 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…

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

```plaintext
user_avatars
user_emails
user_profiles
user_search_data
user_stats
users

```
