views:

142

answers:

3

Hello, 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!

+1  A: 

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

NullUserException
Hello and thanks for your reply.I am thinking that http streaming (comet) is more appropriate for my application, as I expect storeowners to be infront of their browsers during the whole day, waiting for orders. This could create a significant burden on the server if I use polling.So how do I integrate comet servers (like node.js and Ajax Push Engine) with my existing Ruby on Rails app? Does this mean that I should pay for another linux host service (besides heroku), where the comet servers will be installed?What do you think? Thanks!
Alex
A: 

Actually, if you have your storeowner run Chrome (other browsers will follow soon), you can use WebSockets (just for the storeowner's notification though), which allows you to have a constant connection open, and you can send data to the browser without the browser requesting anything.

There are a few websocket libraries for node.js, but i believe you can do it easily yourself using just a regular tcp connection.

Tor Valamo
+1  A: 

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.

bxjx