SignalRのGroup(Room)機能を使ってみる

はじめに

以前Node.jsで開発したプログラムをASP.NET Coreで書き直した際に、SignalRのRoom的な機能について調べたのでまとめておこうと思います。

SignalRのGroup機能

ドキュメントはこちらです。
docs.microsoft.com
Socket.ioではRoomという概念があり、これでチャットルーム的な機能を実現しています。一方のSignalRではGroupで同様の機能を実現しています。
使える機能に差があったりしますが、機能としては概ね同一のものです。

実装

実装はSignalRとSocket.ioでは差異があります。

Join

Socket.io
socket.join('room name');
SignalR
await Groups.AddToGroupAsync(Context.ConnectionId, "room name");

このように、Socket.ioでは「コネクションにRoomを紐付ける」イメージ、SignalRでは「Roomにコネクションを紐付ける」イメージです。
SignalRの通信経路の最小単位はコネクションで、1ユーザーが複数コネクションを持つ場合(アプリの通知のような1ユーザーが複数デバイスを持っており、デバイスごとにコネクションが張られるようなパターン)ではUser()関数を、1グループが複数コネクションを持つ場合(チャットルームのようなパターン)ではAddToGroupAsync()関数、RemoveFromGroupAsync()関数を使ってコネクションの管理を行います。

Broadcast

Roomの参加者全員にデータを送るBroadcastは、以下のコードで実現できます。

Socket.io
socket.broadcast.to('room name').emit('broadcast', data);
SIgnalR
await Clients.Group("room name").SendAsync("broadcast", data);

Socket.ioではコネクションにRoomが紐付いているため、「コネクションの中からRoomを選んでBroadcast」という流れ、SignalRではRoomにコネクションが紐付いているため、「Roomを選んでBroadcast」という流れになっています。
SignalRの方が、少しシンプルですね。

終わりに

SIgnalRのGroup機能はSocket.ioのRoomとコード的に大きな差はなかったので、比較的楽に書き直しができました。
行数的にも特に差はないので、個人的にはSignalRもっと使われると嬉しいなと思います。
あと、私事ですが明日(14日)が誕生日です。
www.amazon.jp