Работа с большим количеством вызовов в реальном времени к партнерскому API в Rails - PullRequest
3 голосов
/ 23 января 2010

Моему приложению Rails необходимо вызывать RESTful API партнера для каждого запроса, который он получает по действию конкретного контроллера. Мне нужно передать специфичные для запроса параметры (например, IP, user-agent и т. Д.) В партнерский API и вернуть ответ, который я получаю, пользователю. Поскольку вызов API партнера очень специфичен для пользователя, я не могу кэшировать ответ, полученный от API партнера (например, в memcached). Мое требование - отвечать пользователю за 1500 мс или меньше.

Приложение My Rails достигает стены с точки зрения количества запросов / секунду, потому что каждый монгрел блокируется, пока партнерский API не возвращает ответ. В недавнем тесте производительности я видел, как сервер выполняет всего 5 запросов в секунду (работает 5 шавок).

У меня есть несколько идей о том, что делать:

1) Ускорение реакции партнерского API. На самом деле, я могу лишь сильно дернуть этот рычаг - даже при очень тяжелой работе со стороны партнера среднее время отклика составляет 200 мс.

2) Ограничить время ожидания возврата партнерского API. Я попытался использовать Rails :: Timeout, но он допускает периоды ожидания только с точностью до секунды. Есть ли способ сделать тайм-аут в миллисекундах?

3) Есть ли способ поставить вызовы в API-интерфейс партнера в очередь, выполнять их асинхронно? В Java я бы использовал потоки для той же задачи.

Спасибо за вашу помощь!

Ответы [ 2 ]

3 голосов
/ 23 января 2010

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

Пример:

  1. Добавить работу в отложенную работу
  2. Перенаправить пользователя на страницу результатов
  3. Отображение какого-либо индикатора прогресса (возможно, кружащейся стрелки)
  4. Опрашивать этот столбец / строку базы данных / что угодно для результата каждую секунду через действие

Это даст пользователям обратную связь и позволит им ждать, не думая, что время истекло.

0 голосов
/ 23 января 2010

Мы использовали delayed_job, и он работает хорошо. Если вам не нужно отображать возвращаемое значение из партнерского API, задержка_job кажется хорошим решением. Вы можете использовать функцию send_later в delayed_job, чтобы сделать любой вызов метода в delayed_job. Вы также можете настроить количество работников в delayed_job и выяснить, в какой момент вы получите правильный отклик.

Бхарат

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