SignalR 이란?

  • 최신 ASP.NET에 추가된 라이브러리.

이것을 사용하면 리얼타임, 비동기, 쌍방향 통신(Push나 RPC) 기능을 Web 애플리케이션에 쉽게 사용할 수 있다.

  • NuGet을 통해서 입수할 수 있다. Open Source
  • 클라이언트/서버 간에 영속적 연결. 일반 웹은 비 영속적 연결
  • 트랜스포트를 자동으로 네고에이션.

웹 서버나 클라이언트에서 따라서 WebSocket, Server-Send Events, Forever Frames, Long Polling 사용

  • 하나의 서버 당 수천의 접속을 비동기로 처리한다.
  • 비슷한 기술로 Node.js가 있다.
  • ASP.NET 개발팀의 David Fowler, Damian Edwards가 개인 프로젝트로 시작했다가 정식으로 ASP.NET에 들어갔음.

 

 

Sample

  • ASP.NET SignalR Stock Ticker Sample

http://chackr.azurewebsites.net/SignalR.Sample/StockTicker.html

  • SignalR

ShootR https://github.com/NTaylorMullen/ShootR

 

RPC 통신

  • WebSocket, HTTP 위에서 동작하는 RPC(리모트 프로시져 콜)을 구현.
  • 클라이언트에서 서버에 만들어진 함수를 호출하는 느낌으로 서버측 API를 실행할 수 있다.
  • SignalR은 클라이너트에서 호출 가능한 함수 집합을 Hub라고 부른다.

클라이언트에서는 허브의 프록시 오브젝트를 만들어서 함수를 호출하는 형식이다.

  • 물론 함수의 반환 값도 얻을 수 있다. 다만 통신은 비동기 이므로 반환 값은 JQuery로 만들어진 Deferred 오브젝트를 사용하여 얻는다.

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<script type="text/javascript">

   $(function() {

      var connection = $.hubConnection();

      var sample = connection.createHubProxy("sample");

   

      connection.start(function () {

        sample.invoke("Say", "Hello, world");

      });

   })

</script>

   

<script type="text/javascript">

    $(function() {

        var connection = $.hubConnection();

        var sample = connection.createHubProxy("sample");

   

        connection.start(function () {

            sample.invoke("Say", "Hello, world").done(function(result) {

                alert(result);

            });

        });

    })

</script>

 

]PersistentConnection Hub

  • PersistentConnection Hub 개의 API 있다.
  • PersistentConnection 이름대로 서버와 클라이언트 간의 '지속적인 접속' 제공하면서 클라이언트를 관리하는 기능을 가지고 있다. 통신 기능면에서는 하나의 메시지를 송수신하는 기능 밖에 없는 레벨 API 이다.
  • Hub PersistentConnection 위에 구현된 것으로 레벨 API이다.

클라이언트/서버 간의 함수 호출이라는 기본적인 기능을 제공한다. HubPiprline 이용하여 클라이언트 인증을 구현. 물론 자체 확장도 가능하다.

  • 보통 PersistentConnection 보다 Hub API 사용한다.
  • Hub RPC 사용하기 때문에 PersistentConnection 비교하면 리퀘스트 해석이나 리플렉션을 사용하기 때문에 오버헤드가 크다.
  • 성능을 원한다면 PersistentConnection, 빠른 개발을 원한다면 Hub 사용한다.
    Hub에 정의한 RPC는 비동기로 호출되므로 공유 리소스는 스레드 세이프 하지 않다

Hub

  • 구현

  • Hub 클래스에 구현되어 있는 프로퍼티
    • Context

현재 요청 정보를 유지

  •  
  • Groups

그룹을 관리하는 클래스

  •  
  • Clients

SignalR에서 관리하고 있는 모든 클라이언트를 뜻한다

  •  
  • Caller

리퀘스트를 요청한 클라이언트를 뜻한다.

 

서버와 클라이언트 접속 흐름

  • SignalR 클라이언트 관리

클라이언트 마다 유일한 커넥션 ID 발행 

  • 서버에 준비된 함수를 호출한다

클라이언트는 반환 값을 얻을 있다 

  • 클라이언트에 등록된 함수를 호출한다.

서버는 반환 값을 얻을 없다. 

  • 클라이언트를 그룹화 하여 관리

  • 그룹에 접속을 추가하는 것을 구현

  • 그룹에 함수 호출

 

다양한 클라이언트 지원

  • SignalR JavaScript 이외의 클라이언트에서도 사용할 있다.
  • Windows 8 RT, .NET Framework, iOS, Mac

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

class Program

{

    static void Main(string[] args)

    {

        Start();

    }

   

    private static async void Start()

    {

        var connection = new HubConnection("http://example.com/signalr");

        var sample = connection.CreateHubProxy("sample");

   

        await connection.Start();

   

        var result = await sample.Invoke<string>("Say", "Hello, world");

   

        Console.WriteLine(result);

    }

}

 

 

개발 환경

  • Visual Studio 사용한다.
  • Visual Studio 2012 IIS Express WebSocket 대응.
  • SignalR IIS 아닌 일반 .NET 애플리케이션에서 서버로 사용 가능.
  • 물론 무료용 Visual Studio에서도 개발할 있다.
  • Windows Azure Web 사이트에 배포 가능
  • WebSocket 사용하기 위해서는 Window Server 2012(Windows 8) 이상에서 지원하는 최신 IIS + .NET Framework 4.5 이상을 사용해야 한다.

 

Scale Out

  • 영속적인 연결을 인스턴스 마다 생성
    • 단순하게 수를 늘리는 것만으로 대응할 없다

  • 인스턴스간에 접속을 공유해야 한다
    • 메시징을 이용한다

  • SignalR Scale Out 하기 위한 방법으로 Redis, ServiceBus (Azure), SQL Server 사용한다.

모두 NuGet 통해 입수 있다.

 

Scale Out - Pub/Sub 메시징

  • Windows Azure 서비스 버스
    • 메시지 흐름

 

 

SignalR vs Node.js

  • 기능적으로 비슷하다.
  • Node.js JavaScript 사용하고, SignalR C# Visual Basic.NET 사용.
  • Windows 플랫폼 프로그래머, 한국의 게임 프로그래머에게는 SignalR 사용이 쉬움.
  • JavaScript 알고 있거나 혹은 앞으로 자주 사용한다면 Node.js 좋은 선택이 되지만 그렇지 않다면 (게임 프로그래머의 경우) C# Windows 플랫폼 사용이 훨씬 쉽기 때문에 SignalR 선택하는 것이 좋음.
  • Windows 라이센스 문제는 로직 부분에만 사용하면 문제가 안되고, 특히 클라우드 플랫폼을 사용한다면 크게 문제 되지 않음. Linux 그냥 사용할 있는 쉬운 OS 아님.
  • Node.js npm 통해 풍부한 외부 라이브러리를 사용할 있고, SignalR NuGet 통해 풍부한 외부 라이브러리를 사용할 있다.
  • SignalR Mono 사용하여 Linux에서 사용할 있다.

 

SignalR Node.js 비교표

 

SignalR async/await

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

[HubName("web")]

public class WebHub : Hub

{

    public string GetTitle(string url)

    {

        var client = new WebClient();

   

        var contents = client.DownloadString(url);

   

        var match = Regex.Match(contents, @"<title>(.*)<\/title>");

   

        return match.Success ? match.Groups[1].Value : "";

    }

}

   

   

[HubName("web")]

public class WebHub : Hub

{

    public async Task<string> GetTitle(string url)

    {

        var httpClient = new HttpClient();

   

        var contents = await httpClient.GetStringAsync(url);

   

        var match = Regex.Match(contents, @"<title>(.*)<\/title>");

   

        return match.Success ? match.Groups[1].Value : "";

    }

}

 

SignalR 장점

  • 간단한 클라이언트/서버 API
  • 비동기멀티 스레드로 동작
  • 최신최적의 통신 방법을 자동으로 선택
  • Scale Out 아주 쉬움
  • 클라이언트 그룹 관리 제공
  • 프로그래머는 로직 구현에만 집중할 있다

 

Signal 프로젝트 생성

기타

  • a.html 에서 연결을 b.html 이동하면 연결이 끊어진다.
    • SignalR 하나의 웹페이지에서 관련 작업을 해야 한다.
    • 다만 ASP.NET RAZOR 같은 것을 사용하면 하나의 html 페이지에서 복수의 html 페이지를 포함해서 파일에서 구현하는데 문제 없음

 

\

 

글은

http://www.atmarkit.co.jp/ait/articles/1303/19/news099.html 여기의 자료를 많이 참고했습니다.

 

 

참고

  • SignalR

https://github.com/SignalR/SignalR 
wiki https://github.com/SignalR/SignalR/wiki

  • MSDN

http://msdn.microsoft.com/ko-kr/library/jj943739(v=vs.111).aspx 
http://www.asp.net/signalr

  • Sample

https://github.com/SignalR/Samples

  • SignalR Online Counter Sample

http://www.codeproject.com/Articles/536514/SignalRplusOnlineplusCounterplusSample

  • SignalR - Simple Chat Application in C#

http://www.codeproject.com/Articles/524066/SignalR-Simple-Chat-Application-in-Csharp

  • ASP.NET SignalR 시작하기 (C#)

http://www.taeyo.pe.kr/Columns/View.aspx?SEQ=458&PSEQ=35

신고
by 흥배 2013.12.16 10:16
| 1 |