Предложения по написанию сервиса в Rails 3 - PullRequest
1 голос
/ 13 ноября 2011

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

  • Запрос к базе данных всех запросов, которые необходимо отправить (на основе некоторой логики)
  • Отправка запросов через Amazon Simple Email Service (это уже работает)
  • Запись записи уведомления о запросе статуса обратно в хранилище данных

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

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

Мое первое желание - построить следующее:

  • Контроллер со следующими элементами:
    • Метод, который организует шаги, описанные выше (и может вызываться извне)
    • Вызов модели status_request, которая вернет коллекцию запросов, которые необходимо отправить
    • Цикл для перебора ожидающих запросов, который будет:
    • Позвоните в мой модуль AWS Simple Email Service, чтобы фактически отправить электронное письмо, и
    • Позвоните модели status_request, чтобы зарегистрировать запрос обратно в базу данных
  • Модель:
    • Метод на моей status_request модели, который возвращает коллекцию запросов, которые необходимо отправить
    • Метод в моей status_request модели, который будет регистрировать, что уведомление было отправлено

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

Как новичок в Rails, я прошу пересмотреть этот подход и любые ваши предложения.

Спасибо!

Ответы [ 3 ]

1 голос
/ 13 ноября 2011

Вместо контроллера, на который указал Джефф, существует угроза безопасности, вы можете просто выставить задачу rake и использовать cron для ее почасового вызова.

Если вы все еще заинтересованы в созданииконтроллер, посмотрите на devise gem и его единственный токен доступа, token_authenticatable, для защиты методов, которые вы предоставляете.

Вы также можете посмотреть на delayed_job или resque, чтобы разгрузить вызов status_request и цикл до AWS simpleобслуживание фонового рабочего процесса.

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

И если вы хотите по-настоящему модно использовать Amazon SNSотправлять вам оповещения, когда сервис достигает неприемлемого уровня сбоев, задержек и т. д.

1 голос
/ 13 ноября 2011

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

Вам понадобятся маршруты для предоставления вашего сервиса, и вы можете также принять решение о безопасности.Как служба, которая вызывает ваше приложение, будет аутентифицироваться, чтобы все остальные не могли выполнить ее по своему желанию?

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

В конце концов, есть много способов сделать это.Я бы сосредоточился на производительности / использовании, которые вы ожидаете, а также безопасности.Никогда не существует идеального способа решения такой проблемы, и ваш путь должен просто учитывать переменные, с которыми он должен работать.

0 голосов
/ 13 ноября 2011

Resque и Redis могут быть полезны для вас при планировании и выполнении операций. Они просты и супербыстрые, [здесь] (http://railscasts.com/episodes/271-resque] - это просто то же самое.

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