Как избежать ограничения скорости при импорте большого объема данных?

Я пытаюсь автоматически создать множество тем и сообщений. Однако я постоянно натыкаюсь на ограничения скорости.

Сначала я попробовал это сделать через API. Мой скрипт быстро столкнулся с ошибками 429. Я попытался настроить ограничения скорости как администратор (см. скриншот), но мне неясно, какой здесь правильный подход, или же это пустая трата времени.

Затем я попробовал использовать скрипт на Ruby с помощью команды rails r <script> внутри контейнера. Однако и здесь я вижу ошибку An error occurred RateLimiter::LimitExceeded. Меня это удивило: почему метод Ruby подвержен ограничениям скорости?

В любом случае, есть ли способ обойти это? Какой правильный способ импорта данных пакетно? Я думал использовать SQL напрямую, но предпочел бы более высокоуровневый API, чтобы не беспокоиться о пропущенных полях в базе данных при создании элемента.

Заранее спасибо.

Как это выглядит?

Для импорта данных следует использовать Rails, а не API.

Вы можете посмотреть на скрипты импорта, но, возможно, вам понадобится что-то более простое.

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\nПеревод:\n\n#{tr_text}"
    title = " the booki (параграф ##{i+1})"
    if (i < limit)
      begin
        puts "Добавляем тему #{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 "Произошла ошибка #{e}"
      end
    end
  end
end

add_all()

И это вызывает ошибку ограничения скорости? Я бы подумал, что это должно работать без проблем.

Да, см. мой предыдущий пост. При этой ошибке выполнение переходит в блок rescue.

Интересно, не находится ли мой сервер в странном состоянии. Я экспериментировал с лимитами запросов на скриншоте, устанавливая их в ноль и, возможно, в -1. Теперь я получаю ошибки превышения лимита запросов повсюду. Однако это странно: некоторые запросы проходят, так что из 1500 записей, которые я хочу создать, три или четыре попадают в базу данных. Возможно, я удалю базу данных, обновлю её и посмотрю, исправит ли это проблему. Не уверен, как проверить состояние базы данных и зафиксировать ошибку, если она есть.

Как был создан этот экземпляр? Какая версия на нем запущена?

#### Установлено

### 3.1.0.beta5

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

Я только что выполнил обычную установку Docker. Ничего особенного.

Возможно ли временно отключить ограничения скорости при импорте, а затем восстановить их позже? В данный момент я буду единственным, кто использует API (я не планирую предоставлять доступ к API моим пользователям). Поэтому я мог бы даже отключить ограничения скорости навсегда, если это возможно.

Я никогда не видел ограничений скорости в Rails. У меня нет никаких подсказок.

@pfaffman, ставлю, что я что-то напортачил, изменив лимиты запросов, и теперь система находится в странном состоянии. Эти ошибки — не настоящая проблема, дело в чём-то другом. Я создам сервер заново, проверю, работает ли мой скрипт на этот раз, и отпишусь.

К сожалению, пересоздание сервера не помогло. :frowning:

Я удалил директорию postgres_data внутри shared, затем выполнил ./launcher rebuild app и получил новый экземпляр приложения.

Мой скрипт теперь создаёт пользователя и категорию, принадлежащую этому пользователю, а затем пытается создать темы внутри этой категории. Однако сразу возникает ошибка ограничения скорости: An error occurred RateLimiter::LimitExceeded.

Я совершенно в тупике, так как скрипты rails r, по идее, не должны подвергаться ограничениям скорости, верно? В моделях я вижу код, указывающий на выполнение логики ограничения скорости, но не знаю, как её отключить или как убедиться, что это должно происходить только при запросах через API.

Есть ли другие предложения? Думаю, теперь мой лучший вариант — работать напрямую через psql, что разочаровывает, поскольку скрипт rails r гораздо чище и удобнее в использовании.

Я исправил это!

Сила тестов подтверждается именно здесь. Я открыл этот файл:

Там я увидел метод RateLimiter.enable. Подумал: а почему бы не попробовать RateLimiter.disable?

Ошибки ограничения частоты запросов больше нет!

Отличная работа! Я такого раньше не видел.