さて、私の問題について説明します。プラグインの管理アクションから、Discourse の本番インスタンスに一度に約 200 件の投稿をシードする必要があります。これらの投稿は、10 人の通常のユーザーのいずれかによって作成されます。プラグインアクションとして実装している理由は、この特定のインスタンスの利用者が、トレーニング用のモデレーターチームを育成したいと考えており、彼らのトレーニング用のテスト投稿と、必要に応じてさらにシードする機能が必要だったためです。
PostCreator.new に skip_validations: true を渡すことで、これを正常に動作させることができました。しかし、現在、作成された投稿の一部にもフラグを付けるという要件が発生しました。
これらの投稿の一部にフラグを付けるために PostActionCreator.create を使用していますが、現在は以下の URL で示されるレートリミッターに抵触してしまいます:
opts: {
is_warning: @is_warning,
taken_actions: PostAction.counts_for([@post].compact, @created_by)[@post&.id]
}
)
result.forbidden = true
result.add_error(I18n.t("invalid_access"))
return result
end
PostAction.limit_action!(@created_by, @post, @post_action_type_id)
# create meta topic / post if needed
if @message.present? && [:notify_moderators, :notify_user, :spam].include?(@post_action_name)
creator = create_message_creator
post = creator.create
if creator.errors.present?
result.add_errors_from(creator)
return result
end
@meta_post = post
当初、RateLimiter を無効化しようとしましたが、その結果、アクションがサーバープロセスをクラッシュさせるようになりました。おそらく、無効化を解除しようとした際に発生したのでしょう。その後、そもそもそのアプローチは適切ではなかったことに気づきました。
そこで質問ですが、任意のコードを実行する際にレートリミッターを回避するより良い方法はあるでしょうか?例えば、以下のようなものです:
RateLimiter.bypass do
# レートリミッターの影響を受けないコードを実行
end
それとも、PostActionCreator が行っていることの大部分をコピーし、問題のある行だけを除く必要があるのでしょうか?
ご助力いただければ幸いです!Discourse のコードをまだ吸収している最中ですので、これをより簡単にできる何かを見落としている可能性を認識しています!
「いいね!」 1
pfaffman
(Jay Pfaffman)
2020 年 1 月 16 日午後 5:44
2
おそらく、Rails コンソールでスクリプトを実行することになるでしょう。Available settings for global rate limits and throttling ? をご覧になりましたか?それらのレート制限を変更できるようです。
「いいね!」 2
この方向性はあまり望ましくありません。私がコンソールでスクリプトを実行してもらうのではなく、ユーザー自身が開始できるようにしたいからです。
「いいね!」 3
pfaffman
(Jay Pfaffman)
2020 年 1 月 16 日午後 6:43
4
レート制限の変更についてのリンクは確認しましたか?
Isambard
(Isambard)
2024 年 5 月 27 日午後 4:42
5
これを解決しましたか? YAMLファイルを変更するのは理想的ではありません。再構築が必要になるためです。Rails/Discourseに詳しくないので、コンソールで一時的に無効にする方法がわかりません。
pfaffman
(Jay Pfaffman)
2024 年 5 月 27 日午後 5:43
6
ユースケースは何ですか?レート制限が妨げとなっている問題は何ですか?
Isambard
(Isambard)
2024 年 5 月 27 日午後 5:56
7
API経由で再構築せずに、できるだけ速く60,000人のユーザーをインポートしようとしています。テストインストールでYAML経由でADMIN API制限を引き上げようとしましたが、うまくいかなかったようです。あるいは、何か間違ったことをしたのかもしれません。(コンテナでインポートを実行しているので、HTTPスロットリングは適用されないはずです)。
pfaffman
(Jay Pfaffman)
2024 年 5 月 27 日午後 6:09
8
これはあまり役に立ちませんが、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
Isambard
(Isambard)
2024 年 5 月 27 日午後 6:30
9
奇妙ですね。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}
pfaffman
(Jay Pfaffman)
2024 年 5 月 27 日午後 8:21
10
引用符の問題でしょうか?
SiteSettings.max_admin_api_reqs_per_key_per_minute を確認し、整数かどうか見てみてください。
「いいね!」 1
Isambard
(Isambard)
2024 年 5 月 27 日午後 8:27
11
default_current_user_provider.rb で(この値に言及しているように見えた唯一のファイルですが、次のような内容が含まれています):
limit = GlobalSetting.max_admin_api_reqs_per_minute.to_i
そのため、実際には変換されているようです。コード内で数値に置き換えてみました。
「いいね!」 1
Isambard
(Isambard)
2024 年 5 月 27 日午後 8:37
13
別の制限に関連していると思います。IPアドレスあたりの最大登録数制限に達していると思いますが、なぜそれに達した後、永続的にブロックされないのか理解できません。このスパム制限にバグがあるのでしょうか?
pfaffman
(Jay Pfaffman)
2024 年 5 月 27 日午後 8:54
14
もしそれらのユーザーがすべて同じIPアドレスを持っているなら、あなたの言う通りだと思います。解決策は、その設定を変更するか、127.0.0.x のようなダミーIPアドレスをユーザーに割り当てること(あるいは、もっと簡単にするためにIPv6を使用する?)だと思います。
「いいね!」 1
Isambard
(Isambard)
2024 年 5 月 27 日午後 10:47
15
リクエストの発信元(ホストコンピューター)を検出しているようですが、同じIPアドレスにTL2ユーザーを追加するか、IP制限を調整することで回避できます。
pfaffman
(Jay Pfaffman)
2024 年 5 月 27 日午後 10:55
17
だから、Railsでやることをお勧めします。おそらく1分あたり500件処理できるでしょう。
「いいね!」 1
Isambard
(Isambard)
2024 年 5 月 27 日午後 11:35
18
はい、試してみます。しかし、スクリプトをどのように実行するのか、どこにコピーすればよいのか、そして(CSVを適切な場所に配置したら)どのように実行するのかがよくわかりません。
pfaffman
(Jay Pfaffman)
2024 年 5 月 27 日午後 11:53
19
他については、他の「使い方」トピックを参照してください。ほとんどすべて同じように機能します。
「いいね!」 1
Isambard
(Isambard)
2024 年 5 月 29 日午前 8:39
20
スクリプトやRubyなどを理解しようとした労力と、予想されるパフォーマンスを考慮すると、別の方法を取り、SQLを使用してデータベースに直接書き込むことで、すべての制限を回避しました。これにより、1秒あたり数千件の挿入が可能になりました。
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