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

SignalR Tune-up

Embed Size (px)

DESCRIPTION

2014/03/01 Room metro #23 資料

Citation preview

Page 1: SignalR Tune-up

Room metro #23

SignalR Tune-up- 効率的な通知を目指して -

Page 2: SignalR Tune-up

Name

鈴木孝明

Twitter Account

@xin9le

Award

Microsoft MVP for Visual C#

Blog

http://xin9le.net

About Me

Page 3: SignalR Tune-up
Page 4: SignalR Tune-up
Page 5: SignalR Tune-up

Recent interests

SignalRReactiveExtensions Asterisk 統計/解析

Page 6: SignalR Tune-up

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

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

業務でSignalR使ってます

Page 7: SignalR Tune-up

CTIシステム概略

ユーザー

Webアプリ(外注)

Web API

SignalR

DB

IVR

オペレーター

モニター

Page 8: SignalR Tune-up

今日必要な部分を簡単に

Basis of SignalR

Page 9: SignalR Tune-up

接続管理

接続ごとにGUIDの自動割り当て(ConnectionId)

Page 10: SignalR Tune-up

メソッド呼び出し

Page 11: SignalR Tune-up

メッセージ配信のコスト

=10000messages/s

Client数:100

通信頻度:1回/s

通知先:全Client

Client数2 ×通信頻度 = 配信メッセージ数

Page 12: SignalR Tune-up

通信回数可能な限り減らし、CPU負荷を軽減

データ転送量データ量を減らし、回線圧迫の低減と直列化コストの削減

気を付けるべきポイント

Page 13: SignalR Tune-up

メッセージ配信の最適化

Optimization

Page 14: SignalR Tune-up

配信先を絞る

Page 15: SignalR Tune-up

グループ単位で送信

Page 16: SignalR Tune-up

特定のクライアントに送信

Page 17: SignalR Tune-up

固有情報とIdの紐付け

Page 18: SignalR Tune-up

適切な送信先の選択

Clients.All 接続済み全クライアント

Clients.Caller 呼び出し元のみ

Clients.Others 呼び出し元以外

Clients.Client(id) 指定IDのクライアントのみ

Clients.AllExcept(id1, ...) 指定IDのクライアント以外

Clients.Group(name) 指定のグループのみ

Clients.Group(name, id1, ...)指定IDのクライアントを除いたグループ全員

Clients.OthersInGroup(name)呼び出し元を除いたグループ全員

Page 19: SignalR Tune-up

適切な送信先の選択 (SignalR 2.0 -)

Clients.Clients(ids) 指定IDのクライアント

Clients.Groups(names, id1, ...)指定IDのクライアントを除いたグループ全員

Clients.OthersInGroups(names)呼び出し元を除いた指定のグループ全員

Clients.User(userId) 指定のユーザー名

Clients.Users(userIds) 指定のユーザー名

Page 20: SignalR Tune-up

間引く

Page 21: SignalR Tune-up

導入の効果

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

通信量削減

CPU負荷軽減

Page 22: SignalR Tune-up

SignalR ♡ Rx

ThrottleBuffer Distinct Sample

http://msdn.microsoft.com/en-us/library/system.reactive.linq.observable_methods.aspxhttp://okazuki.hatenablog.com/entry/20120305/1329923070

Page 23: SignalR Tune-up

クライアント側の対策

律儀に全部送信しない

Page 24: SignalR Tune-up

サーバー側の対策

Page 25: SignalR Tune-up

検討/考慮すべきこと

間引きの性質とシステム要件の調整

(意図的な)

遅延が発生

(総量は減るが)

一度に送る通信量UP

Page 26: SignalR Tune-up

まだやれること、あるよね

Other Approaches

Page 27: SignalR Tune-up

パイプライン化

Page 28: SignalR Tune-up

通常の配信

UserStatus

Tweet

Page 29: SignalR Tune-up

パイプライン化

Page 30: SignalR Tune-up

そう、Rxならね

Page 31: SignalR Tune-up

速く多く捌く

Page 32: SignalR Tune-up

非同期処理

応答性UP

サーバー側の修正のみ

Page 33: SignalR Tune-up

Micro-ORMの利用

最大50倍

高速化 (当社比)

高速なDBアクセス

Dapperオススメ

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

http://www.slideshare.net/kiyokura/adonetormmicro-orm-dapper-dot-net/

Page 34: SignalR Tune-up

メッセージ/メモリの圧縮

Page 35: SignalR Tune-up

これだけは覚えて帰りましょう!

Conclusion

Page 36: SignalR Tune-up

今日のまとめ

リクエストを高速処理

配信先を適切に

可能な限り間引く

まとめて配信する

Page 38: SignalR Tune-up

SignalR ♡ Rx

Page 39: SignalR Tune-up

ReactiveSignalRSignalRの少し面倒な記述をRxを使って楽に

https://github.com/xin9le/ReactiveSignalR

Page 40: SignalR Tune-up

Enjoy SignalR!!

Thank you

Page 41: SignalR Tune-up

Interactive communication to you.

SignalR