Membandingkan aplikasi TCP / IP dengan aplikasi HTTP [ditutup]

13

Saya tertarik mengembangkan situs web skala besar yang menghadap pengguna yang ditulis dalam Java.

Sedangkan untuk desain, saya berpikir untuk mengembangkan layanan modular independen yang dapat bertindak sebagai penyedia data untuk aplikasi web utama saya.

Sedangkan untuk menulis layanan modular ini (penyedia data), saya dapat memanfaatkan kerangka kerja yang ada seperti Spring dan mengembangkan layanan ini mengikuti pola desain RESTful, dan mengekspos sumber daya melalui HTTP dengan format pesan seperti JSON ... atau saya dapat memanfaatkan jaringan yang ada kerangka kerja seperti Netty ( http://netty.io/ ) dan format serialisasi seperti Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ) dan kembangkan server TCP yang mengirim bolak-balik protobuf bersambung muatan

Kapan Anda harus memilih satu dari yang lain? Apakah ada manfaat menggunakan format serialisasi seperti Protobufs dan mengirim aliran byte melalui kabel? Apakah akan ada overhead hanya dengan menggunakan JSON? Berapa banyak overhead yang ada antara menggunakan TCP / IP dan menggunakan HTTP? Kapan sebaiknya Anda menggunakan Spring over Netty, dan sebaliknya untuk membangun layanan seperti itu?

HiChews123
sumber
Sepertinya Anda lebih memikirkan tumpukan teknologi daripada persyaratan aktualnya. Bagaimana mungkin ada di antara kita yang dapat menjawab pertanyaan ini tanpa mengetahui apa yang perlu Anda lakukan ? Apakah Anda membuat game multipemain yang seharusnya memiliki latensi mendekati nol? Atau aplikasi bookmark sosial di mana sebagian besar akses sudah melalui HTTP dan Anda mungkin menyimpan data selama berjam-jam dan bahkan tidak peduli tentang kesegaran, apalagi latensi?
Aaronaught
3
Saya tidak berpikir OP meminta kita untuk membuat pilihan untuknya. Dia hanya mengajukan pertanyaan tingkat tinggi tentang bagaimana pilihan seperti itu dibuat dan faktor-faktor apa yang dipertimbangkan. Jangan berpikir ada yang salah dengan memberikan jawaban tingkat tinggi untuk itu .... dan saya lakukan.
DXM
Saya umumnya menentang menggunakan format biner kecuali Anda benar-benar harus melakukannya. Tidak ada format file biner, tidak ada serialisasi biner, dll. Sebagai contoh, di Jawa, serialisasi biner menyebabkan ketidakcocokan antara versi Java dan versi perangkat lunak Anda sendiri, tetapi saya percaya bahwa XML tidak sebanyak itu. Saya akan berpikir TCP / IP berikut> HTTP> XML Tentu saja, itu akan tergantung pada apa yang Anda lakukan. Saya pikir JSON adalah alternatif untuk XML. Saya tidak tahu banyak tentang Spring atau Netty, meskipun saya membaca bahwa orang menggunakan Spring.
Kaydell
+1 DXM, saya mengajukan pertanyaan tingkat tinggi sebagai bahan pertimbangan ketika berpikir untuk membuat keputusan seperti itu.
HiChews123

Jawaban:

21

Pasti ada pro / kontra tentang menggunakan JSON lebih dari REST vs lurus TCP / IP dengan protokol biner dan saya pikir Anda sudah curiga bahwa protokol biner akan lebih cepat. Saya tidak dapat memberi tahu Anda dengan tepat seberapa cepat (dan ini akan tergantung pada banyak faktor), tetapi saya kira mungkin 1-2 urutan perbedaan besarnya.

Pada pandangan pertama jika sesuatu 10-100 kali lebih lambat daripada yang lain, Anda mungkin memiliki reaksi spontan dan pergi untuk "hal yang cepat". Namun, perbedaan kecepatan ini hanya ada di protokol itu sendiri. Jika ada akses database / file di sisi server, itu tidak akan terpengaruh oleh pilihan Anda dari lapisan transfer. Dalam beberapa kasus, ini mungkin membuat kecepatan lapisan transfer Anda jauh kurang signifikan.

HTTP REST dan JSON baik untuk sejumlah alasan:

  • mereka mudah dikonsumsi oleh siapa saja. Anda dapat menulis Aplikasi Web Anda, lalu berbalik dan menerbitkan API Anda untuk digunakan seluruh dunia. Sekarang siapa pun dapat mencapai titik akhir yang sama dan mendapatkan layanan Anda
  • mereka mudah debuggable, Anda dapat membuka sniffer paket atau hanya membuang permintaan masuk ke file teks dan melihat apa yang terjadi. Anda tidak dapat melakukannya dengan protokol biner
  • mereka mudah diperpanjang. Anda dapat menambahkan lebih banyak atribut dan data di lain waktu dan tidak merusak kompatibilitas dengan klien lama.
  • dikonsumsi oleh klien javascript (tidak yakin mereka memiliki parser JS protobuf, jangan percaya ada satu)

Protobuf melalui TCP / IP:

  • mereka lebih cepat

Jika itu pilihan saya, saya akan menggunakan HTTP REST dan JSON. Ada alasan mengapa begitu banyak perusahaan dan situs web lain yang menggunakan rute itu. Juga perlu diingat bahwa di masa depan Anda selalu dapat mendukung 2 poin akhir. Jika desain Anda benar, pilihan titik akhir Anda harus sepenuhnya dipisahkan dari logika bisnis sisi server atau database. Jadi jika Anda kemudian menyadari bahwa Anda membutuhkan lebih banyak kecepatan untuk semua / beberapa permintaan, Anda harus dapat menambahkan protobuf dengan kerepotan minimal. Namun segera, REST / JSON akan membuat Anda turun lebih cepat dan membuat Anda lebih jauh.

Sejauh Netty vs Spring berlangsung. Saya belum pernah menggunakan Netty secara langsung, tetapi saya percaya itu hanya server web yang ringan, di mana Spring adalah kerangka kerja yang menyediakan lebih banyak untuk Anda daripada hanya itu. Ini memiliki lapisan akses data, penjadwalan pekerjaan latar belakang dan (saya pikir) model MVC, sehingga jauh lebih berat. Yang mana yang harus dipilih? Jika Anda memutuskan untuk menggunakan cara HTTP, maka pertanyaan berikutnya mungkin seberapa standar aplikasi Anda? Jika Anda akan menulis beberapa logika kustom gila yang tidak sesuai dengan cetakan standar dan yang Anda butuhkan hanyalah lapisan server HTTP, ikuti Netty.

Namun, saya curiga aplikasi Anda tidak terlalu istimewa dan mungkin dapat mengambil manfaat dari banyak hal yang ditawarkan Spring. Tetapi itu berarti bahwa Anda harus menyusun aplikasi Anda di sekitar kerangka Spring dan melakukan hal-hal seperti yang mereka harapkan Anda lakukan, yang berarti belajar lebih banyak tentang Spring sebelum menyelami produk Anda. Kerangka kerja secara umum bagus karena sekali lagi mereka membuat Anda lebih cepat, tetapi downside adalah bahwa Anda harus masuk ke cetakan mereka daripada melakukan desain Anda sendiri dan kemudian mengharapkan kerangka kerja hanya berfungsi.

(*) - di masa lalu ditunjukkan bahwa posting saya tidak mencerminkan pendapat seluruh dunia, jadi saya akan melanjutkan dan menambahkan bahwa saya memiliki pengalaman yang terbatas dengan Netty (Saya telah menggunakan kerangka bermain sebelumnya yang didasarkan pada Netty) atau Spring (Saya baru saja membacanya). Jadi, ambil apa yang saya katakan dengan sebutir garam.

DXM
sumber
1
+1, terutama untuk "perbedaan kecepatan ini hanya ada di protokol itu sendiri. Jika ada akses basis data / file di sisi server, itu tidak akan terpengaruh oleh pilihan Anda atas lapisan transfer". 99% memang persis seperti itu, dan optimasi prematur (di tempat yang salah) tidak akan membantu sama sekali.
Shivan Dragon
Terima kasih atas tanggapan Anda yang panjang dan analisis mendalam tentang membandingkan keduanya. Saya memahami manfaat membangun aplikasi RESTful karena mudah dikonsumsi oleh klien publik. Namun dalam kasus ini saya ingin menyimpan semuanya di rumah dan tidak ingin mengekspos layanan (saya mengurus serialisasi / deserialisasi), saya tidak bisa melihat mengapa tidak menggunakan protokol biner kustom tidak akan menjadi pilihan pertama. Ya, Anda bisa keluar dari tanah lebih cepat dengan kerangka kerja yang ada, tetapi dengan mengorbankan dikunci ke dalam API dan kontrol yang lebih halus.
HiChews123
REST mudah dikonsumsi oleh SEMUA klien, bukan hanya yang publik, tetapi mereka pasti termasuk. Perusahaan saya memiliki produk yang telah kami bangun selama sekitar satu tahun sekarang. Kami memiliki protokol "eksklusif" yang kebetulan adalah istirahat. Kami baru saja membukanya untuk orang lain. Satu hal yang mereka ajarkan kepada Anda di sekolah bisnis adalah "pilihan berpikir", membuat keputusan untuk meninggalkan Anda sebanyak mungkin pilihan sehingga Anda dapat membuat keputusan di kemudian hari. Jadi mengingat semua set sama, saya akan memilih REST bukan karena saya memiliki klien JS atau akses API hari ini, tetapi bahwa saya memiliki pilihan untuk memilikinya di masa depan jika saya membutuhkannya. Kemudian lagi, jika ...
DXM
... Anda diatur menggunakan protokol biner, lakukanlah. 96% kemungkinan protokol pilihan Anda tidak akan berpengaruh pada aplikasi akhir Anda, jadi saya tidak akan terlalu memusingkan keputusan itu. Dan seperti yang saya katakan dalam jawaban, dengan desain yang layak, Anda harus dapat bertukar protokol di kemudian hari. Hal lain yang saya suka lakukan adalah mencoba kedua kasus, jika saya sedang mengambil keputusan, saya melempar koin dan memilih opsi A. Lain kali saya melakukan proyek serupa saya memilih opsi B supaya saya bisa kembali dan bandingkan / kontraskan pengalaman saya. Terkadang, itulah satu-satunya cara Anda memutuskan untuk diri sendiri mana yang lebih baik
DXM
@DXM, tanggapan luar biasa, bravo!
HiChews123
0

Ini sebenarnya bukan pertanyaan. Menurut suite protokol Internet tcp adalah protokol di lapisan transport dan http adalah protokol di lapisan aplikasi. Anda membandingkan hal-hal yang sangat berbeda satu sama lain. (Lihat lebih lanjut di sini: http://en.wikipedia.org/wiki/Internet_protocol_suite )

Bahkan, sebagian besar http lebih dari tcp / ip. Jadi untuk menjawab pertanyaan Anda, ya Anda harus menggunakan tcp / ip. Kemudian Anda ingin menambahkan protokol lapisan aplikasi di atasnya (seperti http) dan kemudian format data (seperti json, xml, html). Netty membiarkan Anda menggunakan http dan protobuff sama dengan json, xml, html.

Semuanya tergantung pada apa kebutuhan Anda dan jenis data apa yang Anda perlukan untuk transportasi. Apakah Anda memerlukan sesi dalam protocoll Anda, bisakah jabat tangan meningkatkan konfigurasi protokol Anda, berapa banyak data yang akan Anda kirim sekaligus, apakah Anda memerlukan enkripsi? Ini adalah pertanyaan yang perlu Anda jawab ketika memilih protokol aplikasi.

Untuk memilih format representasi data (json, xml, html, protobuff, dll.) Itu tergantung pada bandwidth Anda, keterbacaan, dukungan bahasa / alat dll.

Anda tidak dapat membandingkan http dengan tcp.

Ingat bahwa kecepatan bukanlah segalanya. Kecepatan tidak ada gunanya jika Anda tidak dapat mengekspresikan diri dengan cara yang masuk akal.

iveqy
sumber
5
Tidak ada dalam pertanyaannya yang menunjukkan bahwa dia tidak tahu perbedaan antara lapisan-lapisan tumpukan jaringan. Dia bertanya apakah dia harus menggunakan HTTP (fakta bahwa HTTP adalah lapisan di atas TCP / IP diasumsikan) atau menggunakan TCP / IP dengan protokol kustomnya sendiri. Tidak ada yang salah dengan pertanyaannya.
Michael
Saya tidak setuju tentu saja. Itu bukan cara saya memahaminya
iveqy
1
Ya, saya mengerti bahwa HTTP berada pada lapisan di atas TCP / IP, pertanyaan saya memang tentang berpikir tentang membuat keputusan terkait pengorbanan - latensi, kecepatan pengembangan, dll. Terima kasih telah mengajukan pertanyaan untuk saya pikirkan, meskipun!
HiChews123
2
@ acspd7 Saya akan menghindari membuat protocoll Anda sendiri, ada banyak protocoll yang sudah terbukti di luar sana dan kecuali protocoll Anda adalah sesuatu yang akan memberi Anda keuntungan atas pesaing Anda, Anda mungkin lebih baik dengan protocoll standar. Saya telah menerapkan protocoll khusus, itu sangat menyenangkan! Namun enkripsi, lubang tinju, tetap hidup, berjabat tangan (jaringan yang berbeda membutuhkan panjang bingkai yang berbeda) dll. Itu banyak pekerjaan untuk melakukan hal-hal yang baik. Belum lagi semua dokumentasi yang Anda butuhkan. Pikirkan apa yang benar-benar Anda butuhkan dalam fitur sebelum melakukan sesuatu yang khusus.
iveqy
1
GPB didokumentasikan dengan baik, digunakan oleh banyak orang lain sehingga saya tidak bisa melihat masalah dengan menggunakannya. Harus lebih singkat daripada XML dan JSON seharusnya lebih bagus! (Anda mungkin kurang dalam keterbacaan manusia, tetapi jika itu bukan keharusan ...). Namun, jangan Anda melewatkan satu lapisan pun? Biasanya Anda memiliki lapisan antara tcp dan xml, json, protobuff. Sesuatu seperti http, ssh, dll.
iveqy