Как мне делать HTTP-запросы в Rails, при этом обслуживая много запросов в минуту?

Я пытаюсь расширить сервер приложений для обработки более 20 000 запросов в минуту.

Когда я подвергаю стресс-тестированию запросы, большинство запросов легко обрабатываются на 20 000 оборотов в минуту и ​​более.

Но запросы, которые должны выполнять внешний HTTP-запрос (например, вход в Facebook), переводят сервер в режим сканирования (3000 об / мин).

Я концептуально понимаю ограничения моей текущей среды - 3 сервера с балансировкой нагрузки с 4 рабочими-единорогами на каждый сервер могут обрабатывать только 12 запросов за раз, даже если все они ожидают HTTP-запросов.

Какие у меня есть варианты для улучшения масштабирования? Я хотел бы обрабатывать еще много подключений одновременно.

Возможные решения, как я понимаю:

  1. Грубая сила: используйте больше рабочих единорогов (т. Е. Больше оперативной памяти) и больше серверов.

  2. Переместите все операции блокировки в фоновые / рабочие процессы, чтобы освободить веб-процессы. Клиенты должны будут периодически опрашивать, чтобы узнать, когда их запрос будет выполнен.

  3. Перейдите на Puma вместо Unicorn (и, возможно, на Rubinius из MRI), чтобы я мог использовать потоки вместо процессов, что может (??) улучшить использование памяти на каждое соединение и, следовательно, позволить увеличить количество рабочих.

По сути, я ищу: есть ли лучший способ увеличить количество заблокированных / поставленных в очередь запросов, которые может обработать один рабочий, чтобы я мог увеличить количество подключений на сервер?

Например, я слышал обсуждение использования Thin с EventMachine. Открывает ли это возможность Rails worker, который может отложить веб-запрос, над которым он сейчас работает (потому что он ожидает на внешнем сервере), а затем заберет другой запрос, пока он ожидает? Если да, то стоит ли стремиться к повышению производительности по сравнению с Unicorn и Puma? (Сильно ли это зависит от активности приложения во время выполнения?)


person Jessica Knight    schedule 26.02.2014    source источник


Ответы (1)


Unicorn - это однопоточный, многопроцессорный синхронный сервер приложений. Он не подходит для такой обработки.

Похоже, ваше приложение связано с вводом-выводом. Это говорит о том, что демон, ориентированный на события, может обрабатывать ваши запросы.

Я бы рекомендовал попробовать EventMachine и em-http-request и https://github.com/alor/em-http-server. .

Это позволит вам обрабатывать как входящие запросы к серверу http, так и исходящие вызовы службы HTTP асинхронно.

person Winfield    schedule 26.02.2014