SignalR : 허브와 영구 연결을 선택하는 이유는 무엇입니까?


150

나는 최근 SignalR을 검색하고 읽었으며 허브와 영구 연결의 차이점에 대해 많은 설명을 보았지만 다음 단계에서 내 머리를 얻을 수 없었습니다. 다른 접근 방식 중 하나를 선택 하시겠습니까?

답변:


92

연결 및 허브 섹션 에서 볼 수 있듯이 허브 는 하위 수준의 영구 연결을 오버레이하는 주제 시스템을 제공하는 것으로 보입니다.

아래에서 투표율이 높은 의견에서 :

부분적으로 맞습니다. 지속적인 연결로 주제 나 그룹을 얻을 수도 있습니다. 큰 차이점은 다른 유형의 메시지를 발송하는 것입니다. 예를 들어 다른 종류의 메시지가 있고 다른 종류의 페이로드를 보내려고합니다. 영구 연결을 사용하면 페이로드에 메시지 유형을 포함시켜야하지만 (원시 샘플 참조) 허브를 사용하면 연결을 통해 RPC를 수행 할 수 있습니다 (클라이언트에서 서버와 서버에서 클라이언트로 메소드를 호출 할 수 있도록 함) . 또 다른 큰 것은 모델 바인딩입니다. 허브를 사용하면 강력한 형식의 매개 변수를 메서드에 전달할 수 있습니다.

설명서에 사용 된 예는 사용자가 특정 회의실에 참여한 다음 같은 회의실에있는 다른 사용자의 메시지 만받을 수있는 대화방 은유를 사용합니다. 보다 일반적으로 코드는 주제를 구독 한 다음 해당 주제에 게시 된 메시지 만받습니다. 지속적인 연결로 모든 메시지를 얻을 수 있습니다.

지속적인 연결 위에 자체 토픽 시스템을 쉽게 구축 할 수 있지만,이 경우 SignalR 팀이 이미 작업을 수행했습니다.


180
부분적으로 맞습니다. 지속적인 연결로 주제 나 그룹을 얻을 수도 있습니다. 큰 차이점은 다른 유형의 메시지를 발송하는 것입니다. 예를 들어 다른 종류의 메시지가 있고 다른 종류의 페이로드를 보내려고합니다. 영구 연결을 사용하면 페이로드에 메시지 유형을 포함시켜야하지만 (원시 샘플 참조) 허브를 사용하면 연결을 통해 RPC를 수행 할 수 있습니다 (클라이언트에서 서버와 서버에서 클라이언트로 메소드를 호출 할 수 있도록 함) . 또 다른 큰 것은 모델 바인딩입니다. 허브를 사용하면 강력한 형식의 매개 변수를 메서드에 전달할 수 있습니다.
davidfowl 2012

1
좋은 지적 @ davidfowl-나는 당신의 의견이 더 눈에 띄어 야한다고 생각하여 답변에 복사했습니다.
ColinE

63

가장 큰 차이점은 PersistentConnection으로 RPC를 수행 할 수없고 원시 데이터 만 전송할 수 있다는 것입니다. 따라서 이와 같은 서버에서 메시지를 보내는 대신

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메소드 에서 서버 측에서 동일한 종류의 디스패치를 ​​수행해야합니다 . 허브 메소드와 마찬가지로 강력한 형식의 객체를받는 대신 데이터 문자열을 직렬화 해제해야합니다.

허브를 통한 PersistentConnection을 선택해야하는 이유는 많지 않습니다. 내가 알고있는 한 가지 이유는 PersistentConnection을 통해 사전 직렬화 된 JSON보낼 수 있기 때문에 허브를 사용할 수 없습니다. 특정 상황에서 이는 관련 성능 이점 일 수 있습니다.

그 외에도 문서 에서이 인용문을 참조하십시오 .

커뮤니케이션 모델 선택

대부분의 응용 프로그램은 Hubs API를 사용해야합니다. 다음 상황에서 Connections API를 사용할 수 있습니다.

  • 전송 된 실제 메시지의 형식을 지정해야합니다.

  • 개발자는 원격 호출 모델보다는 메시징 및 디스패치 모델을 사용하는 것을 선호합니다.

  • 메시징 모델을 사용하는 기존 애플리케이션이 SignalR을 사용하도록 포팅되고 있습니다.

메시지 구조에 따라 PersistentConnection을 사용하면 작은 성능 이점을 얻을 수도 있습니다.

여기 에서 SignalR 샘플을 살펴볼 수 있습니다 .


동료 중 한 명이 허브를 통한 PersistentConnection을 선택하는 이유는 보안 이유라고 허브에 보안 문제가 있습니까?
Mehdi Dehghani

24

SignalR을 사용하는 두 가지 방법이 있습니다. PersistentConnection클래스 를 재정 의하여 낮은 수준에서 액세스 할 수 있습니다 . 또는 높은 수준의 '허브'를 사용하여 SignalR이 무거운 작업을 모두 수행하도록 할 수 있습니다.


5

영구 연결은 하위 수준의 API이므로 연결을 열거 나 닫을 때 특정 시간에 작업을 수행 할 수 있습니다. 대부분의 응용 프로그램에서 허브가 최선의 선택입니다


4

이 두 가지를 비교할 때 고려해야 할 세 가지 주요 사항이 있습니다.

  • 메시지 형식
  • 커뮤니케이션 모델
  • SignalR 사용자 정의

허브를 사용하면 메시지 형식이 기본적으로 처리되지만 영구 연결을 사용하면 메시지가 원시이며 토큰 화되고 구문 분석됩니다. 메시지 크기가 중요한 경우 영구 연결의 페이로드는 허브의 페이로드보다 훨씬 적습니다.

통신 모델의 경우 영구 연결에는 기본적으로 메시징을 보내고받는 기능이 있으며 허브 는 요구 사항마다 고유 한 기능을 가진 원격 프로 시저 호출 모델을 사용합니다.

영구 연결이 더 낮은 수준이기 때문에 사용자 지정의 경우 사용자 지정을 더 많이 제어 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.