[Spread-users] Re: [mod_backhand-users] backhand & load balancer
Theo Schlossnagle
jesus at omniti.com
Mon Sep 17 23:42:54 EDT 2001
On Monday, September 17, 2001, at 10:19 PM, Perrin Harkins wrote:
> Sean Chittenden wrote:
>> Check out spread, kicks the snot out of databases:
>
> I mentioned Spread, and my concern about it. It works fine for static
> data, but I'm not confident that it will replicate data fast enough to
> handle updates to data that is accessed by multiple requests in rapid
> succession, i.e. a user changes data on machine A and then wants to use
> it on machine B immediately afterward. There is a potential for
> introducing race conditions which are not there when using sticky
I don't know if I agree. The argument of frames in a web page doesn't
hold. The reason is that you wouldn't have a deterministic action even
if it was handled on one machine. The user can request the frames all
at the same time and chance plays a role on which gets serviced first.
> sessions to keep a user on one machine. Maybe some kind of distributed
> locking mechanism could fix this problem, or maybe Spread is so fast
> that this would only be a concern for sites that have to be very careful
> about data integrity, i.e. banks as opposed to discussion boards.
I think this type of integrity is important whether you are a bank or a
discussion forum.
Distributed locking with Spread is quite easy if you have already
exerted the effort to handle remedial content replication with AGREED
messages. However, if a machine dies or gets "stuck" (app crashes,
etc.) you need to be careful to drop or time out the lock, respectively.
But, I think that locks are unnecessary.
If you design you data store as something more intelligent than simple
put/retrieve, then it is possible to do some cool things. Let's say one
of the operations on your data store (be it session state or something
else) is find element A in the database and decrement it and find and
increment element B. Assume, to keep this interesting, you need to make
this atomic. One option is to acquire a lock and perform both actions
and then release the lock. This is a clean and flexible way to do it.
But, a pain in the ass.
Instead, use a concept like stored procedures and create an "action" on
the data store that take A and B and arguments and performs this
operation. So, only one AGREED message (foo(A,B)) is passed through
Spread and the action happens IN the data store. Locks are not
necessary and the speed will be frightening :-)
This is an excellent approach if you have a firm grasp of the complete
operations you will be performing on your data set and I do not think
that requirement is so silly considering many of today's OLTP systems.
It is like writing a "data store procedure" instead of SQL
transactions. I would wager most would be fairly simply (as SQL is
often overkill for most of these transactions anyway.)
Using this, Spread can pass well over 1000 AGREED messages per second if
they are small (as these would definitely be).
This doesn't tackle network partitions, network merges or fresh arrivals
(joins). That is a slightly more complicated issue :-) Nevertheless it
is an obstacle that can be tackled as well.
--
Theo Schlossnagle
1024D/82844984/95FD 30F1 489E 4613 F22E 491A 7E88 364C 8284 4984
2047R/33131B65/71 F7 95 64 49 76 5D BA 3D 90 B9 9F BE 27 24 E7
More information about the Spread-users
mailing list