Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make write operation idempotent?

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.

like image 443
Morgan Cheng Avatar asked Apr 08 '10 06:04

Morgan Cheng


People also ask

Is a write idempotent operation?

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.

What are idempotent writes?

A writer produces Events that are written into an Event Stream, and under stable conditions, each Event is recorded only once. However, in the case of an operational failure or a brief network outage, an Event Source may need to retry writes.

What is an idempotent operation give an example?

In computing, an idempotent operation is one that has no additional effect if it is called more than once with the same input parameters. For example, removing an item from a set can be considered an idempotent operation on the set. In mathematics, an idempotent operation is one where f(f(x)) = f(x).

How put method is idempotent?

The difference between PUT and POST is that PUT is idempotent: calling it once or several times successively has the same effect (that is no side effect), whereas successive identical POST requests may have additional effects, akin to placing an order several times.


2 Answers

You've got the right idea. Setting a particular value is idempotent, because if you carry out that operation more than once, you have the same result. The classic non-idempotent write is an append, because repetition would lead to multiple copies being appended.

Also, see this previous stackoverflow question.

like image 191
Rob Lachlan Avatar answered Oct 07 '22 16:10

Rob Lachlan


You are absolutely right. Idempotent operations by themselves can provide only one conflict resolution pattern - "Last write wins". It is a possible solution if your writes cannot be reordered in time. If they can, you should provide additional information to make conflict resolution automatic. And your idea is not new. In the general case it is called vector clocks.

We use version based conflict resolution in one of our systems which collect the change history of objects in our system. Clients send the full object state and version information to a history module (asynchronously). The history module then can reorder the object states in the correct manner and save only the delta in persistent storage. The only restriction is that the client should use some sort of concurrency control when making changes to the object (optimistic locking is very good method if you track object state version).

like image 28
Denis Bazhenov Avatar answered Oct 07 '22 15:10

Denis Bazhenov