Отладка Rails в производственной среде - PullRequest
2 голосов
/ 16 января 2010

Я создаю приложение Twitter, и каждый раз, когда пользователь обновляет страницу, он перезагружает новейшие сообщения из Twitter и сохраняет их в локальной базе данных, если они не были созданы ранее. Это хорошо работает в среде разработки (база данных: sqlite3), но в производственной среде (mysql) оно всегда создает сообщения снова, даже если они уже были созданы.

Создание сообщения проверяется twitter_id, что каждое сообщение имеет:

msg = Message.find_by_twitter_id(message_hash['id'].to_i)
if msg.nil?
  # creates new message from message_hash (and possibly new user too)
end
msg.save

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

С этим длинным вступлением, я думаю, мой главный вопрос - как мне это отладить? (если, конечно, у вас уже нет ответа на главную проблему :) Когда я смотрю в файле production.log, он показывает только что-то вроде:

Processing MainPageController#feeds (for 91.154.7.200 at 2010-01-16 14:35:36) [GET]
Rendering template within layouts/application
Rendering main_page/feeds
Completed in 9774ms (View: 164, DB: 874) | 200 OK [http://www.tweets.vidious.net/]

... но не запросы к базе данных, тексты logger.debug или что-нибудь, что может помочь мне найти проблему.

Ответы [ 3 ]

9 голосов
/ 16 января 2010

Вы можете изменить уровень журнала в производстве, установив уровень журнала в config / environment / production.rb

config.log_level = :debug

Это будет регистрировать sql и все остальное, что вы привыкли видеть в dev - это немного замедлит работу приложения, и ваши журналы будут большими, поэтому используйте разумно.

Но что касается актуальной проблемы, стоящей за вопросом ...

Может ли это быть из-за нескольких подключений к mysql?

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

Поскольку вы используете mysql, вы можете использовать уникальный ключ в идентификаторе твиттера для предотвращения дублирования, а затем перехватить исключение ActiveRecord, если попытаетесь вставить дублирование. Но это означает обработку ошибки, которая не является хорошим способом ее обработки (хотя я рекомендую сделать это в качестве резервного средства предотвращения дублирования - mysql хорош для этого, используйте его).

Вы также должны предотвращать попытки вставки дуплейсов. Одним из способов является использование блокировки для общей записи, скажем, записи пользователя, с которой связаны все твиты, чтобы другой процесс не мог попытаться добавить твиты для пользователя, пока не получит эту блокировку (которую вы освободите только после транзакция завершена), и, таким образом, предотвращают одновременное принятие одной и той же информации.

1 голос
/ 16 января 2010

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

Что касается самой проблемы, вы можете попробовать добавить в базу данных уникальный индекс, который не позволит сохранить два элемента с одинаковыми параметрами. Это похоже на validates_uniqueness, но на уровне базы данных, и очень эффективно: Mysql Constraign Database Entries в Rails .

Например, если вы не хотите, чтобы в вашей базе данных не было объектов сообщений с дублированным текстом и дублирующим идентификатором Twitter (что означало бы, что один и тот же человек написал в Твиттере один и тот же текст). Затем вы можете добавить это к вашей миграции:

add_index( :message, [:twitter_id, :body] , :unique => true)

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

0 голосов
/ 04 мая 2018

Для вашего рабочего сервера я бы порекомендовал установить rollbar, чтобы сообщать вам обо всех необработанных ошибках и исключениях на ваших производственных серверах.

Вы также можете хранить кучу полезной информации, например, http-запрос, запрошенные пользователи, код, который вызвал ошибку и многое другое или отправлять уведомления по электронной почте каждый раз, когда на вашем производственном сервере происходят необработанные исключения.1005 * Вот простая статья об отладке в rails , которая может вам помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...