#mysql #ruby-on-rails #ruby #ruby-on-rails-4 #activerecord
#mysql #ruby-on-rails #ruby #ruby-on-rails-4 #activerecord
Вопрос:
Я вставляю примерно 4000-5000 записей подряд, в среднем запросы на вставку отправляются в течение 1 мс после каждого непрерывно, пока не будут добавлены все записи. Весь импорт упаковывается в одну транзакцию. Задание завершается с ошибкой:
ActionView::Template::Error (Failed. Response code = 429. Response message = Too Many Requests.):
Я проследил ошибку до моего оператора model.create. Я знаю, что невозможно вставить несколько записей одновременно с помощью ActiveRecord, так можно ли увеличить количество запросов, которые я могу сделать за короткий промежуток времени? Или мне нужно использовать gem для вставки нескольких записей одновременно? т.е. activerecord-импорт
Я почти уверен, что если бы я обнаружил ошибку ActionView ::Template :: и отступил на несколько секунд, прежде чем повторить попытку, это сработало бы, но есть ли какой-либо другой способ сделать это?
Комментарии:
1. Можете ли вы предоставить некоторые подробности о том, какую задачу вы на самом деле пытаетесь решить? Зачем вам нужно вставлять 4000 записей в один запрос?
2. Этот импорт выполняется только время от времени, он в основном берет большое количество записей из внешнего API и сохраняет их в нашей базе данных. Данные из внешнего API поступают в виде страниц, но в настоящее время мы получаем все страницы и сохраняем все это за один раз, так что это атомарно.
3. Возможно, вам захочется использовать подобный инструмент для массовой вставки, если вы делаете это часто.
4. Верно, но помимо инструмента массовой вставки, могу ли я что-нибудь сделать?
Ответ №1:
Рассматривали ли вы возможность использования фонового задания для выполнения этого? В зависимости от того, какую базу данных вы используете, вы можете вставлять новые данные одновременно.
Комментарии:
1. Не уверен, что понимаю, но почему фоновое задание поможет обойти ошибку слишком много запросов? Вы имеете в виду ограничить запросы в фоновом задании?
2. Похоже, вы нашли ошибку. :] Можно использовать фоновые задания для дросселирования, если хотите.
3. Я обязательно рассмотрю фоновые задания, я рассматривал возможность использования delayed_job, есть ли у вас какие-либо рекомендации?
4. На самом деле, если подумать, я думаю, что будет проще настроить задачу rake, а затем запланировать ее с помощью cron.
Ответ №2:
Обычно это происходит, когда один метод сам вызывает другой метод рекурсивным способом.
Итак, если у меня есть redirect_to
в одном действии, которое снова отправляет redirect_to
в то же самое action..so в свою очередь, это приводит к ошибке Слишком большого количества запросов..
То же самое относится к рендерингу partials
, который сам по себе имеет частичный рендеринг родительского элемента, где родительский вид частично отображает дочерний элемент, который также частично отображает parent…so это становится рекурсивным циклом.
Надеюсь, это поможет 🙂
Комментарии:
1. Во время импорта ничего не отображалось, но, как оказалось, это было совершенно не связано с нашим собственным сервером. Спасибо за ваш ответ, хотя!
Ответ №3:
Как оказалось, эта ошибка не имеет ничего общего с нашим собственным сервером. Одна из частей, которые мы импортируем, из Shopify. После мониторинга HTTP-трафика я понял, что когда вы получаете заказ и пытаетесь получить транзакции, связанные с этим заказом, это дополнительный запрос. Итак, мы пытались сделать слишком много запросов и достигли их предела API.