socket.io ห้องหรือ namespacing?


163

ฉันกำลังตรวจสอบ nodejs / socket.io สำหรับการแชทตามเวลาจริงและฉันต้องการคำแนะนำสำหรับการติดตั้งห้อง

สิ่งใดจะดีไปกว่าการใช้เนมสเปซหรือใช้คุณลักษณะของห้องเพื่อแยกส่วนของแชทจากกันอย่างสมบูรณ์

ความแตกต่างทางเทคนิคที่แท้จริงระหว่างห้องและ namespace คืออะไร?

มีความแตกต่างของการใช้ทรัพยากรหรือไม่

คำตอบ:


216

นี่คือสิ่งที่ namespaces และห้องพักมีเหมือนกัน (socket.io v0.9.8 - โปรดทราบว่า v1.0 เกี่ยวข้องกับการเขียนใหม่ทั้งหมดดังนั้นสิ่งต่าง ๆ อาจมีการเปลี่ยนแปลง):

  • ทั้งเนมสเปซ ( io.of ('/ nsp') ) และห้อง ( socket.join ('room') ) ถูกสร้างขึ้นที่ฝั่งเซิร์ฟเวอร์
  • หลายเนมสเปซและหลายห้องแชร์การเชื่อมต่อ (WebSocket) เดียวกัน
  • เซิร์ฟเวอร์จะส่งข้อความผ่านสายไปยังไคลเอนต์ที่เชื่อมต่อกับ / เข้าร่วม nsp / ห้องเท่านั้นนั่นไม่ใช่เพียงแค่การกรองฝั่งไคลเอ็นต์

ความแตกต่าง :

  • เนมสเปซเชื่อมต่อโดยไคลเอนต์ที่ใช้io.connect(urlAndNsp)(ไคลเอ็นต์จะถูกเพิ่มในเนมสเปซนั้นเฉพาะเมื่อมีอยู่บนเซิร์ฟเวอร์แล้ว)
  • ห้องสามารถเข้าร่วมได้ทางฝั่งเซิร์ฟเวอร์เท่านั้น (แม้ว่าการสร้าง API ทางฝั่งเซิร์ฟเวอร์เพื่อให้ลูกค้าสามารถเข้าร่วมได้โดยตรง)
  • เนมสเปซสามารถป้องกันได้
  • การให้สิทธิ์ไม่สามารถใช้ได้กับห้องพักแต่สามารถเพิ่มการอนุญาตที่กำหนดเองใน API ที่สร้างขึ้นและง่ายต่อการสร้างบนเซิร์ฟเวอร์ในกรณีที่มีการโค้งงอในการใช้ห้อง
  • ห้องเป็นส่วนหนึ่งของ namespace (เริ่มต้นที่namespace 'ทั่วโลก')
  • เนมสเปซจะถูกรูทในขอบเขตโกลบอลเสมอ

เพื่อไม่ให้สับสนกับแนวคิดของชื่อ (ห้องหรือเนมสเปซ) ฉันจะใช้ช่องเพื่ออ้างถึงแนวคิดและอีกสองชื่อสำหรับการนำไปใช้ของแนวคิด ดังนั้นหากคุณ

  • ต้องการการอนุญาตต่อช่อง , เนมสเปซอาจเป็นเส้นทางที่ง่ายที่สุดในการรับ
  • ถ้าคุณต้องการช่องแบ่งเป็นลำดับชั้น (สูงสุด 2 เลเยอร์) ให้ใช้เนมสเปซ / ห้องคอมโบ
  • หากแอปฝั่งไคลเอ็นต์ของคุณประกอบด้วยส่วนต่าง ๆ ที่ (ไม่สนใจเกี่ยวกับช่อง แต่) ต้องแยกออกจากกันให้ใช้เนมสเปซ

ตัวอย่างหลังเป็นแอปไคลเอนต์ขนาดใหญ่ที่มีโมดูลที่แตกต่างกันซึ่งอาจพัฒนาแยกกัน (เช่นบุคคลที่สาม) ซึ่งแต่ละคนใช้ socket.io แยกกันใช้ในแอพเดียวกันและต้องการแบ่งปันการเชื่อมต่อเครือข่ายเดียว

ไม่ได้มีการเปรียบเทียบกับสิ่งนี้จริง ๆ ดูเหมือนว่าถ้าคุณต้องการเพียงช่องเรียบง่ายในโครงการของคุณเพื่อแยกและจัดกลุ่มข้อความ

ไม่แน่ใจว่าสิ่งนั้นตอบคำถามของคุณหรือไม่ แต่การวิจัยที่นำไปสู่คำตอบนี้อย่างน้อยก็ช่วยให้ฉันเห็นชัดเจนขึ้น


5
มีอะไรที่สำคัญที่มีการเปลี่ยนแปลงนี้หลังจาก socket.io รุ่น> = 1.0?
Xeroxoid

2
การเปลี่ยนแปลงในเวอร์ชั่นล่าสุดอ่าน socket.io/docs/rooms-and-namespacesและคำตอบนี้จะเป็นประโยชน์ในการทำความเข้าใจกับสิ่งต่างๆในห้อง stackoverflow.com/questions/24041220/…
Gonzalo Bahamondez

1
เราสามารถพูดได้ว่าเนมสเปซเป็นพื้นที่หนึ่งของเว็บแอพของฉันและจัดกลุ่มลูกค้าในพื้นที่นั้น
Onaiggac

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

67

เป็นคำถามเก่า แต่หลังจากทำวิจัยในหัวข้อฉันพบว่าคำตอบที่ยอมรับไม่ชัดเจนในจุดสำคัญ ตาม Guillermo Rauch ตัวเอง ( ดูลิงค์ ): แม้ว่ามันจะเป็นไปได้ในทางทฤษฎีในการสร้างเนมสเปซแบบไดนามิกบนแอพที่กำลังรันอยู่ หากในทางกลับกันคุณจำเป็นต้องสร้างช่องเก็บของแบบเฉพาะกิจเพื่อรองรับกลุ่มผู้ใช้ / การเชื่อมต่อการใช้ห้องเป็นสิ่งที่ดีที่สุด


3
ชอบมัน! Namespaces - การเชื่อมต่อที่กำหนดไว้ล่วงหน้า Rooms - การเชื่อมต่อแบบไดนามิก
Nandakumar

16

มันขึ้นอยู่กับสิ่งที่คุณต้องการทำ

ความแตกต่างที่สำคัญคือห้องพักยากที่จะใช้งาน คุณต้องสร้างวิธีการเข้าร่วมห้องด้วยการโหลดซ้ำแต่ละหน้า

ด้วยเนมสเปซคุณเพียงแค่ต้องเขียน var example = io.connect('http://localhost/example');ในไคลเอนต์จาวาสคริปต์ของคุณและลูกค้าจะถูกเพิ่มโดยอัตโนมัติในเนมสเปซ

ตัวอย่างการใช้ประโยชน์:

  • ห้อง: แชทส่วนตัว
  • namespaces: การแชทของหน้า

2

การสื่อสารในห้องพักและเนมสเปซและซ็อกเก็ตแต่ละกลุ่ม

การออกอากาศไปที่ห้องหรือไปยังเนมสเปซจะไม่เข้าถึงทุกคนได้เฉพาะสมาชิก

ความแตกต่างระหว่างเนมสเปซและห้องพักมีดังต่อไปนี้:

  • เนมสเปซ: ได้รับการจัดการในส่วนหน้าซึ่งหมายถึงผู้ใช้หรือผู้โจมตีเข้าร่วมผ่านส่วนหน้าและมีการจัดการการเข้าร่วมและการยกเลิกการเชื่อมต่อที่นี่
  • Rooms: ได้รับการจัดการในแบ็กเอนด์ซึ่งหมายถึงเซิร์ฟเวอร์กำหนดให้เข้าร่วมและออกจากห้อง

ความแตกต่างเป็นหลักที่จัดการพวกเขา

ในการตัดสินใจว่าจะใช้อะไรคุณต้องตัดสินใจว่าการแบ่งส่วนควรได้รับการจัดการในส่วนหน้าหรือในส่วนหลัง


0

เนมสเปซอนุญาตให้คุณสร้างออบเจ็กต์ที่มีชื่อเดียวกัน แต่จะแยกออกจากกันเนื่องจากจะอยู่ในเนมสเปซที่แตกต่างกัน

นี่เป็นกระบวนการคิดเดียวกับที่คุณควรมีกับ Socket.IO เนมสเปซ หากคุณกำลังสร้างเว็บแอพพลิเคชั่นโหนดแบบโมดูลาร์คุณจะต้องกำหนดชื่อให้กับโมดูลต่างๆ หากคุณมองไปที่รหัสเนมสเปซของเราคุณจะเห็นว่าเราสามารถฟังเหตุการณ์ที่แน่นอนเดียวกันในเนมสเปซต่างๆ ใน Socket.IO เหตุการณ์การเชื่อมต่อในการเชื่อมต่อเริ่มต้นและเหตุการณ์การเชื่อมต่อใน namespace / xxx จะแตกต่างกัน ตัวอย่างเช่นหากคุณมีระบบแชทและแสดงความคิดเห็นในเว็บไซต์ของคุณและต้องการให้ทั้งคู่เป็นแบบเรียลไทม์คุณสามารถกำหนดเนมสเปซแต่ละรายการได้ สิ่งนี้ช่วยให้คุณสร้างแอปพลิเคชั่น Socket.IO ทั้งหมดที่ใช้งานได้เฉพาะในบริบทของตัวเอง

สิ่งนี้จะเป็นจริงเช่นกันหากคุณกำลังสร้างบางสิ่งที่จะทำแพ็กเกจและติดตั้ง คุณไม่สามารถรู้ได้ว่ามีใครบางคนกำลังใช้งานเหตุการณ์บางอย่างในเนมสเปซเริ่มต้นดังนั้นคุณควรสร้างของคุณเองและฟังที่นั่น สิ่งนี้จะช่วยให้คุณไม่เหยียบนิ้วเท้าของผู้พัฒนาที่ใช้แพ็คเกจของคุณ

เนมสเปซช่วยให้เราสามารถเชื่อมต่อกับบริบทต่างๆ เราสามารถเปรียบเทียบสิ่งนี้กับห้องซึ่งอนุญาตให้เราจัดกลุ่มการเชื่อมต่อเข้าด้วยกันจากนั้นเราสามารถเชื่อมต่อแบบเดียวกันเข้าร่วมห้องอื่นได้เช่นกัน

เนมสเปซให้คุณสร้างบริบทที่แตกต่างกันเพื่อให้ Socket.IO ทำงานได้ห้องอนุญาตให้คุณจัดกลุ่มการเชื่อมต่อไคลเอนต์ภายในบริบทเหล่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.