This is a mobile version, full one is here.
18 May 2014
Atomic Counters at Stateful.co
Amazon DynamoDB is a great NoSQL cloud database. It is cheap, highly reliable and rather powerful. I’m using it in many web systems.
There is one feature that it lacks, though—auto-increment attributes.
Say that you have a table with a list of messages:
+------+----------------------------+ | id | Attributes | +------+----------------------------+ | 205 | author="jeff", text="..." | | 206 | author="bob", text="..." | | 207 | author="alice", text="..." | +------+----------------------------+
Every time you add a new item to the table, a new value
id has to be set. And this has to be done with concurrency in mind.
SQL databases like PostgreSQL, Oracle, MySQL and others support
auto-increment features. When you add a new record to the table,
the value of the primary key is omitted and the server retrieves
the next one automatically. If a number of
arrive at the same time the server guarantees that the numbers won’t be duplicated.
However, DynamoDB doesn’t have this feature. Instead, DynamoDB has Atomic Counters and Conditional Updates, which are very similar features. Still, they’re not exactly the same.
In case of an atomic counter, you should create a supplementary
table and keep the latest value of
id in it.
In case of conditional updates, you should retry a few times in case of collisions.
To make life easier in a few of my applications, I created a simple web service—stateful.co. It provides a simple atomic counter feature through its RESTful API.
First, you create a counter with a unique name. Then,
you set its initial value (it is zero by default). And, that’s it.
Every time you need to obtain a new value for
id column in
DynamoDB table, you make an HTTP request to stateful.co
increment your counter by one and return its next value.
stateful.co guarantees that values returned will never duplicate each other—no matter how many clients are using a counter or how fast they request increments simultaneously.
Moreover, I designed a small Java SDK for stateful.co. All you need to do is add this java-sdk.jar Maven dependency to your project:
<dependency> <groupId>co.stateful</groupId> <artifactId>java-sdk</artifactId> <version>0.6</version> </dependency>
And, you can use stateful.co counters from Java code:
Sttc sttc = new RtSttc( new URN("urn:github:526301"), "9FF3-41E0-73FB-F900" ); Counters counters = sttc.counters(); Counter counter = counters.get("foo"); long value = counter.incrementAndGet(1L); System.out.println("new value: " + value);
You can review authentication parameters for
constructor at stateful.co.
The service is absolutely free of charge.