Amazon DynamoDB | Apache Cassandra |
Disaributed | |
Key/value (+columns) storage | |
DaaS | Open source |
Managed by AWS | Requires DevOps |
Scalability, high availability | |
<300ms response (99.9%) | Fatest writes |
boto, pynamodb | python cassandra driver |
Normalization:
Denormalization:
PutItem:
{
"TableName": "users",
"Item": {
"user_id": {
"N": "123",
},
"username": {
"S": "ryuko",
}
}
}
USE application_namespace;
INSERT INTO users(user_id, username) VALUES (123, 'ryuko');
Provisioned throughput | Price per month | Price per hour |
100 Write Capacity Units | $150 | $0.0128 |
100 Read Capacity Units | $30 | $0.0025 |
Read throughput 1 == one read request with response up to 4KB, per second.
Write throughput 1 == one write request with body size up to 1KB, per second.
Data storage | Price per month per GB |
First 25 GB | $0.000 |
> 25 GB | $0.25 |
Data transfer per month | Price per GB |
First 1 GB | $0.000 |
Up to 10 TB | $0.090 |
Next 40 TB | $0.085 |
... |
DynamoDBLocal:
java -Djava.library.path=./bin/DynamoDBLocal_lib \
-jar ./bin/DynamoDBLocal.jar -port 8010 -inMemory \
# -dbPath ./bin/db.bin
DDB_LOCAL_URL = 'http://localhost:8010'
class DDBUserWalletTestCase(unittest.TestCase):
@mock.patch('app.DDBUserWallet._get_endpoint_url')
def test_update_and_get(self, _get_endpoint_url_mock):
_get_endpoint_url_mock.return_value = DDB_LOCAL_URL
user_wallet = DDBUserWallet()
user_wallet.create_table()
user_id = uuid.uuid4()
for balance in [100, 123]:
user_wallet.update(
user_id=user_id, balance=balance)
self.assertEqual(
user_wallet.get(user_id=user_id)['balance'], balance)
brew / apt-get install cassandra
django-cassandra-engine:
from django_cassandra_engine.test import TestCase
from ..models import CassandraFeed
class ModelsTestCase(TestCase):
def test_cassandra_feed(self):
actor_id = uuid.uuid4()
activity_id = uuid.uuid1()
activity = CassandraFeed(
actor_id=actor_id,
space='my',
activity_id=activity_id,
)
activity.save()
self.assertIn(unicode(activity_id), unicode(activity))
...