管理者による一括作成時にRateLimiterを一時的に無効にする方法はありませんか?

さて、私の問題について説明します。プラグインの管理アクションから、Discourse の本番インスタンスに一度に約 200 件の投稿をシードする必要があります。これらの投稿は、10 人の通常のユーザーのいずれかによって作成されます。プラグインアクションとして実装している理由は、この特定のインスタンスの利用者が、トレーニング用のモデレーターチームを育成したいと考えており、彼らのトレーニング用のテスト投稿と、必要に応じてさらにシードする機能が必要だったためです。

PostCreator.newskip_validations: true を渡すことで、これを正常に動作させることができました。しかし、現在、作成された投稿の一部にもフラグを付けるという要件が発生しました。

これらの投稿の一部にフラグを付けるために PostActionCreator.create を使用していますが、現在は以下の URL で示されるレートリミッターに抵触してしまいます:

当初、RateLimiter を無効化しようとしましたが、その結果、アクションがサーバープロセスをクラッシュさせるようになりました。おそらく、無効化を解除しようとした際に発生したのでしょう。その後、そもそもそのアプローチは適切ではなかったことに気づきました。

そこで質問ですが、任意のコードを実行する際にレートリミッターを回避するより良い方法はあるでしょうか?例えば、以下のようなものです:

RateLimiter.bypass do
# レートリミッターの影響を受けないコードを実行
end

それとも、PostActionCreator が行っていることの大部分をコピーし、問題のある行だけを除く必要があるのでしょうか?

ご助力いただければ幸いです!Discourse のコードをまだ吸収している最中ですので、これをより簡単にできる何かを見落としている可能性を認識しています!

「いいね!」 1

おそらく、Rails コンソールでスクリプトを実行することになるでしょう。Available settings for global rate limits and throttling? をご覧になりましたか?それらのレート制限を変更できるようです。

「いいね!」 2

この方向性はあまり望ましくありません。私がコンソールでスクリプトを実行してもらうのではなく、ユーザー自身が開始できるようにしたいからです。

「いいね!」 3

レート制限の変更についてのリンクは確認しましたか?

これを解決しましたか? YAMLファイルを変更するのは理想的ではありません。再構築が必要になるためです。Rails/Discourseに詳しくないので、コンソールで一時的に無効にする方法がわかりません。

ユースケースは何ですか?レート制限が妨げとなっている問題は何ですか?

API経由で再構築せずに、できるだけ速く60,000人のユーザーをインポートしようとしています。テストインストールでYAML経由でADMIN API制限を引き上げようとしましたが、うまくいかなかったようです。あるいは、何か間違ったことをしたのかもしれません。(コンテナでインポートを実行しているので、HTTPスロットリングは適用されないはずです)。

これはあまり役に立ちませんが、API経由ではなくRailsでユーザーを作成します。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'

しかし、機能していないようです。依然として 1 分あたり 60 件の制限があります。1 分あたり 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

default_current_user_provider.rb で(この値に言及しているように見えた唯一のファイルですが、次のような内容が含まれています):

limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i

そのため、実際には変換されているようです。コード内で数値に置き換えてみました。

「いいね!」 1

しまった。やはりそうだったか。

「いいね!」 1

別の制限に関連していると思います。IPアドレスあたりの最大登録数制限に達していると思いますが、なぜそれに達した後、永続的にブロックされないのか理解できません。このスパム制限にバグがあるのでしょうか?

もしそれらのユーザーがすべて同じIPアドレスを持っているなら、あなたの言う通りだと思います。解決策は、その設定を変更するか、127.0.0.x のようなダミーIPアドレスをユーザーに割り当てること(あるいは、もっと簡単にするためにIPv6を使用する?)だと思います。

「いいね!」 1

リクエストの発信元(ホストコンピューター)を検出しているようですが、同じIPアドレスにTL2ユーザーを追加するか、IP制限を調整することで回避できます。

ユーザー追加APIは非常に遅いですが。

だから、Railsでやることをお勧めします。おそらく1分あたり500件処理できるでしょう。

「いいね!」 1

はい、試してみます。しかし、スクリプトをどのように実行するのか、どこにコピーすればよいのか、そして(CSVを適切な場所に配置したら)どのように実行するのかがよくわかりません。

他については、他の「使い方」トピックを参照してください。ほとんどすべて同じように機能します。

「いいね!」 1

スクリプトやRubyなどを理解しようとした労力と、予想されるパフォーマンスを考慮すると、別の方法を取り、SQLを使用してデータベースに直接書き込むことで、すべての制限を回避しました。これにより、1秒あたり数千件の挿入が可能になりました。

必要なテーブルについてのトピックがありましたが、現在は閉じられているため、ここにユーザーを挿入するために変更したテーブルを記載します。

user_avatars
user_emails
user_profiles
user_search_data
user_stats
users
「いいね!」 1