Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to scale out signalr to a large number of users

I have read a lot on scaling out in signalr and the favourites seem to be those mentioned in : http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr Namely the following service buses: - SQL - Redis - Azure

The problem is is even stated in the text however: "Using a backplane, the maximum message throughput is lower than it is when clients talk directly to a single server node. That's because the backplane forwards every message to every node, so the backplane can become a bottleneck."

I am creating...wait for it... YEP! A chat application. And I want to be able to scale it out to MILLIONS of users. Regardless of whether I make it big (ha!) or not, I plan on documenting the step by step process. Now I have most of the app ready, and I am wondering about this scale out issue. I watched this, highly useful video:

http://channel9.msdn.com/Events/Build/2013/3-502

Skip to 55 minutes. "Custom scale-out". And the other ideas such as filtering the message bus.

Now hopefully you're excited and not contemplating suicide over the boredom I am ushering unto you... My idea is to do as follows: - per popular rooms give a single server - each room therefore can easily cope with the traffic and signalr can work nicely broadcasting to the clients and storing the message log to a GROUPS server (ie holds all group messaging per group) - Then private messaging will need to either use a backplane or server push - the user connections will therefore need to be updated in a sql server DB (easy enough) and the data posted via ajax rather than signalr

However, I want to explore all options. (Please post any better ideas if you have them) I want to also try testing REDIS for the private messaging. WHY?!! Because what if I want the users to be able to have private messaging groups... and users 1,2 and 3 are all highly annoying and are on servers 1,2 and 3. (Ah you little ...!) For better performance though, I will want to implement a Redis message filter to only send to the servers with the clients on them!

So, what exactly am I looking for? Basically I need resources. I can't find any useful Redis message bus examples (asp.net example has no filter. yes, I can add the AddResolverblabla line! :) )

I also need examples of the following: - server to server ajax post: I am a server noobie! - a load balancer example to specify a certain room per chat room (or just some page) - how many messages can the Redis message bus handle? Will it easily be a bottle neck even with the filter? I cant find any example of performances WITH a filter

Finally I need your brains! ;) If you are sat there thinking there's a better way, please let me know.

Many thanks to all who read this essay, I look forward to your replies. (Please up-vote this if you find it useful! There's a lot of forums with similar questions, but no proper answers)

like image 978
Fred Johnson Avatar asked Mar 13 '14 13:03

Fred Johnson


1 Answers

I plan to start answering this as I find documentation. Hopefully more will join!

1.

How to define a connection string to a SQL Server 2008 database?

2.

SQL Server filter: http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.servicebus.messaging.sqlfilter.aspx

3. web farm

http://weblogs.asp.net/scottgu/archive/2010/09/08/introducing-the-microsoft-web-farm-framework.aspx

4. WF tutorials:

http://www.asp.net/web-forms/tutorials/deployment/configuring-server-environments-for-web-deployment/creating-a-server-farm-with-the-web-farm-framework


3/12/2014 A possible better solution is to use memecache - what facebook is based on


still need to find whether you can specify: use signalr or use redis message bus.

still need to find redis filter tutorials

14/03

GlobalHost.DependencyResolver.UseRedis("server", port, "password", "AppName"); Defines the servers to use redis. Need a filter

6/10/2014

After more research on scaling out, a possibleanswer is to not think of servers as a web of communications, but self-contained. The server uses sends to update the DB and using a timer you can get all the required information (messages etc) each loop from the DB for the users CURRENTLY logged in to that server. As such, it will scale out much easier. Not cheaply however.

like image 114
Fred Johnson Avatar answered Nov 15 '22 19:11

Fred Johnson