Производительность SOAP против XML-RPC или REST
Аргументы о простоте решений, использующих XML-RPC или REST, легко понять и с ними трудно поспорить.
Я также часто слышал аргументы, что увеличение издержек SOAP может значительно повлиять на используемую пропускную способность и, возможно, даже на задержку. Я хотел бы видеть результаты теста, который количественно оценивает воздействие. Кто-нибудь знает хороший источник такой информации?
8 ответов
Есть несколько исследований, которые были сделаны в отношении этого, которые вы можете найти информативными. Пожалуйста, смотрите следующее:
- SO: отдых против производительности мыла
- Q&A: мыло и отдых 101
- Обновленные службы данных SQL Server: загрузка REST и SOAP Northwind
Существует также (несколько устаревший) интересный разговор о производительности по этой теме на форумах MSDN.
Короче говоря, большинство этих источников, похоже, согласны с тем, что SOAP и REST имеют примерно одинаковую производительность для данных общего назначения. Некоторые результаты, однако, указывают на то, что с двоичными данными REST может фактически быть менее производительным. Смотрите ссылки на форуме, на который я ссылаюсь, для более подробной информации.
Основное влияние на скорость SOAP по сравнению с REST связано не со скоростью передачи данных, а с кэшируемостью. REST предлагает использовать семантику сети вместо того, чтобы пытаться туннелировать ее через XML, поэтому веб-службы RESTful обычно предназначены для правильного использования заголовков кэша, поэтому они хорошо работают со стандартной инфраструктурой сети, такой как кэширующие прокси и даже локальные кэши браузера. Кроме того, использование семантики сети означает, что такие вещи, как ETag и автоматическое сжатие почтовых индексов, являются хорошо понятными способами повышения эффективности.
... и теперь вы говорите, что хотите эталоны. Что ж, с помощью Google я нашел одного парня, чье тестирование показало, что REST в 4-6 раз быстрее, чем SOAP, и другой документ, который также поддерживает REST.
REST как протокол не определяет какую-либо форму конверта сообщения, в то время как SOAP имеет этот стандарт.
Поэтому несколько упрощенно попытаться сравнить их: они - яблоки с апельсинами.
При этом конверт SOAP (за исключением данных) составляет всего несколько килобайт, поэтому не должно быть заметной разницы в скорости, если вы извлекаете сериализованный объект через SOAP и REST.
SOAP и любой другой протокол, использующий XML, как правило, раздувает ваши сообщения - это может или не может быть проблемой в зависимости от контекста.
Что-то вроде JSON было бы более компактным и, возможно, быстрее сериализовать / десериализовать - но не используйте его исключительно по этой причине. Делайте то, что считаете нужным, и измените его, если это проблема.
Все, что обычно использует HTTP (если только оно не использует соединение поддержки активности HTTP 1.1, чего нет во многих реализациях), запускает новое TCP-соединение для каждого запроса; это довольно плохо, особенно по каналам с высокой задержкой. HTTPS намного хуже. Если у вас много коротких запросов от одного отправителя к одному получателю, подумайте, как вы можете избавиться от этих накладных расходов.
Использование HTTP для любого типа RPC (будь то SOAP или что-то еще) всегда будет сопряжено с такими издержками. Другие протоколы RPC обычно позволяют поддерживать соединение открытым.
Расширяя ответ "pjz".
Если вы получаете много SOAP-операций на основе ИНФОРМАЦИИ (получение * типа вызовов), в настоящее время нет способа их кешировать. Но если бы вы реализовали те же самые операции с использованием REST, есть вероятность, что данные (в зависимости от вашего бизнес-контекста) могут быть кэшированы, как упомянуто выше. Поскольку SOAP использует POST для своих операций, он не может кэшировать информацию на стороне сервера.
SOAP определенно медленнее. Полезные нагрузки значительно больше, которые медленнее собирать, транспортировать, анализировать, проверять и обрабатывать.
Я не знаю ни одного ответа на вопрос о сравнительном тестировании, однако, что я знаю о формате SOAP, так это да, у него есть накладные расходы, но эти накладные расходы не увеличиваются на запрос: если у вас есть один элемент, отправленный в веб-службу, у вас есть накладные расходы + построение одного элемента, и если у вас есть 1000 элементов, отправленных в веб-сервис, у вас есть накладные расходы + построение 1000 элементов. Избыточные расходы возникают, когда запрос XML форматируется для конкретной операции, но каждый отдельный элемент аргумента в запросе форматируется одинаково.
Если вы придерживаетесь повторяющихся коротких пакетов данных (скажем, 500 элементов), скорость должна быть приемлемой.
Я предполагаю, что главный вопрос здесь - как сравнить RPC с SOAP.
они оба используют один и тот же подход абстракции связи, имея объекты-заглушки, с которыми вы работаете, и примитивные / сложные типы данных, которые вы возвращаете, не зная, как все это обрабатывается.
Я бы всегда предпочел (JSON-)RPC, потому что
- это легкий
- Есть много отличных реализаций для всех языков программирования.
- это просто учиться / использовать / создавать
- это быстро (особенно с JSON)
хотя есть причины, по которым вы должны использовать SOAP, т. е. если вам нужны параметры именования, а не полагаться на их правильный порядок
еще некоторые подробности, которые вы получите из этого вопроса stackru