I'm reading an article about the recently released Gizzard sharding framework by twitter (http://engineering.twitter.com/2010/04/introducing-gizzard-framework-for.html). It mentions that all write operations must be idempotent to ensure high reliability.
According to wikipedia, "Idempotent operations are operations that can be applied multiple times without changing the result." But, IMHO, in the Gizzard case, idempotent write operations should be ones in which sequence doesn't matter.
Now, my question is: How to do I make write operations idempotent?
The only thing I can imagine is to have a version number attached to each write. For example, in a blog system, each blog must have a $blog_id and $content. At the application level, we always write blog content like this write($blog_id, $content, $version). The $version is determined to be unique at the application level. So, if an application first tries to set one blog to "Hello world" and second want's it to be "Goodbye", then write is idempotent. We have such two write operations:
write($blog_id, "Hello world", 1);
write($blog_id, "Goodbye", 2);
These two operations are supposed to changed two different records in the DB. So, no matter how many times and what sequence these two operations are executed, the results are the same.
This is just my understanding. Please correct me if I'm wrong.