대량의 데이터를 가져올 때 속도 제한을 피하는 방법은?

자동으로 여러 개의 주제와 게시물을 생성하려고 하고 있습니다. 하지만 계속 속도 제한에 걸리고 있습니다.

처음에는 API를 사용해 보았습니다. 스크립트가 빠르게 429 오류를 일으켰습니다. 관리자 권한으로 속도 제한을 조정해 보았지만(스크린샷 참조), 여기서는 올바른 접근 방식이 무엇인지, 아니면 이것이 헛된 노력인지 불분명합니다.

그다음 컨테이너 내부에서 rails r <script>를 사용하여 루비 스크립트를 실행해 보았습니다. 하지만 여기에서도 An error occurred RateLimiter::LimitExceeded 오류가 발생합니다. 루비 메서드도 속도 제한의 대상이 된다는 사실에 놀랐습니다. 왜 그런가요?

어쨌든, 이를 피할 방법이 있을까요? 대량으로 데이터를 가져오는 올바른 방법은 무엇인가요? 직접 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 블록에 진입합니다.

서버가 이상한 상태에 있는 건 아닌지 궁금합니다. 스크린샷에서 레이트 리밋을 0으로, 어쩌면 -1로 설정해 보고 있거든요. 이제 여기저기서 레이트 리밋 오류가 발생하고 있습니다. 다만 이상하게도 일부 요청은 통과해서, 생성하려는 1500개 레코드 중 3~4개는 데이터베이스에 저장됩니다. 데이터베이스를 삭제하고 새로고침해서 문제가 해결되는지 확인해 볼 수도 있겠네요. 데이터베이스 상태를 확인하고, 만약 버그가 있다면 이를 포착하는 방법을 모르겠습니다.

이 인스턴스는 어떻게 구축되었나요? 어떤 버전을 실행 중인가요?

#### 설치됨

### 3.1.0.beta5

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

저는 그냥 일반적인 도커 설치를 수행했습니다. 특별한 것은 없습니다.

임포트 작업을 하는 동안 속도 제한을 일시적으로 비활성화하고 나중에 다시 활성화할 수 있을까요? 현재 API를 사용하는 사람은 저뿐입니다(사용자에게 API를 제공하지 않을 예정입니다). 따라서 가능하면 속도 제한을 영구적으로 비활성화해도 됩니다.

레일스에서 레이트 리미트를 직접 사용해 본 적이 없어서, 어떤 문제가 발생하는지 전혀 감이 잡히지 않습니다.

@pfaffman 레이트 리밋을 변경하면서 뭔가 잘못한 것 같고, 이제 시스템이 이상한 상태에 빠져 있는 것 같습니다. 이 에러들이 진짜 문제가 아니라 다른 곳에서 문제가 생긴 것 같습니다. 서버를 새로 생성해서 이번에는 스크립트가 제대로 작동하는지 확인한 후 다시 보고하겠습니다.

불행히도 서버를 다시 생성해도 문제가 해결되지 않았습니다. :frowning:

shared 디렉터리 안의 postgres_data 디렉터리를 삭제한 후 ./launcher rebuild app을 실행하여 앱의 새 인스턴스를 생성했습니다.

제 스크립트는 이제 사용자를 생성하고 해당 사용자가 소유한 카테고리를 생성한 다음, 그 카테고리 안에 토픽을 생성하려고 합니다. 하지만 즉시 속도 제한 오류가 발생합니다: An error occurred RateLimiter::LimitExceeded

rails r 스크립트는 속도 제한 문제의 영향을 받지 않아야 한다고 생각하는데, 정말 그렇지 않나요? 모델 코드에서 속도 제한 코드가 실행되는 것을 볼 수 있지만, 이를 비활성화하는 방법이나 API를 통해 요청이 들어오는 경우에만 이 동작이 일어나도록 설정하는 방법을 확인하는 방법을 알지 못합니다.

다른 제안이 있을까요? psql을 통해 직접 접근하는 것이 지금은 최선의 방법인 것 같지만, rails r 스크립트가 훨씬 깔끔하고 사용하기에 쉬워서 아쉽습니다.

고쳤어요!

테스트의 위력이 바로 여기서 입증되었습니다. 이 파일을 확인했습니다:

이 파일에서 RateLimiter.enable 메서드를 볼 수 있었습니다. 그래서 RateLimiter.disable을 시도해 보았습니다.

이제 레이트 리밋 오류가 더 이상 발생하지 않습니다!

잘했어! 전에 본 적이 없어.