Asynchronous data update

Hi,
We are developing an e-commerce site in ROR. We have a table which
stores the prices of our products. To save on repeated database
queries, we read the table and store it in memory.

As the admin can change the prices through the management console we
are facing the problem of updating the in-memory data. We are running
the application on mutiple servers,with multiple instances of mongrels
serving the requests. Thus all the mongrels have their own copy of the
in-memory data.

Now we think there are few issues

  1. We would need to update it on every mongrel.
  2. We don’t want the scene where there are different servers/mongrels
    have different version of the pricing.
  3. We are hoping there is some way where we won’t need to shut down
    the whole site !

We tried to use the SEE-SAW. but i think it doesn’t take the business
of mongrels into account. Thus if one of the mongrels is serving a
long request while it receives the restart request, things go wrong
and the mongrel dies in the end.

We have been discussing this issue and come up with the following
solution.

  1. Copy the prices to the user’s session (which is anyway read every
    time) and use that to create the shopping cart etc.
  2. Update the each of the mongrels through an http request/ web
    service.

This way the user will see only one version of the prices throughout
his transaction.
But this again has some problem. What if a user somehow keeps his
session to be alive for a very long duration ( if he knows the pending
price update.) Even though we don’t keep persistent shopping cart, a
malicious user can, though a script, keep his session alive for days/
weeks or even months and thus use the old prices. We did use this
trick for our online submission of assignments in college :wink:
As a last resort we can check the staleness of session prices in the
last checkout step.

We think this is a common problem and every e-commerce site should be
facing this but can’t seem to find any published solution. We are
hoping some can put some light or point us in the right direction. Any
help would be appreciated

A.K

a.k wrote:

  1. Update the each of the mongrels through an http request/ web
    service.

The above is one of the methods I’ve used. In your case the mongrel
getting the price change update would do a GET of some ‘reload_prices’
action on each handler. You can limit the IP addresses able to call
this action.

Another method I’ve used is Ruby mmap. This allows no-overhead
sharing of a Ruby string between a set of mongrels on a single
server. This only really comes into its own when the changes you
want to propagate are small but frequent.


We develop, watch us RoR, in numbers too big to ignore.