大量のデータをインポートする際にレート制限を回避するにはどうすればよいですか?

トピックと投稿を自動作成しようとしていますが、レート制限に常に引っかかってしまいます。

最初にAPIで試しました。スクリプトはすぐに429エラーに達しました。管理権限でレート制限を調整しようとしましたが(スクリーンショット参照)、正しいアプローチが何なのか、あるいはこれが無駄な試みなのか不明です。

次に、コンテナ内からrails r <script>を使用してRubyスクリプトを試しました。しかし、ここでもAn error occurred RateLimiter::LimitExceededが見られます。Rubyの方法がレート制限の対象となるのはなぜでしょうか?

いずれにしても、これを回避する方法はありますか?バルクでデータをインポートする正しい方法は? SQLを直接使用することも考えましたが、アイテムを作成する際にデータベースのフィールドを欠落させる心配をしたくないため、より高レベルなAPIを好みます。

よろしくお願いします。

どのようなものでしょうか?

API ではなく、Rails を使用してデータをインポートする必要があります。

インポート スクリプトを確認することもできますが、もっと簡単なものが必要になるかもしれません。

def add_all()
  limit = 2000
  translations = Dir["/shared/translations/vagrant-data/translations/*.txt"]
  ps = Dir["/shared/translations/vagrant-data/paragraphs/*.txt"]

  # RateLimiter.new.disable_rate_limits!

  translations.each_with_index do |t,i|
    p = ps[i]

    tr_text = File.read(t)
    p_text = File.read(p)
   

    description = "#{p_text}\n\nTranslated as:\n\n#{tr_text}"
    title = " the booki (paragraph ##{i+1})"
    if (i < limit)
      begin
        puts "Adding topic #{tr_text}"
        topic = Topic.create!( title: title, category_id: 5, user_id: 3 )
        Post.create!( topic_id: topic.id, raw: description, user_id: 3, skip_validation: true )
      rescue Exception => e
        puts "An error occurred #{e}"
      end
    end
  end
end

add_all()

それはレート制限エラーを発生させますか? 問題なく動作すると思いますが。

はい、前の投稿をご覧ください。そのエラーでrescueブロックに入ります。

「いいね!」 1

サーバーが異常な状態にあるのではないかと疑問に思っています。スクリーンショットのレート制限をゼロ、あるいはマイナス1に設定して、いじくり回していました。今では、どこでもこれらのレート制限エラーが発生しています。しかし、奇妙なことに、一部のリクエストは通過しているので、作成したい1500件のレコードのうち、3〜4件がデータベースに入っています。データベースを破棄して更新し、それが修正されるかどうかを確認してみます。データベースの状態を確認し、バグがあればキャプチャする方法がわかりません。

「いいね!」 1

このインスタンスはどのように構築されましたか?どのバージョンで実行されていますか?

「いいね!」 1
#### インストール済み

### 3.1.0.beta5

( [ 5584fb1e3b ](https://github.com/discourse/discourse/commits/5584fb1e3b7a29d7ee5d7e43520191081dd10a16) )

通常のDockerインストールを実行しただけです。特別なことは何もしていません。

インポート中はレート制限を一時的に無効にし、後で元に戻すことは可能ですか?現在、APIを使用するのは私だけです(ユーザーにAPIを使用させることは想定していません)。そのため、可能であればレート制限を永続的に無効にすることもできます。

Railsでレート制限がどのように機能するか見たことがありません。全く手がかりがありません。

「いいね!」 1

@pfaffman レート制限を変更したことで何かを台無しにしてしまい、システムがおかしな状態になっているのだと思います。これらのエラーは実際の問題ではなく、何か別の問題があるのでしょう。サーバーを新しく作成して、スクリプトが今回機能するかどうかを確認してから報告します。

「いいね!」 2

残念ながら、サーバーを再作成しても問題は解決しませんでした :frowning:

shared 内の postgres_data ディレクトリを削除し、./launcher rebuild app を実行して、アプリの新しいインスタンスを取得しました。

私のスクリプトは現在、ユーザーとユーザーが所有するカテゴリを作成し、その後、そのカテゴリ内にトピックを作成しようとします。しかし、すぐにレート制限エラー An error occurred RateLimiter::LimitExceeded に遭遇します。

rails r スクリプトはレート制限の問題の影響を受けないはずですよね?モデルにはレート制限コードが実行されていることを示すコードがありますが、それを無効にする方法も、API経由でリクエストが来た場合にのみ発生することを確認する方法もわかりません。

他に何か提案はありますか? psql を直接使用するのが最善の方法だと思いますが、rails r スクリプトの方がはるかにクリーンで使いやすいため、残念です。

直しました!

テストの力がここで証明されました。このファイルにアクセスしました。

そこで RateLimiter.enable メソッドを見つけました。試しに RateLimiter.disable を試してみようと思いました。

レート制限のエラーはもう発生しません!

「いいね!」 4

素晴らしい仕事ぶりですね!こんなの初めて見ました。

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.