Порівняння програм TCP / IP та додатків HTTP [закрито]


13

Мені цікаво розробити масштабний веб-сайт, орієнтований на користувачів, який написаний на Java.

Що стосується дизайну, я думаю про створення незалежних модульних сервісів, які можуть виступати постачальниками даних для мого основного веб-додатку.

Що стосується написання цих модульних служб (постачальників даних), я можу використовувати існуючі рамки, такі як Spring, і розвивати ці служби відповідно до схеми дизайну RESTful, і розкривати ресурси через HTTP у форматі повідомлення типу JSON ... або я можу використовувати існуючу мережу такі рамки, як Netty ( http://netty.io/ ) та формат серіалізації, як протобуфи ( https://developers.google.com/protocol-buffers/docs/overview ) і розробити TCP-сервер, який передає туди і назад серіалізований протобуф корисне навантаження.

Коли слід обирати одне над іншим? Чи буде якась користь від використання формату серіалізації, як протобуфи, та надсилання потоку байтів по дроту? Чи не буде накладних витрат тільки на використання JSON? Скільки накладних витрат між використанням TCP / IP та використанням HTTP? Коли слід використовувати Spring over Netty, і навпаки, щоб створити таку послугу?


Здається, ви більше думаєте про стек технологій, ніж про фактичні вимоги. Як міг хтось із нас, можливо, відповісти на це питання, не знаючи, що це потрібно робити ? Ви створюєте багатокористувацьку гру, яка повинна мати затримку майже до нуля? Або додаток для соціальних закладок, де більша частина доступу вже здійснюється через HTTP, і ви можете кешувати дані години і одночасно навіть не піклуватися про свіжість, не кажучи вже про затримку?
Aaronaught

3
Я не думаю, що ОП просить нас зробити вибір для нього. Він просто задає запитання на високому рівні про те, як робляться такі рішення та які фактори враховуються. Не думайте, що немає нічого поганого в наданні відповіді на високому рівні на це .... і я це зробив.
DXM

Я, як правило, проти використання бінарних форматів, якщо вам це не потрібно. Немає форматів бінарних файлів, немає бінарних серіалізацій тощо. Наприклад, у Java бінарні серіалізації викликають несумісність між версіями Java та версіями власного програмного забезпечення, але я вважаю, що XML майже не так багато. Я думаю, наступний TCP / IP> HTTP> XML Звичайно, це залежатиме від того, що ти робиш. Я думаю, що JSON є альтернативою XML. Я не знаю багато про Spring або Netty, хоча я читаю, що люди використовують Spring.
Kaydell

+1 DXM, я задаю питання високого рівня як їжу для роздумів, коли задумуюся над тим, як прийняти таке рішення.
HiChews123

Відповіді:


21

Однозначно є плюси / мінуси щодо використання JSON через REST проти прямого TCP / IP з бінарним протоколом, і я думаю, ви вже підозрюєте, що бінарний протокол буде швидшим. Я не можу точно сказати, наскільки швидше (і це залежатиме від багатьох факторів), але я б здогадався, можливо, на 1-2 порядки різниці.

На перший погляд, якщо щось у 10-100 разів повільніше, ніж щось інше, у вас може виникнути реакція на коліна та йти на «швидку річ». Однак ця різниця швидкостей є лише в самому протоколі. Якщо на базі сервера є доступ до бази даних / файлів, це не вплине на вибір вашого шару передачі. У деяких випадках це може зробити швидкість вашого шару передачі набагато менш значною.

HTTP REST і JSON корисні з кількох причин:

  • вони легко споживаються практично будь-ким. Ви можете написати веб-додаток, а потім розгорнути та опублікувати свій API для решти країн світу. Тепер кожен може потрапити на ті самі кінцеві точки та дістатися до ваших послуг
  • вони легко налагоджувати, ви можете відкрити sniffer пакетів або просто скинути вхідні запити на текстові файли і подивитися, що відбувається. Ви не можете цього зробити з бінарними протоколами
  • вони легко розширюються. Ви можете додати більше атрибутів і даних згодом і не порушувати сумісність зі старими клієнтами.
  • витратний клієнтами Javascript (не впевнений, що у них ще є протобуф JS-аналізатор, не вірю, що є)

Протобуфи через TCP / IP:

  • вони швидші

Якби це був мій вибір, я б перейшов з HTTP REST та JSON. Існує причина, що так багато інших компаній та веб-сайтів пішли цим шляхом. Також пам’ятайте, що в майбутньому ви завжди можете підтримувати 2 кінцеві точки. Якщо ваш дизайн правильний, вибір кінцевої точки повинен бути повністю відірваний від вашої бізнес-логіки або бази даних. Тож якщо згодом ви зрозумієте, що вам потрібна більша швидкість для всіх / деяких запитів, ви зможете додавати протобуфи з мінімальною суєтою. Однак відразу з битою, REST / JSON швидше зведе вас із землі та відведе вас далі.

Що стосується Нетті проти Весни. Я не використовував Netty безпосередньо, але я вважаю, що це просто легкий веб-сервер, де, як Spring, є основою, яка забезпечує набагато більше для вас, ніж просто це. Він має шари доступу до даних, планування фонових завдань та (я думаю) модель MVC, тому він набагато більш важкий. Який вибрати? Якщо ви вирішили піти HTTP-шлях, то наступне питання, напевно, наскільки стандартним є ваш додаток? Якщо ви збираєтесь написати якусь шалену власну логіку, яка не відповідає стандартній формі, і все, що вам потрібно, - це лише рівень сервера HTTP, перейдіть з Netty.

Однак я підозрюю, що ваша програма не така вже й особлива, і це, ймовірно, може отримати користь від багатьох речей, які може запропонувати Весна. Але це означає, що ви маєте структурувати свій додаток за рамками Spring та робити так, як вони від вас очікують, що означало б дізнатися більше про Весну, перш ніж зануритися у ваш продукт. Рамки в цілому чудові, тому що знову вони швидше збивають вас із землі, але недоліком є ​​те, що вам доведеться вписатись у їх форму, а не робити власний дизайн, а потім очікувати, що рамка просто запрацює.

(*) - в минулому вказувалося, що мої публікації не відображають думки всього світу, тому я продовжую записувати і просто додаю, що у мене обмежений досвід роботи з будь-якою Netty (я раніше використовував Play Framework який базується на Netty) або Spring (я лише про це читав). Тож візьміть, що я кажу, із зерном солі.


1
+1, особливо для "ця різниця в швидкості є лише в самому протоколі. Якщо на сервері є доступ до бази даних / файлів, це не вплине на вибір вашого шару передачі". 99% саме так буде, і передчасна оптимізація (в неправильному місці) взагалі не допоможе в цьому.
Shivan Dragon

Дякуємо за вашу тривалу відповідь та глибокий аналіз порівняння цих двох. Я розумію переваги створення програми RESTful, оскільки вона легко витрачається державними клієнтами. Однак у випадку, коли я хочу все тримати вдома і не хочу виставляти послугу (я дбаю про серіалізацію / десеріалізацію), я не можу зрозуміти, чому б не використання користувацького бінарного протоколу не було першим вибором. Так, ви можете швидше зійти з місця за допомогою існуючих фреймворків, але за рахунок того, щоб замикатися на їх API та менш тонко контролювати.
HiChews123

REST легко споживати ВСІМ клієнтам, не лише публічним, але вони, безумовно, входять. Моя компанія має продукт, який ми будуємо вже близько року. У нас був "власницький" протокол, який трапився на відпочинок. Ми просто відкрили це іншим. Одне, чого вони навчають вас у бізнес-школі, - це "мислення щодо варіантів", прийміть рішення, щоб залишити вам якомога більше варіантів, щоб згодом ви могли приймати рішення. Отже, з огляду на всі встановлені рівні, я б вибрав REST не тому, що у мене сьогодні є JS-клієнти або доступ до API, а щоб мати можливість мати його в майбутньому, якщо мені це потрібно. Тоді знову, якщо ...
DXM

... ви налаштовані на використання двійкового протоколу, перейдіть до цього. 96% шансів на те, що ваш вибір протоколу не вплине на вашу остаточну заявку, тому я не буду надто сильно сприймати це рішення. І як я вже говорив у відповіді, з гідним дизайном ви все одно зможете обмінятись протоколами. Ще одна річ, яку мені подобається робити, - спробувати обидва випадки, якщо я приймаю рішення на огорожі, я перекидаю монету і вибираю варіант А. Наступного разу, коли я роблю подібний проект, я вибираю варіант B просто, щоб потім я міг повернутися назад і порівняти / порівняти мій досвід. Іноді, це єдиний спосіб вирішити для себе, що краще
DXM

@DXM, чудові відгуки, браво!
HiChews123

0

Це фактично не питання. Згідно з Інтернет-протоколом пакет 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.

Пам'ятайте, що швидкість - це не все. Швидкість не приносить користі, якщо ви не можете висловити себе розумним чином.


5
У його питанні немає нічого, що говорить про те, що він не знає різниці між шарами мережевого стеку. Він запитав, чи слід використовувати HTTP (передбачається той факт, що HTTP є шаром вище TCP / IP) або використовувати TCP / IP зі своїм власним спеціальним протоколом. У його питанні немає нічого поганого.
Майкл

Я, звичайно, не згоден. Це не так, як я його зрозумів
iveqy

1
Так, я розумію, що HTTP знаходиться на рівні вище TCP / IP, моє питання справді полягає в тому, щоб думати про прийняття рішення з точки зору компромісів - затримки, швидкості розвитку і т. Д. Дякую за те, що я ставив питання, про які я міркував!
HiChews123

2
@ acspd7 Я б уникнув створення власного протоколу, там уже багато перевірених протоколів, і якщо ваш протокол не є чимось, що дасть вам перевагу перед вашими конкурентами, вам, мабуть, краще зі стандартним протоколлом. Я реалізував спеціальний протокол, це було дуже весело! Однак шифрування, пробивання отворів, збереження живих, рукостискання (різні мережі вимагають різної довжини) та ін. Не кажучи вже про всю необхідну вам документацію. Подумайте, що вам справді потрібно в функціях, перш ніж робити щось на замовлення.
iveqy

1
GPB добре документований, використовується багатьма іншими, тому я не можу реально побачити жодної проблеми з його використанням. Бджілка швидше, ніж XML та JSON, має бути чудовим! (можливо, вам не вистачить людської читабельності, але якщо це не вимога ...). Однак ви не пропускаєте шар? Зазвичай у вас шар між tcp та xml, json, protobuff. Щось на зразок http, ssh тощо.
iveqy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.