SignalR: ทำไมต้องเลือก Hub vs. Persistent Connection


150

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

คำตอบ:


92

จากสิ่งที่ฉันเห็นในส่วนการเชื่อมต่อและฮับดูเหมือนว่าฮับจะให้ระบบหัวข้อซ้อนทับการเชื่อมต่อแบบถาวรระดับล่าง

จากความคิดเห็นที่ได้รับการโหวตอย่างสูงด้านล่าง:

ถูกต้องบางส่วน คุณสามารถรับหัวข้อหรือกลุ่มในการเชื่อมต่อแบบถาวรเช่นกัน ความแตกต่างใหญ่คือการกระจายข้อความประเภทต่างๆ ตัวอย่างเช่นคุณมีข้อความประเภทต่างๆและคุณต้องการส่ง payload ประเภทต่างๆ ด้วยการเชื่อมต่อแบบถาวรคุณจะต้องฝังชนิดของข้อความใน payload (ดูตัวอย่าง Raw) แต่ฮับจะช่วยให้คุณสามารถทำ RPC ผ่านการเชื่อมต่อ (ให้คุณเรียกวิธีการบนไคลเอนต์จากเซิร์ฟเวอร์และจากเซิร์ฟเวอร์ไปยังไคลเอนต์) . อีกสิ่งที่ยิ่งใหญ่คือการผูกแบบ ฮับอนุญาตให้คุณส่งพารามิเตอร์ที่พิมพ์อย่างรุนแรงไปยังเมธอด

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

คุณสามารถสร้างระบบหัวข้อของคุณเองได้อย่างง่ายดายที่ด้านบนของการเชื่อมต่อแบบถาวร แต่ในกรณีนี้ทีม SignalR ทำงานให้คุณแล้ว


180
ถูกต้องบางส่วน คุณสามารถรับหัวข้อหรือกลุ่มในการเชื่อมต่อแบบถาวรเช่นกัน ความแตกต่างใหญ่คือการกระจายข้อความประเภทต่างๆ ตัวอย่างเช่นคุณมีข้อความประเภทต่างๆและคุณต้องการส่ง payload ประเภทต่างๆ ด้วยการเชื่อมต่อแบบถาวรคุณจะต้องฝังประเภทข้อความไว้ใน payload (ดูตัวอย่าง Raw) แต่ฮับจะช่วยให้คุณสามารถทำ RPC ผ่านการเชื่อมต่อได้ (ให้คุณเรียกใช้เมธอดบนไคลเอ็นต์จากเซิร์ฟเวอร์และจากเซิร์ฟเวอร์ไปยังไคลเอนต์) . อีกสิ่งที่ยิ่งใหญ่คือการผูกแบบ ฮับอนุญาตให้คุณส่งพารามิเตอร์ที่พิมพ์อย่างรุนแรงไปยังเมธอด
davidfowl

1
Good point @davidfowl - ฉันได้คัดลอกความคิดเห็นของคุณไปยังคำตอบแล้วเนื่องจากฉันคิดว่ามันควรจะโดดเด่นกว่านี้
ColinE

63

ความแตกต่างที่สำคัญคือคุณไม่สามารถทำ RPC ด้วย PersistentConnection คุณสามารถส่งข้อมูลดิบได้เท่านั้น ดังนั้นแทนที่จะส่งข้อความจากเซิร์ฟเวอร์เช่นนี้

Clients.All.addNewMessageToPage(name, message);

คุณจะต้องส่งวัตถุที่มีConnection.Broadcast()หรือConnection.Send()จากนั้นลูกค้าจะต้องตัดสินใจว่าจะทำอย่างไรกับสิ่งนั้น ตัวอย่างเช่นคุณสามารถส่งวัตถุแบบนี้:

Connection.Broadcast(new {
    method: "addNewMessageToPage",
    name: "Albert",
    message: "Hello"
});

และบนไคลเอนต์แทนที่จะกำหนดเพียง

yourHub.client.addNewMessageToPage = function(name, message) { 
    // things and stuff
};

คุณจะต้องเพิ่มการโทรกลับเพื่อจัดการข้อความที่เข้ามาทั้งหมด:

function addNewMessageToPage(name, message) {
    // things and stuff
}

connection.received(function (data) {
    var method = data.method;

    window[method](data.name, data.message);
});

คุณจะต้องทำแบบเดียวกันกับการแจกจ่ายทางฝั่งเซิร์ฟเวอร์ใน OnReceivedวิธีการ นอกจากนี้คุณยังจะต้องทำการ deserialize สายข้อมูลที่นั่นแทนที่จะได้รับวัตถุที่พิมพ์อย่างยิ่งเช่นเดียวกับวิธีการฮับ

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

นอกเหนือจากนั้นดูใบเสนอราคานี้จากเอกสารประกอบ :

การเลือกรูปแบบการสื่อสาร

แอปพลิเคชันส่วนใหญ่ควรใช้ฮับ API Connections API สามารถใช้ได้ในสถานการณ์ต่อไปนี้:

  • รูปแบบของข้อความจริงที่ส่งจะต้องระบุ

  • ผู้พัฒนาต้องการทำงานกับโมเดลการส่งข้อความและการส่งแทนที่จะเป็นโมเดลการเรียกรีโมต

  • แอปพลิเคชันที่มีอยู่ที่ใช้โมเดลการส่งข้อความกำลังได้รับการพอร์ตเพื่อใช้ SignalR

ทั้งนี้ขึ้นอยู่กับโครงสร้างข้อความของคุณคุณอาจได้รับผลประโยชน์เล็ก ๆ น้อย ๆ จากการใช้ PersistentConnection

คุณอาจต้องการดูตัวอย่าง SignalR โดยเฉพาะที่นี่


เพื่อนร่วมงานคนหนึ่งของฉันบอกกับฉันว่าเหตุผลที่เขาเลือก PersistentConnection ผ่านฮับคือเหตุผลด้านความปลอดภัยมีปัญหาความปลอดภัยในฮับหรืออะไรบางอย่างหรือไม่?
Mehdi Dehghani

24

มีสองวิธีในการใช้ SignalR: คุณสามารถเข้าถึงได้ในระดับต่ำโดยการเอาชนะPersistentConnectionคลาสของมันซึ่งทำให้คุณสามารถควบคุมมันได้มาก หรือคุณสามารถปล่อยให้ SignalR ยกของหนักทั้งหมดให้คุณโดยใช้ 'ฮับ' ระดับสูง


5

การเชื่อมต่อแบบต่อเนื่องเป็น API ระดับต่ำกว่าคุณสามารถดำเนินการในเวลาที่เฉพาะเจาะจงมากขึ้นเมื่อเปิดหรือปิดการเชื่อมต่อในแอพพลิเคชั่นส่วนใหญ่ Hub เป็นตัวเลือกที่ดีที่สุด


4

มีสามประเด็นหลักที่ควรพิจารณาเมื่อเปรียบเทียบสองสิ่งนี้:

  • รูปแบบข้อความ
  • รูปแบบการสื่อสาร
  • การปรับแต่ง SignalR

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

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

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

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