Я заинтересован в разработке крупномасштабного сайта, ориентированного на пользователя, который написан на Java.
Что касается дизайна, я думаю о разработке независимых модульных сервисов, которые могут выступать в качестве поставщиков данных для моего основного веб-приложения.
Что касается написания этих модульных сервисов (поставщиков данных), я могу использовать существующую инфраструктуру, такую как Spring, и разрабатывать эти сервисы в соответствии с шаблоном проектирования RESTful, а также предоставлять ресурсы через HTTP с форматом сообщений, например JSON ... или я могу использовать существующую сеть. фреймворк, такой как Netty ( http://netty.io/ ) и формат сериализации, такой как Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ), и разработка сервера TCP, который отправляет туда и обратно сериализованный protobuf полезная нагрузка.
Когда вы должны выбрать один над другим? Будет ли какая-то польза от использования формата сериализации, такого как Protobufs, и отправки потока байтов по проводам? Будут ли накладные расходы только при использовании JSON? Сколько накладных расходов между использованием TCP / IP и HTTP? Когда следует использовать Spring поверх Netty и наоборот для создания такого сервиса?
Ответы:
Определенно есть плюсы / минусы использования JSON поверх REST по сравнению с прямым TCP / IP с двоичным протоколом, и я думаю, вы уже подозреваете, что двоичный протокол будет быстрее. Я не могу точно сказать, насколько быстрее (и это будет зависеть от множества факторов), но я бы предположил, что разница может быть на 1-2 порядка.
На первый взгляд, если что-то в 10-100 раз медленнее, чем что-либо другое, у вас может быть реакция коленного рефлекса и вы переходите к «быстрой вещи». Однако эта разница в скорости только в самом протоколе. Если есть доступ к базе данных / файлу на стороне сервера, это не повлияет на ваш выбор уровня передачи. В некоторых случаях это может сделать скорость вашего уровня передачи гораздо менее значимой.
HTTP REST и JSON хороши по ряду причин:
Протобуфы через TCP / IP:
Если бы это был мой выбор, я бы предпочел использовать HTTP REST и JSON. Есть причина, по которой многие другие компании и сайты пошли по этому пути. Также имейте в виду, что в будущем вы всегда можете поддержать 2 конечные точки. Если ваш дизайн верен, ваш выбор конечной точки должен быть полностью отделен от вашей бизнес-логики на стороне сервера или базы данных. Поэтому, если вы потом поймете, что вам нужно больше скорости для всех / некоторых запросов, вы сможете добавить protobufs с минимальными усилиями. Однако REST / JSON сразу же приведут вас в чувство быстрее и продвинут вас дальше.
Насколько нетти против весны идет. Я не использовал Netty напрямую, но считаю, что это всего лишь легкий веб-сервер, так как Spring - это фреймворк, который предоставляет вам гораздо больше, чем просто. У него есть уровни доступа к данным, планирование фоновых заданий и (я думаю) модель MVC, так что она намного тяжелее. Какой выбрать? Если вы решили пойти по пути HTTP, то следующий вопрос, вероятно, насколько стандартно ваше приложение? Если вы собираетесь написать какую-то сумасшедшую настраиваемую логику, которая не соответствует стандартной форме, и все, что вам нужно, это просто уровень сервера HTTP, используйте Netty.
Тем не менее, я подозреваю, что ваше приложение не такое уж особенное, и оно может извлечь пользу из множества вещей, которые может предложить Spring. Но это означает, что вы должны структурировать свое приложение на основе среды Spring и делать то, что они ожидают от вас, что будет означать больше узнать о Spring, прежде чем погрузиться в ваш продукт. Фреймворки в целом великолепны, потому что они снова ускоряют процесс, но недостатком является то, что вы должны вписаться в их форму, а не делать свой собственный дизайн, а затем ожидать, что фреймворк просто сработает.
(*) - в прошлом указывалось, что мои посты не отражают мнения всего мира, поэтому я пойду на запись и просто добавлю, что у меня ограниченный опыт работы с любой из Netty (раньше я пользовался платформой Play) который основан на Netty) или Spring (я только читал об этом). Так что возьми то, что я скажу, с крошкой соли.
источник
Это на самом деле не вопрос. Согласно пакету интернет-протоколов tcp - это протокол на транспортном уровне, а http - это протокол на прикладном уровне. Вы сравниваете абсолютно разные вещи друг с другом. (Подробнее здесь: http://en.wikipedia.org/wiki/Internet_protocol_suite )
На самом деле, большинство http более tcp / ip. Итак, чтобы ответить на ваш вопрос, да, вы должны использовать tcp / ip. Затем вы хотите добавить протокол уровня приложения поверх этого (например, http), а затем формат данных (например, json, xml, html). Netty позволяет использовать http, а protobuff равен json, xml, html.
Все зависит от ваших требований и типа данных, которые вам нужно будет перенести. Вам нужны сеансы в вашем протоколе, может ли рукопожатие улучшить конфигурацию протокола, сколько данных вы отправите за раз, вам нужно шифрование? Это вопросы, на которые вы должны ответить при выборе протокола приложения.
Выбор формата представления данных (json, xml, html, protobuff и т. Д.) Зависит от вашей пропускной способности, читабельности, поддержки языка / инструмента и т. Д.
Вы не можете сравнить http с tcp.
Помните, что скорость не все. Скорость бесполезна, если вы не можете выразить себя разумным способом.
источник