Превышен лимит запросов при миграции тем и сообщений

Всем привет,

Сейчас я пишу скрипт для миграции форума Woltlab (Wbb) в Discourse и готов поделиться им, как только он будет хотя бы частично готов.

На данный момент я с переменным успехом мигрирую категории, форумы, пользователей и их группы без особых проблем. Однако время от времени в процессе выполнения возникают всё более серьёзные проблемы: при обработке постов и тем появляется ошибка «Ratelimit Exceeded» (превышен лимит запросов).

Моя проблема в том, что я ещё относительно новичок и в основном собираю информацию из различных источников о миграции, поэтому сейчас не понимаю, откуда именно приходит это сообщение.

Это ограничение исходит от API Discourse? И если да, можно ли как-то полностью отключить лимитирование запросов во время импорта?

def migrate_threads_and_posts
  puts "Миграция тем и постов..."
  @client.query("SELECT * FROM wbb1_thread ORDER BY time ASC").each do |thread_row|
    begin
      next if thread_row[:isDeleted] == 1 || thread_row[:movedThreadID]

      # Убедиться, что lastPosterID соответствует существующему пользователю
      last_post_user_id = @user_map[thread_row[:lastPosterID]] || @user_map[thread_row[:userID]]

      # Если lastPosterID и userID отсутствуют, создать пользователя-заглушку
      if last_post_user_id.nil? && thread_row[:lastPoster]
        last_post_user_id = find_or_create_placeholder_user(thread_row[:lastPoster])
      end

      # Убедиться, что существует валидный ID пользователя
      last_post_user_id ||= User.first.id

      # Получить ID пользователя, создавшего тему, или создать заглушку
      creator_user_id = @user_map[thread_row[:userID]] || find_or_create_placeholder_user(thread_row[:username]) || User.first.id

      # Создать тему
      topic = Topic.new(
        title: thread_row[:topic],
        user_id: creator_user_id,
        category_id: @forum_map[thread_row[:boardID]],
        created_at: Time.at(thread_row[:time]),
        updated_at: Time.at(thread_row[:lastPostTime]),
        last_post_user_id: last_post_user_id
      )

      if topic.save(validate: false)
        puts "Импортирована тема: #{topic.title} (ID: #{topic.id})"

        # Мигрировать посты
        migrate_posts(thread_row[:threadID], topic.id)
      else
        puts "Ошибка импорта темы #{thread_row[:topic]}: #{topic.errors.full_messages.join(', ')}"
      end

      sleep(7) # Увеличено время ожидания, чтобы избежать ограничения скорости
    rescue => e
      puts "Исключение при импорте темы #{thread_row[:topic]}: #{e.message}"
    end
  end
end

Я постарался очистить код и добавить как можно больше комментариев. Надеюсь, кто-то сможет помочь с проблемой ограничения скорости запросов.

Также я пытался поискать в этом форуме, но видел лишь множество сообщений с похожими проблемами, однако реального решения так и не нашёл. Если я упустил что-то, извините за дубликат.

Спасибо всем.

Хорошо. Это буквально RateLimiter.disable

Забудьте тогда :slight_smile:

Вам будет гораздо проще, если вы возьмёте один из скриптов импорта за основу.

Это решит множество проблем, о существовании которых вы пока даже не подозреваете.

Какие именно проблемы это может решить? Сейчас я изучаю скрипты импорта для phpBB и XenForo.

Скрипт phpbb3 хорошо написан, но требует глубокого понимания Ruby. Xenforo, на мой взгляд, приемлем. Вам стоит выбрать тот, который обладает нужными вам функциями (личные сообщения? постоянные ссылки? группы? администраторы? приостановленные пользователи?)

Я не могу угадать, чего вы не знаете, но два момента, которые сразу приходят на ум: способы связки старых идентификаторов с новыми и способы гарантировать, что одни и те же данные не будут импортированы дважды.