# Asynchronous data update

**URL:** <https://www.ruby-forum.com/t/asynchronous-data-update/120866>\
**Category:** Rails\
**Created:** [November 21, 2007, 8:54am UTC](https://www.ruby-forum.com/t/asynchronous-data-update/120866 "2007-11-21T08:54:11Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![a.k](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e8c25b/32.png) [@a.k](https://www.ruby-forum.com/u/a.k)\
**Post date:** [November 21, 2007, 8:54am UTC](https://www.ruby-forum.com/t/asynchronous-data-update/120866/1 "2007-11-21T08:54:11Z")

</div>

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 😉  
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

---

<div class="post-metadata">

**Author:** ![a.k](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/e8c25b/32.png) [@a.k](https://www.ruby-forum.com/u/a.k)\
**Post date:** [November 22, 2007, 11:21am UTC](https://www.ruby-forum.com/t/asynchronous-data-update/120866/2 "2007-11-22T11:21:57Z")

</div>

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.
