Websockets และ SSE (เหตุการณ์ที่ส่งเซิร์ฟเวอร์) มีความสามารถในการส่งข้อมูลไปยังเบราว์เซอร์อย่างไรก็ตามพวกเขาไม่ใช่เทคโนโลยีที่แข่งขันกัน
การเชื่อมต่อ Websockets สามารถส่งข้อมูลไปยังเบราว์เซอร์และรับข้อมูลจากเบราว์เซอร์ ตัวอย่างที่ดีของแอพพลิเคชั่นที่สามารถใช้ websockets คือแอปพลิเคชั่นแชท
การเชื่อมต่อ SSE สามารถส่งข้อมูลไปยังเบราว์เซอร์ได้เท่านั้น ราคาหุ้นออนไลน์หรือ twitters ที่อัปเดตไทม์ไลน์หรือฟีดเป็นตัวอย่างที่ดีของแอปพลิเคชันที่อาจได้รับประโยชน์จาก SSE
ในทางปฏิบัติเนื่องจากทุกสิ่งที่สามารถทำได้ด้วย SSE นั้นสามารถทำได้ด้วย Websockets Websockets ได้รับความสนใจและชื่นชอบเป็นอย่างมากและเบราว์เซอร์จำนวนมากสนับสนุน Websockets มากกว่า SSE
อย่างไรก็ตามมันสามารถ overkill สำหรับแอปพลิเคชันบางประเภทและแบ็กเอนด์อาจจะใช้งานได้ง่ายขึ้นด้วยโปรโตคอลเช่น SSE
นอกจากนี้ SSE ยังสามารถโพลีไฟล์ลงในเบราว์เซอร์รุ่นเก่าที่ไม่รองรับโดยใช้ JavaScript เพียงอย่างเดียว การใช้งานบางส่วนของ polyfills SSE สามารถพบได้บนหน้า Modernizr GitHub
gotchas:
- SSE ได้รับความทุกข์ทรมานจากการ จำกัด จำนวนการเชื่อมต่อแบบเปิดสูงสุดซึ่งอาจเจ็บปวดเป็นพิเศษเมื่อเปิดแท็บต่าง ๆ เนื่องจากขีด จำกัดต่อเบราว์เซอร์และตั้งค่าเป็นจำนวนต่ำมาก (6) ปัญหาที่ได้รับการระบุว่าเป็น "จะไม่แก้ไข" ในChromeและFirefox ขีด จำกัด นี้เป็นต่อเบราว์เซอร์ + โดเมนดังนั้นหมายความว่าคุณสามารถเปิดการเชื่อมต่อ SSE ได้ 6 ครั้งในแท็บทั้งหมดไปยัง
www.example1.com
และอีก 6 การเชื่อมต่อ SSE ไปยังwww.example2.com
(ขอบคุณ Phate)
- เฉพาะ WS เท่านั้นที่สามารถส่งได้ทั้งข้อมูลไบนารีและ UTF-8 SSE นั้น จำกัด ที่ UTF-8 (ขอบคุณ Chado Nihi)
- ไฟร์วอลล์องค์กรบางแห่งที่มีการตรวจสอบแพ็คเก็ตมีปัญหาในการจัดการกับ WebSockets (ไฟร์วอลล์ Sophos XG, WatchGuard, McAfee Web Gateway)
HTML5Rocksมีข้อมูลที่ดีเกี่ยวกับ SSE จากหน้านั้น:
เหตุการณ์ที่เซิร์ฟเวอร์ส่งเทียบกับ WebSockets
เหตุใดคุณจึงเลือกเหตุการณ์ที่เซิร์ฟเวอร์ส่งผ่าน WebSockets คำถามที่ดี.
เหตุผลหนึ่งที่ SSE ถูกเก็บไว้ในเงามืดก็คือเพราะหลังจากนั้น APIs เช่น WebSockets จะมีโปรโตคอลที่สมบูรณ์ยิ่งขึ้นเพื่อทำการสื่อสารแบบสองทาง การมีแชนเนลแบบสองทางน่าสนใจยิ่งขึ้นสำหรับสิ่งต่าง ๆ เช่นเกมแอพส่งข้อความและในกรณีที่คุณต้องการใกล้การอัพเดตตามเวลาจริงทั้งสองทิศทาง อย่างไรก็ตามในบางสถานการณ์ข้อมูลไม่จำเป็นต้องถูกส่งจากลูกค้า คุณเพียงแค่ต้องการอัปเดตจากการกระทำของเซิร์ฟเวอร์ ตัวอย่างเล็ก ๆ น้อย ๆ ก็คือการอัพเดทสถานะของเพื่อนตัวเลือกหุ้นฟีดข่าวหรือกลไกการส่งข้อมูลอัตโนมัติอื่น ๆ (เช่นการอัพเดตฐานข้อมูล Web SQL ฝั่งไคลเอ็นต์หรือที่เก็บอ็อบเจ็กต์ IndexedDB) หากคุณต้องการส่งข้อมูลไปยังเซิร์ฟเวอร์ XMLHttpRequest จะเป็นเพื่อนเสมอ
SSE ถูกส่งผ่าน HTTP ดั้งเดิม นั่นหมายความว่าพวกเขาไม่ต้องการโปรโตคอลพิเศษหรือการติดตั้งเซิร์ฟเวอร์เพื่อให้ทำงานได้ ในขณะที่ WebSockets ต้องการการเชื่อมต่อ full-duplex และเซิร์ฟเวอร์ Web Socket ใหม่เพื่อจัดการโปรโตคอล นอกจากนี้เหตุการณ์ที่เซิร์ฟเวอร์ส่งมีความหลากหลายของคุณสมบัติที่ WebSockets ขาดโดยการออกแบบเช่นการเชื่อมต่อใหม่โดยอัตโนมัติ, ID เหตุการณ์และความสามารถในการส่งเหตุการณ์โดยพลการ
สรุป TLDR:
ข้อดีของ SSE ผ่าน Websockets:
- ส่งผ่าน HTTP อย่างง่ายแทนที่จะเป็นโปรโตคอลที่กำหนดเอง
- สามารถเติมโพลีด้วย javascript เป็น "backport" SSE ไปยังเบราว์เซอร์ที่ยังไม่รองรับ
- สร้างขึ้นเพื่อรองรับการเชื่อมต่อใหม่และรหัสเหตุการณ์
- โปรโตคอลที่เรียบง่าย
- ไม่มีปัญหากับไฟร์วอลล์ขององค์กรที่ทำการตรวจสอบแพ็คเก็ต
ข้อดีของ Websockets ผ่าน SSE:
- เรียลไทม์การสื่อสารสองทิศทาง
- สนับสนุนพื้นเมืองในเบราว์เซอร์เพิ่มเติม
กรณีใช้ในอุดมคติของ SSE:
- สตรีมมิ่งหุ้น
- อัปเดตฟีด Twitter
- การแจ้งเตือนไปยังเบราว์เซอร์
SSE gotchas:
- ไม่มีการสนับสนุนไบนารี
- ขีด จำกัด การเชื่อมต่อเปิดสูงสุด