Large number of WebSocket connections
Asked Answered
T

2

7

I am writing an application that keeps track of content pushed around between users of a certain task. I am thinking of using WebSockets to send down new content as they are available to all users who are currently using the app for that given task.

I am writing this on Rails and the client side app is on iOS (probably going to be in Android too). I'm afraid that this WebSocket solution might not scale well. I am after some advice and things to consider while making the decision to go with WebSockets vs. some kind of polling solution.

Would Ruby on Rails servers (like Heroku) support large number of WebSockets open at the same time? Let's say a million connections for argument sake. Any material anyone can provide me of such stuff?

Would it cost a lot more on server hosting if I architect it this way?

Is it even possible to maintain millions of WebSockets simultaneously? I feel like this may not be the best design decision.

This is my first try at a proper Rails API. Any advice is greatly appreciated. Thx.

Tufted answered 15/5, 2012 at 3:57 Comment(1)
According to Heroku, you get (if I remember correctly) ~600 concurrent websocket connections per Dyno. A million concurrent connections (running at the same time, not a general million users) would require ~1670 Dynos... That's a lot of Dynos, but it's also a lot of connections. It's probable you would need to segregate the Redis and DB servers as well (or whatever data collection and Pub/Sub solutions you might have).Bentley
Q
3

Million connections over WebSockets, using Ruby, I can't see its real if you not using clustering to spread connections between different instances to handle all the data processing.
The problem here is serializing and deserializing data.

As well you have to research of how often you will need to pull data to client from server, and if it worth to have just periodical checks using AJAX, then handling connection for whole time. Because if you do handle connection and then you not using it - it is waste of resources. WebSockets are build on top of TCP layer, and all connections are not "cheap" as well going through for OS and asking them for data available again is not the simple process, with millions connections it is something really almost impossible without using most advanced technologies in the world.

I head that Erlang is able to handle millions of connections, but I don't have details over it. As well connection is one thing, another is processing data and interaction between connections - this you might want to check, because if you have heavy processing algorithms, then you definitely need to look into horizontal scaling options over clustering solutions.

Quittance answered 15/5, 2012 at 9:36 Comment(2)
What's your best estimate for the number of connections a single heroku dyno, for example, could handle with em-websocket?Refractor
I haven't worked with heroku nor with em-websocket library.Quittance
K
3
  • If you are implementing chat, use websockets.
  • If you are implementing 1 way messages in realtime use server sent events.
  • If you are implementing 1 way messages sent every few hours or so, use APNS.

The saying goes phone in hand, use websockets / server sent events. Phone in pocket, use APNS.

APNS will alleviate wifi dips, tcp/ip socket hangs and many other issues. Really useful. There is the chance that it may take a little time to get through. But then again, there is the chance that websockets will take

Recent versions of iOS let you send APNS to the client without a popup message to the client so it can ask the server for more information. That along with some backgrounding implementations really improves things.

If possible, do not implement totally anonymous clients. It is very tricky to detect if a client reinstalls the app. So you'll end up sending duplicates to the client. Need to take that into account.

APNS looks trivial to implement in ruby, but I'd suggest avoiding the urge and going to using an existing gem/service out there that supports both google and apple. It is much trickier to implement than it may seem at first.

If you decide to stick with websockets, it may make sense to just leverage websockets in nginx like https://github.com/wandenberg/nginx-push-stream-module

ASIDE: Using SMS where speed is critical is very expensive. $1/month per phone number only sends a max rate of 1 message per second. So sending 100 messages per second = $100/month plus message fees. Do note that 100 messages at a rate of 50 messages/second = $50/month. But if you want to send 1k messages, that takes 20 seconds.

Good luck

Kirtle answered 22/11, 2014 at 3:36 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.