Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I retrieve updated records in real-time? (push notifications?)

I'm trying to create a ruby on rails ecommerce application, where potential customers will be able to place an order and the store owner will be able to receive the order in real-time. The finalized order will be recorded into the database (at the moment SQLite), and the storeowner will have a browser window open, where the new orders will appear just after the order is finalized. (Application info: I'm using the HOBO rails framework, and planning to host the app in Heroku)

I'm now considering the best technology to implement this, as the application is expected to have a lot of users sending in a lot of orders:

1) Each browser window refreshes the page every X minutes, polling the server continuously for new records (new orders). Of course, this puts a heavy load on the server.

2) As above, but poll the server with some kind of AJAX framework.

3) Use some kind of server push technology, like 'comet' asynchronous messaging. Found Juggernaut, only problem is that it is using Flash and custom ports, and this could be a problem as my app should be accessible behind corporate firewalls and NAT.

4) I'm also checking node.js framework, seems to be efficient for this kind of asynchronous messaging, though it is not supported in Heroku.

Which is the most efficient way to implement this kind of functionality? Is there perhaps another method that I have not thought of?

Thank you for your time and help!

like image 535
Alex Avatar asked Sep 01 '10 14:09

Alex


2 Answers

Node.js would probably be a nice fit - it's fast, loves realtime and has great comet support. Only downside is that you are introducing another technology into your solution. It's pretty fun to program in tho and a lot of the libraries have been inspired by rails and sinatra.

I know heroku has been running a node.js beta for a while and people were using it as part of the recent nodeknockout competition. See this blog post. If that's not an option, you could definitely host it elsewhere. If you host it at heroku, you might be able to proxy requests. Otherwise, you could happily run it off a sub domain so you can share cookies.

Also checkout socket.io. It does a great job of choosing the best way to do comet based on the browser's capabilities.

To share data between node and rails, you could share cookies and then store the session data in your database where both applications can get to it. A more involved architecture might involve using Redis to publish messages between them. Or you might be able to get away with passing everything you need in the http requests.

like image 83
bxjx Avatar answered Oct 14 '22 21:10

bxjx


In HTTP, requests can only come from the client. Thus the best options are what you already mentioned (polling and HTTP streaming).

Polling is the easier to implement option; it will use quite a bit of bandwidth though. That's why you should keep the requests and responses as small as possible, so you should definitely use XHR (Ajax) for this.

Your other option is HTTP streaming (Comet); it will require more work on the set up, but you might find it worth the effort. You can give Realtime on Rails a shot. For more information and tips on how to reduce bandwidth usage, see:

http://ajaxpatterns.org/Periodic_Refresh
http://ajaxpatterns.org/HTTP_Streaming

like image 21
NullUserException Avatar answered Oct 14 '22 21:10

NullUserException