Длительный процесс ruby, который использует ActiveRecord для хранения записей в базе данных - PullRequest
2 голосов
/ 24 сентября 2008

Я пытаюсь написать приложение с использованием Ruby on Rails и пытаюсь добиться следующего:

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

Я думал о написании отдельного демона, который получал бы эти сообщения и передавал их в скрипт ruby ​​в моем приложении rails, которое будет хранить сообщение в базе данных, используя правильную модель. Проблема этого подхода в том, что скрипт ruby ​​будет запускаться очень часто. Было бы лучше с точки зрения производительности, если бы у меня был просто длительный процесс ruby, который мог бы постоянно получать UDP-сообщения и сохранять их в базе данных.

Это правильный способ сделать это? Есть ли в фреймворке Rails что-то, что может помочь с этим?

Ответы [ 2 ]

3 голосов
/ 24 сентября 2008

Вы определенно не хотите загружать стек Rails для каждого входящего запроса - это будет слишком медленно; Вы хотите использовать что-то более низкого уровня для обработки входящих соединений. Вы можете взглянуть на внутреннюю часть Webrick, чтобы увидеть простой серверный демон, закодированный в ruby, или, если вы хотите что-то более производительное, взглянуть на Mongrel или Thin.

В целом, весь стек Rails здесь вам мало чем поможет - большая часть его предназначена для обслуживания веб-приложений, а не для сохранения чего-либо прямо с провода.

Часть Rails, которая, вероятно, поможет вам больше всего, - ActiveRecord - вполне вероятно, что вы захотите использовать ее для хранения данных вашей модели в базе данных. На самом деле, вы должны иметь возможность include ваших реальных моделей Rails и использовать их в своем процессе UDP-мониторинга. Посмотрите ActiveRecord docs для примеров подключения к базе данных вне вашего проекта Rails.

0 голосов
/ 31 августа 2009

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

По соображениям производительности и чтобы мы не теряли сообщения, мы прошли двухэтапный процесс. Мы написали небольшой обработчик, который прослушивал сообщения и затем сохранял их в очереди сообщений, используя Apache Active-MQ . Затем мы использовали плагин ActiveMessaging в отдельном приложении rails, чтобы получать сообщения из очереди и сохранять их в базе данных. Этот метод позволяет легко масштабировать слушателей и приведет к гораздо более высокой пропускной способности обмена сообщениями.

Если бы вы пошли по этому пути, то вы могли бы взглянуть на реализацию Fuse Active-MQ, которая, как правило, на несколько версий дальше этой версии Apache.

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