Всем привет,
Сейчас я пишу скрипт для миграции форума 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
Я постарался очистить код и добавить как можно больше комментариев. Надеюсь, кто-то сможет помочь с проблемой ограничения скорости запросов.
Также я пытался поискать в этом форуме, но видел лишь множество сообщений с похожими проблемами, однако реального решения так и не нашёл. Если я упустил что-то, извините за дубликат.
Спасибо всем.