Подтвердить что ты не робот

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

Я занимаюсь созданием API веб-сервисов для своего приложения. Кроме того, я планирую открыть службу через REST и SOAP.

Я заинтересован в получении отзывов от сообщества о том, какой язык программирования я должен выбрать для внедрения службы? (Я знаю, что С#, Java и Ruby - RoR достаточно для создания сервиса).

Служба - это, в основном, служба HTTP POST. Он должен будет обрабатывать около 2000 одновременных соединений, а также способен обрабатывать около 10 000 HTTP POST в секунду. (для SOAP у нас будет метод отправки для звонков клиентов).

Служба не возвращает никакого ответа клиенту на запросы POST.

Любые идеи, на которых должен использоваться язык программирования/архитектуры?

4b9b3361

Ответ 1

10 000 запросов в секунду - 25 миллиардов обращений в месяц. Это означает одну из двух вещей:

  • Ваше приложение более популярно, чем MySpace; или
  • Вы пытаетесь использовать это для связи между двумя очень чатными компонентами, которыми вы управляете, и это ужасный выбор дизайна .

Коммутационное оборудование для распределения такой нагрузки между фермой веб-интерфейсов обойдется в тысячи долларов.

Начните с написания веб-службы, которая может обрабатывать 50 запросов в секунду (выбор языка не очень уместен). Если ваше приложение настолько занято, что вы регулярно переходите этот порог, вы можете позволить себе нанять кого-то для работы по проблеме масштабирования на полный рабочий день и не просить помощи на бесплатном сайте Q & A.

Ответ 2

Основываясь на моем предыдущем опыте, я могу дать вам следующий совет.

  • Выберите язык, который вы (и, возможно, другие члены команды), как и большинство. Я бы предпочел языки более высокого уровня, потому что аппаратное обеспечение быстро и дешево, но программисты медленны и дороги.
  • Создайте свои службы абсолютно бесплатно (без сеансов!). Это упрощает добавление нового оборудования, поскольку разные экземпляры вашего сервиса не должны знать друг друга.
  • Обработать обработку асинхронно, так как вам, к счастью, не нужно давать клиенту никакого ответа (кроме OK). Если вы сделаете это синхронно, ваш процесс будет заблокирован, и ваш запрос будет снижаться. Хорошее чтение эта статья в Википедии и особенно (классика!) C10K проблема.
  • Поместите службу на многие машины. (в зависимости от скорости ваших услуг)
  • Поместите сервер базы данных на другие компьютеры, чем веб-службы. Используйте быстрые диски!
  • Обработайте нагрузку, балансируя с чем-то вроде:
    • Виртуальный сервер Linux - самое эффективное решение, потому что оно работает в ядре. Масштабы как безумные. Я использовал его в 2003 году с частотой ~ 500 рек/сек на P3/1GHz с нагрузкой процессора 0,1%. Может быть спарен для достижения HA. Должно обрабатывать 10000req/sec довольно хорошо на одной машине. Сделайте это, попробовав что-то более простое. Это может быть довольно сложно.
    • Pound, очень просто настроить, но с большими накладными расходами. Хорошая отправная точка. Может выполнять SSL.
    • Nginx, простая конфигурация, очень эффективная. Может делать SSL. Также может выступать в роли HTTP-сервера и может быть хостинговым решением для ваших услуг.
    • Perlbal, не использовали его, но слышали хорошие вещи.
    • или другие обратные прокси.

Ответ 3

В 10 000 сообщений в секунду язык является наименьшим из ваших забот. Большей проблемой будет дизайн вашей фермы серверов и сети. Я предполагаю, что вы не планируете запускать это в одном окне?

Ответ 4

Высоко масштабируемые приложения, надежные, распределенные и использующие многоядерные/многопроцессорные системы? Здесь я сразу же думаю об Erlang/OTP вместе с Yaws как сервер веб-приложений. Yaws работает очень стабильно и быстро при экстремально высокой нагрузке. И Erlang/OTP как платформа предназначена для concurrency и распространения, а также некоторые механизмы, помогающие разработать стабильное программное обеспечение. Стоимость: concurrency -ориентация с функциональным языком программирования не является ООП с Java или С#, синтаксис кажется странным (но он очень прямой и мощный, как только вы его приняли), а количество сторонних библиотек не является столь же огромным, как и для основных языков. Но это того стоит.

Надеюсь, что это поможет

mue

Ответ 5

При такой скорости, и поскольку вы все равно нарушаете HTTP (без ответа), вы можете также создать собственный сервер или изменить сервер с открытым исходным кодом.

Напишите все это на C или С++, и вы будете стремиться как можно быстрее.

Масштабируемость зависит только от выбора языка.

-Adam

Ответ 6

Я мог видеть получение миллиарда сообщений в месяц из одной машины. У меня есть веб-сервис, написанный на С#, который в настоящее время обрабатывает около 3,5 миллионов сообщений в день. Веб-сервер работает с 3% загрузки процессора. Это означает, что я мог бы подталкивать его как минимум в 20 раз тяжелее...

Предполагая, что на каждой вашей машине было 4 ядра Xeon Six, 32 ГБ оперативной памяти, быстрый дисковый массив и высоко оптимизированная база данных для записи, вы можете это сделать. Хотя, стоимость каждого сервера, вероятно, находится в диапазоне от 35 до 40 долларов.

Независимо от того, ваше узкое место не будет с С# или Java. Это будет с сервером базы данных в зависимости от того, насколько он растет. В моем случае это около 300 ГБ с удалением 10 ГБ и добавлением 10 ГБ в день.

Ответ 7

Давайте рассмотрим проблемы:

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

Данные: SOAP? XML? Вы захотите свернуть любые ненужные циклы процессора. Что плохого в использовании JSon? (И нет никакого божественного диктата, который говорит, что сервер архитектуры REST не может использовать двоичные данные в протоколе...)

Содержание. Если какое-либо преобразование данных (от текста к числу, например) задействовано, вам также необходимо будет рассмотреть, какой язык предоставляет наиболее эффективные механизмы. Например, в Java (который является очень сильным кандидатом для вас, кстати) класс String является серьезным болотом процессора.

Java и Erlang - очень хорошие кандидаты. C всегда является опцией, но параллельное программирование намного сложнее.

Ответ 8

Вы действительно можете использовать любой язык через CGI (Common Gateway Interface), поэтому он сводится к производительности. Среди языков, которые вы перечисляете, я ожидаю, что С# будет самым быстрым. Хорошее сравнение скорости между языками - Перегрузка языка

Если вам действительно нужна производительность, вы можете посмотреть в сторону более ориентированного на производительность языка, такого как C или D, для обработки запросов.

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

Ответ 9

Обновление: оно должно быть огнем и забыть веб-сервис. Думаю, я пошлю обратно простой ответ HTTP 200/OK

Нет, это не предназначено для запуска в одном окне. Он предназначен для работы на нескольких ящиках (скажем, 3-4).

Когда запросы получены, они помещаются в очередь на других машинах, затем они берутся и помещаются в хранилище HBase/Voldemort.

Как я уже сказал, это значит, что это веб-сервис "огонь и забыть"

Ответ 10

Вам нужен C llike язык, и, чтобы избежать написания полного сервера, я бы предложил CGI (это то, что php и т.д. все пропустили в любом случае) Серверы Windows предлагают плагины ISAPI, но они выполняются в контексте сервера, поэтому утечки памяти и GPF снизятся с сервера. Добавьте к этому неудобство остановки/запуска сервера каждый раз, когда вы меняете что-то, CGI/FastCGI выглядит лучше.