SignalR Tune-up
- 効率的な通知を目指して Room metro #23
About Me
Name

鈴木孝明
Twitter Account

@xin9le
Award

Microsoft MVP for Visual C#
Blog

http://xin9le.net
Recent interests

Reactive
Extensions

Asterisk

統計/解析

SignalR
業務でSignalR使ってます
CTI (電話応対システム)
某東証一部上場企業のコールセンターを支えるシステム担当
最先端の.NET技術を利用してほぼ一人で実装

主にモニタリングに利用
オペレーターの状態 / 回線の状態 / IVR (音声自動応答) の進捗
応対本数 / 回線の応答率 / タスク管理 (etc...)
CTIシステム概略
ユーザー

IVR

SignalR

モニター

Web API
Webアプリ(外注)

DB

オペレーター
Basis of SignalR
今日必要な部分を簡単に
接続管理

接続ごとに
GUIDの自動割り当て
(ConnectionId)
メソッド呼び出し
メッセージ配信のコスト

Client数:
100

通信頻度:
1回/s

通知先:
全Client

=10000
messages/s

Client数2 × 通信頻度 = 配信メッセージ数
気を付けるべきポイント
通信回数
可能な限り減らし、CPU負荷を軽減

データ転送量
データ量を減らし、回線圧迫の低減と直列化コストの削減
Optimization
メッセージ配信の最適化
配信先を絞る
グループ単位で送信
特定のクライアントに送信
固有情報とIdの紐付け
適切な送信先の選択
Clients.All
Clients.Caller

接続済み全クライアント
呼び出し元のみ

Clients.Others

呼び出し元以外

Clients.Client(id)
Clients.AllExcept(id1, ...)

指定IDのクライアントのみ
指定IDのクライアント以外

Clients.Group(name)

指定のグループのみ
指定IDのクライアントを
除いたグループ全員

Clients.Group(name, id1, ...)
Clients.OthersInGroup(name)

呼び出し元を除いた
グループ全員
適切な送信先の選択 (SignalR 2.0 -)
Clients.Clients(ids)
Clients.Groups(names, id1, ...)

Clients.OthersInGroups(names)
Clients.User(userId)
Clients.Users(userIds)

指定IDのクライアント
指定IDのクライアントを
除いたグループ全員
呼び出し元を除いた
指定のグループ全員
指定のユーザー名
指定のユーザー名
間引く
導入の効果

通信量
削減

CPU負荷
軽減

サーバー / クライアント
両方に効果あり
SignalR ♡ Rx

Buffer

Distinct

Sample

Throttle

http://msdn.microsoft.com/en-us/library/system.reactive.linq.observable_methods.aspx
http://okazuki.hatenablog.com/entry/20120305/1329923070
クライアント側の対策

律儀に全部
送信しない
サーバー側の対策
検討/考慮すべきこと

(総量は減るが)

(意図的な)

遅延が発生

一度に送る
通信量UP

間引きの性質と
システム要件の調整
Other Approaches
まだやれること、あるよね
パイプライン化
通常の配信
UserStatus

Tweet
パイプライン化
そう、Rxならね
速く多く捌く
非同期処理

応答性UP

サーバー側
の修正のみ
Micro-ORMの利用

高速な
DBアクセス

Dapper
オススメ

LINQ to SQL
から乗り換え
(弊社事例)

50倍

最大
高速化

(当社比)

http://www.slideshare.net/kiyokura/adonetormmicro-orm-dapper-dot-net/
メッセージ/メモリの圧縮
Conclusion
これだけは覚えて帰りましょう!
今日のまとめ

配信先を
適切に

可能な限り
間引く

まとめて
配信する

リクエスト
を高速処理
公式サイトも参考に

Tutorial: High-Frequency Realtime with SignalR 2.0
SignalR Performance
SignalR ♡ Rx
ReactiveSignalR
SignalRの少し面倒な記述をRxを使って楽に

https://github.com/xin9le/ReactiveSignalR
Thank you
Enjoy SignalR!!
SignalR
Interactive communication to you.

SignalR Tune-up