[cl-prevalence-cvs] CVS update: public_html/CL-PREVALENCE.html public_html/S-SERIALIZATION.html public_html/index.html
Sven Van Caekenberghe
scaekenberghe at common-lisp.net
Mon Jun 21 14:34:01 UTC 2004
Update of /project/cl-prevalence/cvsroot/public_html
In directory common-lisp.net:/tmp/cvs-serv15463
Modified Files:
index.html
Added Files:
CL-PREVALENCE.html S-SERIALIZATION.html
Log Message:
added more info
Date: Mon Jun 21 07:34:01 2004
Author: scaekenberghe
Index: public_html/index.html
diff -u public_html/index.html:1.3 public_html/index.html:1.4
--- public_html/index.html:1.3 Sun Jun 20 13:11:49 2004
+++ public_html/index.html Mon Jun 21 07:34:01 2004
@@ -15,12 +15,61 @@
<p>CL-PREVALENCE is an implementation of <a href="http://www.prevayler.org">Object Prevalence</a> for Common Lisp.</p>
+<p>
+ Object Prevalence is a simple but interesting concept first proposed by Klaus Wuestefeld in 2001. IBM developerWorks has a reasonable <a href="http://www-106.ibm.com/developerworks/library/wa-objprev/">Introduction to Object Prevalence</a> article. The main Java implementation is called <a href="http://www.prevayler.org">Prevayler</a>, with a (chaotic) wiki site with lots of information and discussions. Basically, the idea is this:
+</p>
+<ul>
+ <li>Most databases are only a couple of hundreds of megabytes big, often even less.</li>
+ <li>Most computers can easily take a couple of hundreds of megabytes of data in RAM, big servers can hold many gigabytes.</li>
+ <li>Mapping objects to databases is at least tedious and time consuming, but often also complex and error prone.</li>
+ <li>Let's throw away the database and just consider the domain model objects as the database.</li>
+ <li>Let's make sure we can serialize and deserialize our objects to and from a some presistent medium such as a file system.</li>
+ <li>If we store our complete set of domain model objects to a persistent medium we create a <em>snapshot</em>.</li>
+ <li>We query by using the data structure manipulation functionality of our programming language, running from RAM, queries will be extremely fast.</li>
+ <li>Let's agree to only change our object model using transaction objects that combine the data and the functionality to execute the transaction.</li>
+ <li>In order to preserve the ACID properties of our system, we log each transaction to some persistent medium by serializing it after we execute it. The is called the <em>transaction log</em>.</li>
+ <li>When the system goes down (intentionally or unintentionally) we restore its latest state by first reading in the latest snapshot and by re-executing each transaction from the transaction log.</li>
+ <li>Transactions must be deterministic and re-entrant (so they also need to record the current time if necessary).</li>
+ <li>In a multi-threaded system, transactions are globally serialized.</li>
+</ul>
+<p>
+That is all there is to the concept of object prevalence. Here are some more details as well as some advantages and limitations:
+</p>
+<ul>
+ <li>A good implementation on a modern machine can achieve thousands of transactions per second, and recover them at about the same speed.</li>
+ <li>Transactions must be short because they block the system - since everything is in RAM this is not a problem.</li>
+ <li>Queries that need to see a completely consistent system state must also block on the system - other less critical queries could run in parallel.</li>
+ <li>It is practical for a transaction to first check its preconditions, throw an error if necessary, and to only modify the system when everything is consistent. During a transaction you are the sole active thread. Queries are as fast as they can get. In this implementation transactions are logged after succesful execution.</li>
+ <li>In this implementation there is an option to do a rollback (by doing a system restore) when an unexpected error occurs during transaction execution. You can specifiy that a condition doesn't need a rollback when it occurs inside a transaction by implementing the <tt>initiates-rollback</tt> to return false (or by using the <tt>no-rollback-error</tt> condition or inheriting from it).</li>
+ <li>Long running transactions are an open question.</li>
+ <li>Application server techniques are used to offer multiple clients access to the same prevalence system.</li>
+ <li>We can easily do replication (and query load balancing) by distributing the master transaction log stream to replica's that can host queries, execute backups (snapshots) or serve as hot fail-over. This implementation does not yet contain replication.</li>
+</ul>
+<p>
+ This code was written by Sven Van Caekenberghe.
+</p>
+
<h3>Download</h3>
+
<p>
This project is currently starting up, please use
<a href="http://common-lisp.net/cgi-bin/viewcvs.cgi/?cvsroot=cl-prevalence">CVS</a> access for now, which also offers a tarball.
</p>
+<h3>API</h3>
+
+ <p>
+ You can consult the LispDoc generated API is the files <a href="CL-PREVALENCE.html">CL-PREVALENCE.html</a>
+ and <a href="S-SERIALIZATION.html">S-SERIALIZATION.html</a>.
+ </p>
+
+<h3>Release History</h3>
+
+<ul>
+ <li>release 3, today: move to common-lisp.net, added s-expression based serialization</li>
+ <li>release 2, Januari 13, 2004: added managed-prevalence layer, generic persistent preferences and a blob feature, as well as several useful functions to support development and deployment</li>
+ <li>release 1, June 10, 2003: first public release</li>
+</ul>
<h3>Mailing Lists</h3>
@@ -30,7 +79,7 @@
<li><a href="http://common-lisp.net/mailman/listinfo/cl-prevalence-announce">CL-PREVALENCE-ANNOUNCE mailing list info</a></li>
</ul>
- <p>CVS version $Id: index.html,v 1.3 2004/06/20 20:11:49 scaekenberghe Exp $</p>
+ <p>CVS version $Id: index.html,v 1.4 2004/06/21 14:34:01 scaekenberghe Exp $</p>
<div class="footer">
<p>Back to <a href="http://common-lisp.net/">Common-lisp.net</a>.</p>
More information about the Cl-prevalence-cvs
mailing list