TCP / IP uygulamalarının HTTP uygulamalarıyla karşılaştırılması [kapalı]


13

Java ile yazılmış, büyük ölçekli, kullanıcılara yönelik bir web sitesi geliştirmekle ilgileniyorum.

Tasarıma gelince, ana web uygulamam için veri sağlayıcısı olabilecek bağımsız, modüler hizmetler geliştirmeyi düşünüyorum.

Bu modüler hizmetleri (veri sağlayıcıları) yazmaya gelince, Spring gibi mevcut bir çerçeveden yararlanabilir ve RESTful tasarım modelini izleyerek bu hizmetleri geliştirebilir ve kaynakları JSON gibi bir mesaj biçimiyle HTTP aracılığıyla gösterebilirim ... veya mevcut bir ağdan yararlanabilirim Netty ( http://netty.io/ ) gibi çerçeve ve Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ) gibi serileştirme biçimi ve serileştirilmiş protobufu ileri geri gönderen bir TCP sunucusu geliştirin yük.

Birini ne zaman diğerinden seçmelisiniz? Protobuflar gibi bir serileştirme formatı kullanmanın ve tel üzerinden bayt akışı göndermenin herhangi bir yararı olur mu? Sadece JSON kullanımında ek yük olur mu? TCP / IP kullanma ile HTTP kullanma arasında ne kadar ek yük var? Ne zaman böyle bir hizmet oluşturmak için Spring Over Netty ve tam tersi kullanmalısınız?


Teknoloji yığını hakkında gerçek gereksinimlerden daha fazla düşündüğünüz anlaşılıyor. Nasıl herhangi birimiz muhtemelen bunu gerektiğini ne olduğunu bilmeden bu soruya cevap do ? Sıfıra yakın gecikme süresi olan çok oyunculu bir oyun mu yaratıyorsunuz? Ya da erişimin çoğunun zaten HTTP yoluyla olduğu ve bir seferde saatlerce veri önbelleğe alabileceğiniz ve gecikme olsa bile tazeliğe önem vermeyeceğiniz bir sosyal yer imi uygulaması mı?
Aaronaught

3
OP'nin bizden bir seçim yapmamızı istediğini sanmıyorum. Bu tür seçimlerin nasıl yapıldığı ve hangi faktörlerin dikkate alındığı hakkında üst düzey bir soru soruyor. Buna üst düzey bir cevap vermenin yanlış bir şey olduğunu düşünmeyin .... ve ben yaptım.
DXM

Gerçekten gerekmedikçe genellikle ikili biçimleri kullanmaya karşıyım. İkili dosya formatı, ikili serileştirme vb. Yoktur. Örneğin, Java'da ikili serileştirmeler, Java sürümleri ve kendi yazılımınızın sürümleri arasında uyumsuzluklara neden olur, ancak XML'in neredeyse o kadar da olmadığına inanıyorum. Bence şu TCP / IP> HTTP> XML Tabii ki, ne yaptığınıza bağlı. JSON'un XML'e bir alternatif olduğunu düşünüyorum. Spring veya Netty hakkında fazla bir şey bilmiyorum, ancak insanların Spring kullandığını okudum.
Kaydell

+1 DXM, böyle bir karar vermeyi düşünürken düşünmek için yiyecek olarak üst düzey sorular soruyorum.
HiChews123

Yanıtlar:


21

Kesinlikle ikili protokol ile TCP / IP vs REST üzerinden JSON kullanma hakkında artıları / eksileri vardır ve zaten ikili protokol daha hızlı olacağından şüpheleniyorum düşünüyorum. Size tam olarak ne kadar daha hızlı olduğunu söyleyemem (ve bu birçok faktöre bağlı olacaktır), ancak tahminim 1-2 büyüklük farkı olabilir.

İlk bakışta bir şey başka bir şeyden 10-100 kat daha yavaşsa, diz sarsıntılı bir reaksiyonunuz olabilir ve "hızlı şey" için gidebilirsiniz. Ancak, bu hız farkı sadece protokolün kendisindedir. Sunucu tarafında veritabanı / dosya erişimi varsa, aktarım katmanı seçiminizden etkilenmez. Bazı durumlarda, aktarım katmanı hızınızı çok daha az önemli hale getirebilir.

HTTP REST ve JSON birçok nedenden dolayı iyidir:

  • hemen hemen herkes tarafından kolayca tüketilebilir. Web Uygulamanızı yazabilir, daha sonra dönüp dünyanın geri kalanı için API'nızı yayınlayabilirsiniz. Artık herkes aynı uç noktalara ulaşabilir ve hizmetlerinize ulaşabilir
  • kolayca hata ayıklanabilir, bir paket dinleyicisi açabilir veya sadece metin dosyalarına gelen istekleri dökebilir ve neler olduğunu görebilirsiniz. Bunu ikili protokollerle yapamazsınız
  • kolayca genişletilebilir. Daha sonra daha fazla özellik ve veri ekleyebilir ve eski istemcilerle uyumluluğu bozamazsınız.
  • javascript istemcileri tarafından sarf edilebilir (henüz protobuf JS ayrıştırıcıya sahip olduklarından emin değil, bir tane olduğuna inanmıyorum)

TCP / IP üzerinden Protobuflar:

  • daha hızlılar

Benim seçimim olsaydı, eller aşağı HTTP REST ve JSON ile gitmek istiyorum. Diğer birçok şirketin ve web sitesinin bu rotaya gitmesinin bir nedeni var. Ayrıca gelecekte 2 uç noktayı her zaman destekleyebileceğinizi unutmayın. Tasarımınız doğruysa, son nokta seçiminizin sunucu tarafı iş mantığınızdan veya veritabanından tamamen ayrılması gerekir. Bu nedenle, daha sonra tüm / bazı istekler için daha fazla hıza ihtiyacınız olduğunu fark ederseniz, minimum yaygara ile protobuflar ekleyebilmeniz gerekir. Ancak hemen REST / JSON sizi daha hızlı yerden indirecek ve daha da ileriye götürecek.

Netty vs Spring'e kadar. Netty'yi doğrudan kullanmadım, ancak Spring'in sizin için bundan çok daha fazlasını sağlayan bir çerçeve olduğu hafif bir web sunucusu olduğuna inanıyorum. Veri erişim katmanları, arka plan iş planlaması ve (bence) bir MVC modeli var, bu yüzden çok daha ağır. Hangisini seçmeli? HTTP yoluna gitmeye karar verdiyseniz, sonraki soru muhtemelen uygulamanızın ne kadar standart olduğudur? Standart kalıba uymayan çılgın bir özel mantık yazmak üzereyseniz ve ihtiyacınız olan tek şey sadece bir HTTP sunucusu katmanı ise, Netty ile gidin.

Ancak, uygulamanın o kadar da özel olmadığını ve muhtemelen Spring'in sunduğu birçok şeyden faydalanabileceğinden şüpheleniyorum. Ancak bu, uygulamanızı Spring'in çerçevesi etrafında yapılandırmanız ve sizden beklediğiniz şekilde yapmanız gerektiği anlamına gelir; bu, ürününüze dalmadan önce Spring hakkında daha fazla bilgi edinmek anlamına gelir. Çerçeveler genel olarak harika çünkü tekrar sizi yerden daha hızlı çıkarıyorlar, ancak dezavantajı kendi tasarımınızı yapmak yerine kalıplarına uymanız ve çerçevenin sadece çalışmasını beklemeniz.

(*) - geçmişte yayınlarımın tüm dünyanın görüşlerini yansıtmadığı belirtildi, bu yüzden kayıtlara gideceğim ve sadece Netty ile sınırlı deneyime sahip olduğumu ekledim (daha önce Play framework'ü kullandım) Netty'ye dayanan) veya Spring (sadece okudum) Öyleyse söylediğimi bir tuz tanesi ile al.


1
+1, özellikle "bu hız farkı yalnızca protokolün kendisindedir. Sunucu tarafında veritabanı / dosya erişimi varsa, bu aktarım katmanı seçiminizden etkilenmez". % 99 tam olarak böyle olacak ve erken optimizasyon (yanlış yerde) buna hiç yardımcı olmayacak.
Shivan Dragon

Uzun yanıtınız ve ikisini karşılaştırmaya yönelik derinlemesine analiziniz için teşekkür ederiz. RESTful bir uygulama oluşturmanın faydalarını anlıyorum çünkü kamu müşterileri tarafından kolayca tüketilebilir. Ancak, her şeyi şirket içinde tutmak ve hizmeti göstermek istemiyorum (serileştirme / serileştirme ile ilgileniyorum), neden özel bir ikili protokol kullanmamanın ilk seçim olmayacağını göremiyorum. Evet, mevcut çerçevelerle daha hızlı bir şekilde inebilirsiniz, ancak API'larına kilitlenme ve daha az hassas kontrol pahasına.
HiChews123

REST'in sadece herkese açık değil, TÜM müşteriler tarafından tüketilmesi kolaydır, ancak kesinlikle dahil edilmiştir. Şirketimin yaklaşık bir yıldır ürettiğimiz bir ürünü var. Dinlenmek için "tescilli" protokol vardı. Sadece başkalarına açtık. İşletme okulunda size öğrettikleri şeylerden biri de "düşünme seçenekleri" olup, daha sonra karar verebilmeniz için olabildiğince çok seçenek bırakma kararları vermektir. Bu yüzden tüm eşit kümesi verildi, ben bugün JS istemcileri veya API erişimi var çünkü değil, ben gelecekte gerekirse sahip olma seçeneği var REST seçmek istiyorum. Sonra tekrar, eğer ...
DXM

... ikili protokolü kullanmaya hazırsınız. % 96 olasılıkla protokol seçiminizin son başvurunuz üzerinde herhangi bir etkisi olmaz, bu yüzden bu kararı çok fazla terletmem. Ve cevabımda söylediğim gibi, iyi bir tasarımla, protokolleri daha sonraki bir tarihte yine de değiştirebilmelisiniz. Yapmayı sevdiğim başka bir şey, her iki durumu da denemektir, eğer karar vermede çitteysem, bir bozuk para çevirir ve A seçeneğini seçerim. ve deneyimlerimi karşılaştırın / karşılaştırın. Bazen, kendiniz için karar vermenin tek yolu daha iyidir
DXM

@DXM, harika yanıtlar, bravo!
HiChews123

0

Bu gerçek bir soru değil. Internet protokol paketine göre tcp, taşıma katmanındaki bir protokol ve http, uygulama katmanındaki bir protokoldür. Tamamen farklı şeyleri birbirleriyle karşılaştırıyorsunuz. (Daha fazlasını buradan görebilirsiniz: http://en.wikipedia.org/wiki/Internet_protocol_suite )

Aslında, çoğu http tcp / ip üzerindedir. Sorunuzu cevaplamak için, evet tcp / ip kullanmalısınız. Daha sonra bunun üzerine bir uygulama katmanı protokolü (http gibi) ve ardından bir veri biçimi (json, xml, html gibi) eklemek istersiniz. Netty http kullanmanıza izin verir ve protobuff json, xml, html'ye eşittir.

Her şey gereksinimlerinizin ne olduğuna ve ne tür verileri taşımanız gerektiğine bağlıdır. Protokolünüzde oturumlara ihtiyacınız var mı, bir el sıkışma protokol yapılandırmanızı geliştirebilir mi, aynı anda ne kadar veri göndereceksiniz, şifrelemeye ihtiyacınız var mı? Bunlar bir uygulama protokolü seçerken cevaplamanız gereken sorulardır.

Bir veri sunum formatı (json, xml, html, protobuff vb.) Seçmek için bant genişliğinize, okunabilirliğinize, dil / araç desteğinize vb. Bağlıdır.

Http ile tcp'yi karşılaştıramazsınız.

Hızın her şey olmadığını unutmayın. Kendinizi mantıklı bir şekilde ifade edemezseniz, hızın bir faydası olmaz.


5
Sorusunda, ağ yığını katmanları arasındaki farkı bilmediğini gösteren hiçbir şey yok. HTTP (HTTP'nin TCP / IP'nin üzerinde bir katman olduğu varsayımı) veya TCP / IP'yi kendi özel protokolüyle mi kullanması gerektiğini sordu. Sorusunda yanlış bir şey yok.
Michael

Tabii katılmıyorum. Onu böyle anlamadım
iveqy

1
Evet, HTTP'nin TCP / IP'nin üstündeki bir katmanda olduğunu anlıyorum, sorum aslında ödünleşmeler - gecikme, gelişme hızı vb. Açısından bir karar vermeyi düşünmektir.
HiChews123

2
@ acspd7 Kendi protokolünüzü oluşturmaktan kaçınırdım, çoktan kanıtlanmış protokoller var ve protokolünüz size rakipleriniz üzerinde bir avantaj sağlayacak bir şey olmadığı sürece, muhtemelen standart bir protokolle daha iyi durumdasınız. Özel bir protokol uyguladım, çok eğlenceliydi! Ancak şifreleme, delme, canlı tutma, el sıkışma (farklı ağlar farklı çerçeveler gerektirir) vb. İşleri iyi yapmak için çok iş vardır. İhtiyacınız olan tüm dokümantasyondan bahsetmiyorum bile. Özel bir şey yapmadan önce özelliklerde gerçekten neye ihtiyacınız olduğunu düşünün.
iveqy

1
GPB iyi belgelenmiştir, diğerleri tarafından kullanılır, bu yüzden onu kullanırken herhangi bir sorun göremiyorum. XML ve JSON'dan daha fazla arı olmak harika olmalı! (insan tarafından okunabilirlikten yoksun olabilirsiniz, ancak bu bir gereklilik değilse ...). Ancak, bir katmanı kaçırmıyor musunuz? Genellikle tcp ve xml, json, protobuff arasında bir katmanınız olur. Http, ssh, vb. Gibi bir şey
iveqy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.