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

StackOverflow https://stackoverflow.com//questions/22029333

Вопрос

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

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

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

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

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

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

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

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

  3. Переместите в Puma вместо единорога (и, вероятно, рубин из МРТ), чтобы я мог использовать нити вместо процессов - которые могут (??) улучшить использование памяти на соединение, и поэтому разрешить количество работники будут увеличены.

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

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

Это было полезно?

Решение

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

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

Я бы порекомендовал попробовать eventMachine и EM-HTTP-запрос и em-http-сервер .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top