การเปรียบเทียบแอปพลิเคชัน TCP / IP กับแอปพลิเคชัน HTTP [ปิด]


13

ฉันสนใจที่จะพัฒนาเว็บไซต์ขนาดใหญ่ที่ผู้ใช้งานเขียนด้วยภาษาจาวา

สำหรับการออกแบบฉันคิดว่าการพัฒนาบริการแบบแยกส่วนอิสระที่สามารถทำหน้าที่เป็นผู้ให้บริการข้อมูลกับเว็บแอปพลิเคชันหลักของฉัน

สำหรับการเขียนบริการแบบแยกส่วน (ผู้ให้บริการข้อมูล) ฉันสามารถใช้ประโยชน์จากเฟรมเวิร์กที่มีอยู่เช่น Spring และพัฒนาบริการเหล่านี้ตามรูปแบบการออกแบบ RESTful และเปิดเผยทรัพยากรผ่าน HTTP ด้วยรูปแบบข้อความเช่น JSON ... หรือฉันสามารถใช้ประโยชน์จากเครือข่ายที่มีอยู่ เฟรมเวิร์กเช่น Netty ( http://netty.io/ ) และรูปแบบการทำให้เป็นอนุกรมเช่น Protobufs ( https://developers.google.com/protocol-buffers/docs/overview ) และพัฒนาเซิร์ฟเวอร์ TCP ที่ส่งกลับมาแบบอนุกรม น้ำหนักบรรทุก

เมื่อใดที่คุณควรเลือกรายการอื่น จะมีประโยชน์ใด ๆ จากการใช้รูปแบบการทำให้เป็นอันดับเช่น Protobufs และการส่งกระแสข้อมูลของไบต์ผ่านสาย จะมีค่าใช้จ่ายในการใช้ JSON หรือไม่ มีค่าใช้จ่ายเท่าไรในการใช้ TCP / IP และ HTTP เมื่อใดที่คุณควรใช้ Spring over Netty และในทางกลับกันเพื่อสร้างบริการดังกล่าว


ดูเหมือนว่าคุณกำลังคิดเกี่ยวกับสแต็คเทคโนโลยีมากกว่าที่คุณต้องการเกี่ยวกับข้อกำหนดที่แท้จริง พวกเราคนใดจะตอบคำถามนี้โดยไม่รู้ว่าคุณต้องทำอะไร คุณกำลังสร้างเกมที่มีผู้เล่นหลายคนที่ควรมีเวลาแฝงใกล้ศูนย์หรือไม่? หรือแอปพลิเคชั่นบุ๊คมาร์คโซเชียลที่การเข้าถึงส่วนใหญ่ผ่าน HTTP อยู่แล้วและคุณอาจแคชข้อมูลเป็นเวลาหลายชั่วโมงและไม่สนใจเรื่องความสดใหม่
Aaronaught

3
ฉันไม่คิดว่า OP ขอให้เราเลือกเขา เขาเพียงแค่ถามคำถามระดับสูงเกี่ยวกับวิธีการเลือกและการพิจารณาปัจจัยต่างๆ อย่าคิดว่ามีอะไรผิดพลาดในการให้คำตอบระดับสูงกับ .... และฉันก็ทำ
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 นั้นดีด้วยเหตุผลหลายประการ:

  • พวกมันบริโภคได้ง่ายโดยใคร ๆ คุณสามารถเขียน Web App ของคุณจากนั้นหมุนและเผยแพร่ API ของคุณเพื่อให้คนทั่วโลกใช้ ตอนนี้ทุกคนสามารถเข้าถึงจุดสิ้นสุดเดียวกันและเข้าถึงบริการของคุณได้
  • พวกเขาสามารถ debuggable ได้ง่ายคุณสามารถเปิดแพ็คเก็ตดมกลิ่นหรือเพียงแค่ถ่ายโอนการร้องขอขาเข้าไปยังไฟล์ข้อความและดูว่าเกิดอะไรขึ้น คุณไม่สามารถทำได้ด้วยโปรโตคอลไบนารี
  • สามารถยืดได้ง่าย คุณสามารถเพิ่มคุณสมบัติและข้อมูลเพิ่มเติมในภายหลังและไม่ทำลายความเข้ากันได้กับไคลเอนต์เก่า
  • บริโภคได้โดยไคลเอนต์ javascript (ไม่แน่ใจว่าพวกเขามีตัวแยกวิเคราะห์ JS protobuf ยังไม่เชื่อว่ามีหนึ่ง)

Protobufs ผ่าน TCP / IP:

  • พวกเขาเร็วกว่า

ถ้ามันเป็นทางเลือกของฉันฉันจะลงมือกับ HTTP REST และ JSON มีเหตุผลที่ บริษัท และเว็บไซต์อื่น ๆ มากมายเดินทางไปในเส้นทางนั้น โปรดทราบว่าในอนาคตคุณสามารถรองรับ 2 จุดสิ้นสุดได้เสมอ หากการออกแบบของคุณถูกต้องตัวเลือกปลายทางของคุณควรแยกออกจากตรรกะทางธุรกิจหรือฐานข้อมูลของคุณ ดังนั้นหากคุณทราบในภายหลังว่าคุณต้องการความเร็วเพิ่มขึ้นสำหรับคำขอทั้งหมด / บางส่วนคุณควรจะเพิ่มโพรโทบูฟด้วยความยุ่งยากน้อยที่สุด ทันทีจากค้างคาว REST / JSON จะพาคุณออกจากพื้นเร็วกว่าและพาคุณไปต่อ

เท่าที่ Netty vs Spring ดำเนินไป ฉันไม่ได้ใช้ Netty โดยตรง แต่ฉันเชื่อว่ามันเป็นเพียงเว็บเซิร์ฟเวอร์ที่มีน้ำหนักเบาเพราะสปริงเป็นกรอบที่ให้คุณมากกว่านั้น มีเลเยอร์การเข้าถึงข้อมูลการจัดตารางงานเบื้องหลังและ (ฉันคิดว่า) โมเดล MVC ดังนั้นจึงมีน้ำหนักมากขึ้น เลือกแบบไหน หากคุณตัดสินใจที่จะใช้วิธี HTTP คำถามต่อไปน่าจะเป็นแอพมาตรฐานของคุณหรือไม่ หากคุณกำลังจะเขียนตรรกะที่กำหนดเองบางอย่างที่ไม่เหมาะกับรามาตรฐานและสิ่งที่คุณต้องการเพียงแค่เลเยอร์เซิร์ฟเวอร์ HTTP ไปกับ Netty

อย่างไรก็ตามฉันสงสัยว่าแอพของคุณนั้นไม่พิเศษและอาจเป็นประโยชน์จากหลาย ๆ สิ่งที่สปริงเสนอให้ แต่นั่นหมายความว่าคุณควรจัดโครงสร้างแอปของคุณให้อยู่ในกรอบของ Spring และทำสิ่งต่างๆตามที่พวกเขาคาดหวังให้คุณทำซึ่งจะหมายถึงการเรียนรู้เพิ่มเติมเกี่ยวกับ Spring ก่อนที่จะดำดิ่งลงสู่ผลิตภัณฑ์ของคุณ กรอบงานทั่วไปนั้นยอดเยี่ยมเพราะพวกเขาช่วยให้คุณออกจากพื้นได้เร็วขึ้น แต่ข้อเสียคือคุณต้องปรับให้เข้ากับรูปแบบของตัวเองแทนที่จะทำการออกแบบของคุณเองและคาดว่ากรอบงานนั้นจะทำงาน

(*) - ในอดีตมันชี้ให้เห็นว่าโพสต์ของฉันไม่ได้สะท้อนความคิดเห็นของคนทั้งโลกดังนั้นฉันจะไปบันทึกและเพียงแค่เพิ่มว่าฉันมีประสบการณ์ จำกัด กับ Netty ทั้งสอง (ฉันเคยใช้กรอบ Play ซึ่งขึ้นอยู่กับ Netty) หรือ Spring (ฉันอ่านแล้วเท่านั้น) ดังนั้นเอาสิ่งที่ฉันพูดด้วยเม็ดเกลือ


1
+1 โดยเฉพาะอย่างยิ่งสำหรับ "ความแตกต่างความเร็วนี้มีเฉพาะในโปรโตคอลตัวเองเท่านั้นหากมีการเข้าถึงฐานข้อมูล / ไฟล์ทางฝั่งเซิร์ฟเวอร์ 99% นั้นเป็นแบบนั้นและการเพิ่มประสิทธิภาพก่อนวัยอันควร (ผิดที่) จะไม่ช่วยอะไรเลย
Shivan Dragon

ขอบคุณสำหรับการตอบสนองที่ยาวนานและการวิเคราะห์เชิงลึกในการเปรียบเทียบทั้งสอง ฉันเข้าใจถึงประโยชน์ของการสร้างแอปพลิเคชัน RESTful เนื่องจากลูกค้าสาธารณะสามารถบริโภคได้อย่างง่ายดาย ในกรณีที่ฉันต้องการเก็บทุกอย่างไว้ในบ้านและไม่ต้องการเปิดเผยบริการ (ฉันดูแล serialization / deserialization) ฉันไม่สามารถเห็นได้ว่าทำไมไม่ใช้ไบนารีโปรโตคอลที่กำหนดเองจะไม่ใช่ตัวเลือกแรก ใช่คุณสามารถลงจากพื้นได้เร็วขึ้นด้วยเฟรมเวิร์กที่มีอยู่ แต่ด้วยค่าใช้จ่ายในการถูกล็อคเข้าสู่ API ของพวกเขาและการควบคุมที่ละเอียดน้อยลง
HiChews123

REST นั้นง่ายต่อการใช้งานโดยลูกค้าทุกคนไม่ใช่เฉพาะกับสาธารณะ แต่รวมอยู่ในนั้นด้วย บริษัท ของฉันมีผลิตภัณฑ์ที่เราได้สร้างมาประมาณปีแล้ว เรามี "กรรมสิทธิ์" โปรโตคอลที่เกิดขึ้นเพื่อพักผ่อน เราเพิ่งเปิดให้ผู้อื่นเห็น สิ่งหนึ่งที่พวกเขาสอนคุณในโรงเรียนธุรกิจคือ "ตัวเลือกการคิด" ตัดสินใจให้คุณเลือกมากที่สุดเท่าที่จะเป็นไปได้เพื่อที่คุณจะสามารถตัดสินใจได้ในภายหลัง ด้วยเหตุที่กำหนดไว้ทุกประการฉันจะเลือก REST ไม่ใช่เพราะฉันมีลูกค้า JS หรือเข้าถึง API วันนี้ แต่ฉันมีตัวเลือกที่จะมีมันในอนาคตหากฉันต้องการ จากนั้นอีกครั้งถ้า ...
DXM

... คุณได้รับการตั้งค่าโดยใช้โปรโตคอลไบนารีไปเลย โอกาส 96% ที่คุณเลือกโปรโตคอลจะไม่มีผลต่อการสมัครครั้งสุดท้ายของคุณดังนั้นฉันจะไม่ตัดสินใจมากเกินไป และอย่างที่ฉันพูดในคำตอบด้วยการออกแบบที่ดีคุณควรจะสามารถสลับโปรโตคอลได้ในภายหลัง อีกสิ่งที่ฉันชอบทำคือลองทั้งสองกรณีถ้าฉันอยู่บนรั้วในการตัดสินใจฉันพลิกเหรียญและเลือกตัวเลือก A. ครั้งต่อไปที่ฉันทำโปรเจ็กต์ที่คล้ายกันฉันเลือกตัวเลือก 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 กับโปรโตคอลที่กำหนดเองของเขาเอง ไม่มีอะไรผิดปกติกับคำถามของเขา
Michael

ฉันไม่เห็นด้วยแน่นอน นั่นไม่ใช่วิธีที่ฉันเข้าใจเขา
iveqy

1
ใช่ฉันเข้าใจว่า HTTP อยู่เหนือเลเยอร์ TCP / IP คำถามของฉันคือการคิดเกี่ยวกับการตัดสินใจในแง่ของการแลกเปลี่ยนความล่าช้าเวลาของการพัฒนา ฯลฯ ขอบคุณสำหรับการวางคำถามให้ฉันคิดถึง!
HiChews123

2
@ acspd7 ฉันจะหลีกเลี่ยงการสร้าง protocoll ของคุณเองมี protocolls ที่พิสูจน์แล้วมากมายและถ้า protocoll ของคุณเป็นสิ่งที่จะให้ความได้เปรียบเหนือคู่แข่งของคุณคุณน่าจะดีกว่า protocoll มาตรฐาน ฉันได้ใช้โปรโตคอลที่กำหนดเองมันสนุกมาก! อย่างไรก็ตามการเข้ารหัส, การเจาะรู, เก็บสิ่งมีชีวิต, การจับมือกัน (เครือข่ายที่แตกต่างกันต้องการความยาวของเฟรมที่แตกต่างกัน) ฯลฯ มันเป็นงานที่ต้องทำหลายอย่างเพื่อทำสิ่งที่ดี ไม่ต้องพูดถึงเอกสารทั้งหมดที่คุณต้องการ คิดถึงสิ่งที่คุณต้องการในฟีเจอร์ก่อนที่จะทำอะไรที่กำหนดเอง
iveqy

1
GPB มีเอกสารที่ดีใช้โดยคนอื่นหลายคนดังนั้นฉันจึงไม่เห็นปัญหาใด ๆ กับการใช้งาน บีบคั้นมากกว่า XML และ JSON น่าจะยอดเยี่ยมมาก! (คุณอาจขาดความสามารถในการอ่านของมนุษย์ แต่ถ้านั่นไม่ใช่ข้อกำหนด ... ) อย่างไรก็ตามคุณไม่ควรพลาดเลเยอร์ โดยปกติคุณจะมีเลเยอร์ระหว่าง tcp และ xml, json, protobuff บางอย่างเช่น http, ssh ฯลฯ
iveqy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.